在同一类中使用call_user_func调用实例方法的PHP方法

36

我正在尝试使用call_user_func从同一对象的另一个方法调用方法,例如:

class MyClass
{
    public function __construct()
    {
        $this->foo('bar');
    }
    public function foo($method)
    {
        return call_user_func(array($this, $method), 'Hello World');
    }

    public function bar($message)
    {
        echo $message;
    }
}

new MyClass;应该返回“Hello World”...

请问有谁知道实现这个的正确方法吗?

非常感谢!


1
看起来差不多。什么没有起作用? - Pekka
1
在PHP中,“return”有明确定义,如果您指的是其他内容,应该澄清。 - Gordon
3个回答

41

您发布的代码应该可以正常工作。另一种选择是使用“可变函数”,像这样:

public function foo($method)
{
     //safety first - you might not need this if the $method
     //parameter is tightly controlled....
     if (method_exists($this, $method))
     {
         return $this->$method('Hello World');
     }
     else
     {
         //oh dear - handle this situation in whatever way
         //is appropriate
         return null;
     }
}

1
这种方法比使用call_user_func更快,尽管我看到很多人对这种方法不屑一顾...但我不是那样的人 :-) - prodigitalson
1
这是其中一句“伴随着强大的力量而来的是巨大的责任”的成语……请善用它,不要用于邪恶 :) - Paul Dixon
4
我会略微皱眉,因为如果该方法不存在,它会抛出致命错误,但很可能可以安全地假设检查已在其他地方完成。 - Pekka
2
@pekka:对我来说,这个代码段总是在检查method_exists($obj, $method)或者根据使用情况选择is_callable之后进行处理。 - prodigitalson
谢谢,我没有想到那种方法 :) - Fred

22

这对我有效:

<?php
class MyClass
{
    public function __construct()
    {
        $this->foo('bar');
    }
    public function foo($method)
    {
        return call_user_func(array($this, $method), 'Hello World');
    }

    public function bar($message)
    {
        echo $message;
    }
}

$mc = new MyClass();
?>

这将被打印出来:

wraith:Downloads mwilliamson$ php userfunc_test.php 
    Hello World

谢谢,我会再试一次,我最初尝试时可能出现了错误! - Fred
应该是最佳答案,谢谢! - David Vander Elst

3

new MyClass; 应该返回 'Hello World'...

构造函数不会返回任何内容。


2
我认为这里的“return”是非常宽泛的意思(即:他的意思是echo)。不过,你是正确的。 - Pekka
@Pekka和所有同意你观点的人。如果OP的意思是将return解释为echo,那么为什么OP还在问这个问题呢?当调用构造函数时,代码确实会执行echo操作。 - Gordon
2
@Gordon,原帖中有两个问题:1)返回一个没有返回值的函数的结果;2)在构造函数中没有尝试返回任何内容。对我来说,这是压倒性的证据表明他并不真正意味着“返回” :) - Pekka
@gordon:我同意Pekka的观点。虽然你提到的解释在某种程度上是正确的,但我认为Pekka的解释也是正确的,因为OP甚至没有在构造函数中尝试return $this->foo('bar') :-) - prodigitalson
@Pekka bar 不返回任何内容,但这并不意味着其他方法不会返回任何内容。foo 只是调用任意方法,因此在那里有一个返回是合理的。 - Gordon
@prodigitalson 当然可以,但是问题是为什么原帖的提问者要问这个问题呢?因为当前的类在构造函数被调用时已经执行了 echo - Gordon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接