访问传递给子方法的参数
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
来检查它是否已更改)。
我有以下内容:
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
来检查它是否已更改)。