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 岁了