我正在尝试编写驱动程序,并且某些方法由子类共享。我想在父类中实现这些方法。
我在这里读到过,每个设置为 public/protected 的属性或功能都可以被子类访问。
所以,在Driver_name
我设置method_one
为受保护的父类中,当我尝试通过Driver_name_subclass_one
错误日志访问它时显示“没有这样的方法'method_one'”。
我究竟做错了什么?
我正在尝试编写驱动程序,并且某些方法由子类共享。我想在父类中实现这些方法。
我在这里读到过,每个设置为 public/protected 的属性或功能都可以被子类访问。
所以,在Driver_name
我设置method_one
为受保护的父类中,当我尝试通过Driver_name_subclass_one
错误日志访问它时显示“没有这样的方法'method_one'”。
我究竟做错了什么?
您必须公开该方法。驱动程序不使用标准的类继承,例如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
- 将它们公开,否则它们不能被子驱动程序“继承”。
你好,很抱歉我迟到的回答。
你试过用这个:
$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();