Codeigniter驱动程序:无法从子类访问父方法

时间:2013-04-19 11:48:00

标签: codeigniter

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

我已经阅读here,儿童班可以访问公开/受保护的每个礼仪或职能。

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

我做错了什么?

2 个答案:

答案 0 :(得分:3)

您必须将方法保持公开。驱动程序不使用标准类继承,例如class Cache_dummy extends Cache,这是你习惯它的工作方式和可能的预期。相反,它使用Reflection从父级查找公共方法,并通过使用魔术方法__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 - 将它们公开或者不能被子驱动程序“继承”。

答案 1 :(得分: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() {}
}

很明显,如果你从父母那里访问一个孩子的方法,你只需要这样做:

$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();
相关问题