是否有任何智能解决方案可以从父级__construct获得被调用的方法?
示例:
call_user_func_array([$childrenController, $indexMethod], array());
我想知道$ indexMethod被调用了,但是我尝试在$ parentController __construct中获取此信息。
我知道我可以通过
获得类名。get_called_class()
或通过ReflectionClass,但是被调用的方法有解决方案吗?
已经尝试过
debug_backtrace()
但是我只能获得有关另一个方向的任何信息。
编辑:
任何人都在致电我的网站: https://example.com/index/firstaction
然后路由器正在搜索控制器:indexcontroller和方法:firstaction。
indexcontroller扩展了ParentController类。
现在我想在indexcontroller的父对象(ParentController)中获取被调用方法(firstaction)的名称
class ParentController {
public function __construct()
{
}
答案 0 :(得分:2)
我能想到的唯一方法(不是正确的OOP主体)
class ParentController {
protected $something;
public function __construct()
{
///check if child sets this
echo $this->something ? "set\n" : "notset\n";
}
}
//---------------------
class ChildController0 extends ParentController{
public function __construct()
{
parent::__construct();
}
}
//---------------------
class ChildController1 extends ParentController {
public function __construct()
{
$this->indexMethod();
parent::__construct();
}
public function indexMethod(){
$this->something = 1;
}
}
new ChildController0();
new ChildController1();
输出
notset
set
我在这里指出从何处调用这些并不重要。基本上,您只需要设置一些父级共享的属性,以保持对该类的调用状态。
此呼叫还有另一个明显的问题
call_user_func_array([$childrenController, $indexMethod], array());
您从$childrenController
处获得此信息。我假设您只会在孩子的构造函数中使用parent::__construct()
。如果真是这样,那么您将没有时间call_user_func_array
及其实例(除非从子代的构造函数中获取),因为您没有让该实例(在类外部)使用tell运行施工后完成。例如
$childrenController = new ChildController0();
//__construction is finished at this point.
call_user_func_array([$childrenController, $indexMethod], array());
基本上,您必须在构造结束之前调用public function indexMethod
,以便以常规方式(在子构造中称为)使用parent::__construct
来访问它。因此,您可以在孩子的构造函数中拥有一个非常小的窗口。
表示其他方法不是这种情况,construct是一个特例。也许您可以采取静态措施来解决该问题...等等。我不知道。
最后一个笔记
从OOP主体角度来看,这可能是错误的,因为现在Parent类对子类之一具有隐藏的依赖关系。我确定它违反了S.O.L.I.D-
想要通过传递文件夹名(称为类)和文件名(称为方法)来动态地告诉模板的目录。所以我认为最好的解决方案是在任何控制器继承的ParentController中做到这一点
为什么不只是将它通过孩子传递给父母:
class ParentController {
protected $foo;
public function __construct($foo)
{
$this->setFoo($foo);
}
public function getFoo(){ return $this->foo; }
public function setFoo($foo){ $this->foo = $foo; }
}
现在您可以将foo设置为您的内心满足感了。
class ChildController0 extends ParentController{
//some piece of data only for child
protected $bar;
public function __construct($foo, $bar)
{
parent::__construct($foo);
$this->bar = $bar;
}
}
$child = new ChildController0('foo'); //this->foo is 'foo'
$child->setFoo('bar'); //now its bar
如果您只想在父类中注册一条信息,我认为您不需要任何特殊的技巧。尤其是在编写该类时,只需像添加任何旧属性一样添加它即可。
干杯!