如何在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
有谁知道如何将匿名函数分配给类方法,同时还能够访问该函数之外的变量?
答案 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"