2016-12-06 30 views
0

我在书类中有一个方法display()PHP oop如何调用动态函数名称

$name = 'display()'; 
$book = new Book('PHP Object-Oriented Solutions', 300); 

$book->$name; 

我如何可以调用使用$book->$name

+0

你尝试'$书 - > $ name'?错误是什么? – Dragos

+4

我投票结束这个问题,因为它是PHP手册的副本。 http://php.net/manual/en/functions.variable-functions.php –

+0

当我使用$书 - > $名称它说:注意:未定义的属性:Book :: $ display() –

回答

3

你需要告诉你要执行的方法,而不是变量本身PHP显示方法,但实际的代码中:

$name = 'display'; 
$book = new Book('PHP Object-Oriented Solutions', 300); 

$book->$name(); 

正如你所看到的,它将把$name作为一个属性名称,正确的如此...如果你有两个一个属性和一个名为'display'的方法,那么就没有办法disti两者之间使用你所尝试过的东西。

+0

是不是要先运行'$ name()'? –

+0

否,词法分析器看到OOP上下文,并会忽略名为display()的常规函数​​。 – Narf

+0

是不确定的,有种不能测试:) –

0

最干净的方式(IMO至少)是使用类似:

$name = 'display'; 
$book = new Book('PHP Object-Oriented Solutions', 300); 

call_user_func([$book, $name]); // This looks cleaner and/or more obvious on first sight. 
// call_user_func_array([$book, $name], $arrayOfArguments); 

// And as @Narf suggested (and I agree cuz we move forward) 
call_user_func([$book, $name], ... $arrayOfArguments); 

是的,你可以传递参数给这个函数,将被传递给函数,但你必须后列出它们可调用数组。为了避免这样做(难以维护,而且并不总是你想要的),你可以使用call_user_func_array,它接受一个参数数组作为传递给可调用对象的第二个参数。

call_user_func Documentation

call_user_func_array Documentation

+0

参数解包FTW:'call_user_func([$ book,$ name],... $ argsArray);' – Narf

+0

〜Lol,就是说如果我们是抛出窗口5.6(不提及其他人,因为EOL),但将编辑〜显然,我笨到忘了他们是5.6功能... * facepalm * –

+0

这是一个PHP 5.6功能。 ;)EOLd版本可以RIP。 – Narf