在对象中调用一个不可访问的方法时,__call() 会被调用。它是 PHP 魔术方法 中的一种。
语法: __call ( string $name , array $arguments )
$name 参数是要调用的方法名称。 $arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数。
调用受限方法: 如果一个类没有设置 __call() ,对象无法调用受限方法。
class Person
{
protected function eat($arg)
{}
}
当对象调用受限方法时,会出现以下错误信息:
$person = new Person();
//error: Uncaught Error: Call to protected method Person::eat()
$person->eat('milk');
设置魔术方法 __call():
class Person
{
protected function eat($args)
{
foreach ($args as $arg) {
echo 'Do you like eating, ' . $arg . '?<br />';
}
}
public function __call($name, $arguments)
{
// 如果类中有这个方法,就调用
if ($name === 'eat') {
$this->run($arguments);
} else {
echo 'Calling unavailable function ' . $name . '().<br />';
}
}
}
$person = new Person();
// Do you like eating, Jack?
// Do you like eating, Rose?
$person->eat('Jack', 'Rose');
调用不存在的方法,给出调用无效方法的信息提示:
//Calling unavailable function drink().
$person->drink('Jack', 'Rose');
