对象属性似乎不能作为变量函数工作


Object property does not seem to work as variable function?

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((方法,