我有以下内容:
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
答案 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
检查它是否已更改)。