PHP 魔术方法 - __invoke()
有时候,我们创建了一个实例后,是不是很想把这个实例当作一个方法来调用 ?默认情况下, 它会抛出一个异常的
<?php class Person { public $sex; public $name; public $age; public function __construct($name="", $age=25, $sex='Male') { $this->name = $name; $this->age = $age; $this->sex = $sex; } } $person = new Person('Yufei',30,'Male'); $person();
错误如下
[yufei@localhost php]$ php demo.php
Fatal error: Uncaught Error: Function name must be a string in /Users/yufei/php/demo.php:18
Stack trace:
#0 {main}
thrown in /Users/yufei/php/demo.php on line 18
错误提示表示,我们的 $person 并不是一个可用的函数名称。也的确是啊,它是一个对象的名称。
如果想要这么做而不报错,我们必须给类定义一个 __invoke() 魔术方法
魔术方法 __invoke()
魔术方法 __invoke() 会在将一个对象当作一个方法来使用时会自动调用,该方法的原型如下
public mixed __invoke()
{
// 其它功能
}
该魔术方法可以有返回值,也可以没有,如果有返回值,也可以是任意类型,就上平常的方法或函数一样
范例
下面的代码,我们给 Person 类添加上 __invoke() 魔术方法,然后我们就可以将它的实例当作普通方法来调用了
<?php class Person { public $sex; public $name; public $age; public function __construct($name="", $age=25, $sex='Male') { $this->name = $name; $this->age = $age; $this->sex = $sex; } public function __invoke() { return '你好,我的名字是: '. $this->name . ',我 '. $this->age .' 岁了。'; } } $person = new Person('Yufei',30,'Male'); echo $person(), "\n";
运行结果如下
[yufei@localhost php]$ php demo.php 你好,我的名字是: Yufei,我 30 岁了