0

我正在尝试编写驱动程序,并且某些方法由子类共享。我想在父类中实现这些方法。

我在这里读到过,每个设置为 public/protected 的属性或功能都可以被子类访问。

所以,在Driver_name我设置method_one为受保护的父类中,当我尝试通过Driver_name_subclass_one错误日志访问它时显示“没有这样的方法'method_one'”。

我究竟做错了什么?

4

2 回答 2

3

您必须公开该方法。驱动程序不使用标准的类继承,例如class Cache_dummy extends Cache,这是您习惯它的工作方式并且可能期望的方式。相反,它使用反射从父级中查找公共方法,并通过使用魔术方法将它们提供给各个驱动程序__call()

这是在 CI 中如何完成的片段,位于第 136 行附近system/libraries/Driver.php的类中:CI_Driver

$r = new ReflectionObject($parent);

foreach ($r->getMethods() as $method)
{
    if ($method->isPublic())
    {
        $this->methods[] = $method->getName();
    }
}

父级的属性也是如此,例如$CI- 将它们公开,否则它们不能被子驱动程序“继承”。

于 2013-04-20T00:09:00.017 回答
0

你好,很抱歉我迟到的回答。
你试过用这个:
$this->_parent->method_one();

如果您想访问父方法甚至兄弟方法,这很有用。检查以下示例:

class Driver_name extends CI_Driver_library
{
    public $ci;
    public $valid_drivers;

    public function __construct()
    {
        $this->ci =& get_instance();
        $this->valid_drivers = array('child_one', 'child_two');
    }

    public function parent_method() {}
}

我们有两个孩子:

// Child one
class Driver_name_child_one extends CI_Driver
{
    public function method_of_child_one() {}
}

// Child two
class Driver_name_child_two extends CI_Driver
{
    public function method_of_child_two() {}
}

很明显,如果你要从 parent 访问 child 的方法,你只需要这样做:

$this->child_one->method_of_child_one();
$this->child_two->method_of_child_two();

要从孩子访问父方法,该方法需要是public,并且有两种访问方式:

// Option 1
$this->parent_method();

// Option 2
$this->_parent->parent_method();

如果你想访问兄弟方法,你必须_parent像这样使用属性:

// Child_one access Child_two method (inside Driver_name_child_one.php).
$this->_parent->child_two->method_of_child_two();

// Child two access Child_one method (inside Driver_name_child_two.php).
$this->_parent->child_one->method_of_child_one();
于 2018-01-19T11:12:39.127 回答