从父__construct获取被调用的函数

问题描述 投票:1回答:1

是否有任何智能解决方案从父母__construct获取被调用的方法?

例:

call_user_func_array([$childrenController, $indexMethod], array());

我想知道$ index方法已被调用,但我在$ parent Controller __construct中尝试获取此信息。

我知道我可以获得类名

get_called_class()

或者通过ReflectionClass,但是有没有针对被调用方法的解决方案?

已经尝试过了

debug_backtrace()

但我只能获得有关其他方向的任何信息。

编辑:

任何人都在打电话给我的网站:https://example.com/index/firstaction

然后路由器正在搜索控制器:indexcontroller和方法:firstaction。

indexcontroller扩展了ParentController类。

现在我想在indexcontroller的父(ParentController)中获取被调用方法(firstaction)的名称

class ParentController {

public function __construct() 
{
}
php methods get parent construct
1个回答
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中访问它,如果以典型的方式使用(在子构造中调用)。所以你有一个非常小的窗口,你可以在孩子的构造函数中做到这一点。

那说不是其他方法的情况,构造是一个特例。也许你可以做静电来解决这个问题...等我不知道。

最后一点

从OOP主要观点来看,这可能是错误的,因为现在Parent类对其中一个子类具有隐藏的依赖性。我确信它违反了S.O.L.I.D -

想通过传递foldername(称为类)和文件名(称为方法)来动态地告诉smarty模板的目录。所以我认为最好的解决方案是在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

如果您只是想在父类中注册一条信息,我认为您不需要任何特殊的琐事。特别是当你写这个类时,只需像任何旧属性一样添加它。

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.