访问传递给子方法的参数

Access the arguments passed to child method

我有以下内容:

class bar {

    function __construct(){

         // set $a_from_fire to $a from fire() method arg
         // set $b_from_fire to $b from fire() method arg
    }
}

class foo extends bar {

    function fire ($a, $b){

    }
}

我需要使用 foo->fire()

中的参数设置 $a_from_fire 和 $b_from_fire

所以如果我这样做:

$test = new foo;
$test->fire(1, 2);

将设置这些变量:

$a_from_fire == 1; // true
$b_from_fire == 2; // true

这是不可能的,因为 __construct() 在第一次实例化对象时被调用,所以 fire($a, $b) 将始终 运行 after __construct()

如果您只想在调用 fire() 时设置变量,只需执行以下操作:

class bar {
    protected $a_from_fire;
    protected $b_from_fire;
}

class foo extends bar {
    public function fire($a, $b) {
        $this->a_from_fire = $a;
        $this->b_from_fire = $b;
    }
}

我认为您无法以任何 "correct" 方式做到这一点。我的第一个想法是使用 __call,但那当然只是针对未定义的函数调用。

并且没有任何方法可以动态 rename the methods,除非您已经在使用 RunKit。 (据我所知或无论如何也找不到)。

如果纯粹为了调试目的,您可以将自己的 class 自动加载器设置为 pre-process 文件,更改方法名称,然后在您的文件上使用 __call 魔术方法parent class.

spl_autoload_register(function($class){
       $hackPath = '/home/_classes/'.$class;
       if (!file_exists($hackPath)){
           $realPath = '/home/classes/'.$class;
           $file = file_get_contents($realPath);
           $processedContent = //use regex or something to prepend all function names with an _.
           file_put_contents($hackPath,$processedContent);
       }


       require_once $hackPath;
    });

然后在你的parentclass

class parent {

    public function __call($funcName,$arguments){

       $this->myLogFunc($funcName,$arguments);
       //since you prepended with an underscore
       return call_user_func_array('_'.$funcName,$arguments);

    }

这是一种糟糕的方法来完成您的要求,但它可以工作。 pre-processing 文件可能会很慢,但只有在原始文件更改时才需要执行此操作(您可以使用 filemtime 来检查它是否已更改)。