访问传递给child方法的参数

时间:2015-01-02 19:09:57

标签: php class inheritance

我有以下内容:

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

2 个答案:

答案 0 :(得分:0)

这是不可能的,因为在首次实例化对象时会调用__construct(),因此fire($a, $b)将始终在 __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;
    }
}

答案 1 :(得分:0)

我认为你不能以任何“正确”的方式做到这一点。我的第一个想法是使用__call,但当然只调用未定义的函数。

除非你已经在使用RunKit,否则动态rename the methods没有任何方法。 (不是我知道或无论如何都能找到的。)

如果它纯粹用于调试目的,您可以设置自己的类自动加载器来预处理文件,更改方法名称,然后在父类上使用__call魔术方法。

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;
    });

然后在你的父类

class parent {

    public function __call($funcName,$arguments){

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

    }

这是一种可靠的方式来做你所要求的,但它可以工作。文件的预处理可能很慢,但如果原件发生变化,您只需要这样做(您可以使用filemtime检查它是否已更改)。