PHP:为类方法分配函数

时间:2014-12-26 19:50:07

标签: php function oop methods

如何在PHP中的类中为方法分配函数?我尝试了以下方法:

class Something{
    public function __construct(){
        $functionNames = array('foo', 'bar')

        $variable = 'blablabla';

        foreach($functionNames as $functionName){
            if(method_exists($this, $functionName))
                continue;

            $this->{$functionName}() = function($params){ //should create the methods "foo" and "bar"
                echo $variable; //should echo 'blablabla' (I know that the variable was declared outside this function, but how can I access it anyway?)
            }; //the error points to here
        }
    }
}

但是这段代码给了我这个错误:

Fatal error: Can't use method return value in write context

有谁知道如何将匿名函数分配给类方法,同时还能够访问该函数之外的变量?

1 个答案:

答案 0 :(得分:3)

您正在执行foreach($functionNames as $functionName){,这意味着$functionName字符串,而不是数组。因此,请勿使用$functionName[0]

method_exists需要2个参数。一个是对象,另一个是方法名称。它应该是:

method_exists($this, $functionName)

至于创建该功能,您在()左侧侧不需要=。它应该是:

$this->$functionName = function($params) use($variable){
    echo $variable;
};

需要use($variable)来告诉PHP在函数中使用该变量。关于密码在PHP中是如何工作的,它与其他语言不同。

所以,你的课应该是这样的:

class Something{
    public function __construct(){
        $functionNames = array('foo', 'bar');

        $variable = 'blablabla';

        foreach($functionNames as $functionName){
            if(method_exists($this, $functionName)){
                continue;
            }

            $this->$functionName = function($params) use($variable){
                echo $variable;
            };
        }
    }
}

问题在于,通过这种方式创建函数,您实际上并不是在创建一个类方法,而是创建一个包含函数的类变量。

所以,你需要像这样调用它:

$test = new Something;
$foo = $test->foo;

$foo('abc');

您不能$test->foo('abc');

编辑:你可以做的另一件事是使用PHP的__call"魔术方法"。无论方法是否存在,只要您执行->funcName(),就会运行此操作。使用该方法,您只需检查调用的方法是'foo'还是'bar'。见这个例子:

class Something{
    private $variable;

    public function __construct(){
        $this->variable = 'blablabla';
    }

    public function __call($name, $params=array()){
        if(method_exists($this, $name)){
            // This makes sure methods that *do* exist continue to work
            return call_user_func(array($this, $name), $params);
        }
        else{
            $functionNames = array('foo', 'bar');

            if(in_array($name, $functionNames)){
                // You called ->foo() or ->bar(), so do something
                // If you'd like you can call another method in the class
                echo $this->variable;
            }
        }
    }
}

有了这个,现在你可以做到以下几点:

$test = new Something;
$test->foo('abc');  // Will echo "blablabla"