我正在尝试编写驱动程序,并且子类共享一些方法。我想在父类中实现这些方法。
我已经阅读here,儿童班可以访问公开/受保护的每个礼仪或职能。
因此,在父类Driver_name
中,我将method_one
设置为受保护,当我尝试通过Driver_name_subclass_one
访问它时,错误日志显示“没有这样的方法'method_one'”。< / p>
我做错了什么?
答案 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();