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 岁了
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.