Iam在php中处理示例代码,我读取了变量函数(有点类似于C中的函数指针(,并开始编写以下代码。看看这个
class fruit{
public $run;
}
function ano1(){
// some statements
}
$x = 'ano1'; // variable function
$x(); // works
$f = new fruit;
$f->run = 'ano1'; // lets store function to $run property
$f->run(); // call to undefined method why?
我认为的原因因为它需要将$this
引用隐式传递给不是成员函数的ano1()
?所以在ano1()
中使用$this是无效的,他们只是还没有实现它?但我是一个c++背景,这在c++中是很可能的:
class fruit{
public : void (*run) ();
};
void ano1(){ cout << "im running" << endl; }
int main(){
fruit f;
f.run = ano1;
f.run(); // works as long as you dont use this
}
或者php中也有变通方法吗?(没有闭包和匿名函数(。感谢
它的工作方式与C.中的函数指针完全不同
您看到错误消息的特殊原因是PHP无法区分$fruit->run()
和$fruit->run()
;也就是说,调用$fruit
的方法run
和调用任何函数名$fruit->run
之间的区别。而且它与您期望的错误相反。你可以用call_user_func($fruit->run)
来消除歧义。
PHP没有类似"函数指针"的东西。函数在PHP中是二等公民。$x
只保存一个字符串,PHP支持传递函数的方式是按名称传递函数。当试图"调用字符串"时,PHP会检查是否有该名称的函数,并调用它。
因此,您所做的只是将一个字符串分配给一个对象属性,但PHP的语法太模糊,无法从那里调用它。根本不可能在事后将函数移植到对象上。所有对象方法都必须在对象实例的类中定义。
这是因为执行$f->run()
时说"调用$f
对象的run
方法"。
相反,你可以做:
$str = $f->run;
$str();
其调用字符串作为函数调用
或
$f = new fruit;
$f->run = 'ano1';
call_user_func($f->run)
其然后简单地调用属性CCD_ 14作为方法
一种你可以。。。有点自动化,是通过使用神奇的方法__call
,比如
class Fruit {
public $run;
public function __call($methodName,$argsArray){
if (property_exists($this,$methodName)
&&is_callable($this->$methodName)){
return call_user_func_array($this->$methodName,$argsArray);
} else {
throw new 'Exception("Method {$methodName} does not exist");
}
}
}
然后,你会做:
$fruit = new Fruit();
$fruit->run = 'ano1';
$fruit->run();
然后run
没有在类Fruit
中定义,所以它将方法名称(run(传递给__call
,并将您传递给run
的任何参数都传递给它。然后,如果Fruit
有一个名为$methodName
的属性(在本例中为"run"(,并且该属性可以作为函数调用,则使用call_user_func_array
将其作为函数调用。
使用以下代码
$f->{$f->run}();
由于您在fruit类的对象上处理run((方法,