php 类魔术方法__invoke, 当 class 定义此方法时,使用函数方式调用类的实例化时,此方法就会被调用。

简单例子

class Test
{
  public function __invoke()
  {
    echo 'invoke is called';
  }
}
$test = new Test;
$test();// invoke is called
var_dump(is_callable($test));// true

当我们以执行函数的方式执行$test时,可以看到__invoke方法被执行了,用is_callable()函数检测$test,返回是true,也证明了这一点。

带参数

class Test
{
  public function __invoke($msg)
  {
    echo 'invoke is called,'.'msg is: '.$msg;
  }
}
$test = new Test;
$test();// invoke is called,msg is: msg shown

它就是一个正常函数。

invoke 和 construct

class Test
{
  protected $name;
  public function __construct($name)
  {
    $this->name = $name;
  }
  public function __invoke($msg)
  {
    echo 'invoke is called,'.'msg is: '.$msg.', name is: '.$this->name;
  }
}
$test = new Test('zcong');
$test('msg shown');// invoke is called,msg is: msg shown, name is: zcong

construct函数是在实例化时触发,而invoke是在调用时触发,所以invoke可以使用类的属性。

用途

1. 单例类

也就是说类只有一个方法,这时使用__invoke就可以像使用函数那样使用此方法了。但是仍然可以使用继承等类的属性;

2. 当做get方法使用

可以自定制类的get方法返回的信息,一般类的属性都是声明为protected,此时你可以根据情况,将不危险的属性暴露给用户。