从父级__construct获取调用的函数

时间:2019-04-08 21:41:15

标签: php methods get parent construct

是否有任何智能解决方案可以从父级__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() 
{
}

1 个答案:

答案 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

如果您只想在父类中注册一条信息,我认为您不需要任何特殊的技巧。尤其是在编写该类时,只需像添加任何旧属性一样添加它即可。

干杯!