闭包:
$closure = function ($name) {
return 'Hello ' . $name;
};
很像js 的写法,php 的闭包是5.3之后的产物。
如何调用这个方法?
echo $closure(‘闭包’);
试着打印一下$closure :
看到 class Closure 。。。 长得好像一个类
实际上,使用 $closure(‘闭包’); 的时候调用了一个php 魔术方法,__invoke
可以把 $closure 当做一个类,判断一下是否存在 __invoke 的方法:
var_dump(method_exists($closure,'__invoke'));
结果:
bool(true)
学习一下 __invoke
验证一下每个类中,都可以实现 __invoke
class invoke
{
function __construct()
{
echo '初始化' . PHP_EOL;
}
function __invoke($a)
{
return $a . PHP_EOL;
}
function test()
{
echo "test" . PHP_EOL;
}
public $param;
}
问题一
调用__invoke 方法时候,是否会触发 __construct (会的)
问题二
obj2 是否可以调用test()方法? 不可以因为返回的是一个字符串
$obj = invoke;
$obj2 = $obj('demo');
$obj2->test();
如果想返回可执行的类 怎么办?在invoke方法中返回: $this 即可
但是还是不可以调用test() 方法,但是可以改变 param 中的值:
class invoke
{
function __construct()
{
echo '初始化' . PHP_EOL;
}
function __invoke($a)
{
$this->param ='我想改变param的值';
return $this;
}
public function test()
{
echo "test" . PHP_EOL;
}
public $param=222;
}
$obj = new invoke;
$data = $obj('我是invoke传递的值');
var_dump($data->param);
//结果:string(23) "我想改变param的值"
学习PHP容器Pimple运行流程的分析 所要掌握的