0


如上, 这是guzzle库中的client.php文件, 不明白这里的$handler,他是一个实例对象了吧, 为什么可以像一个函数那样使用呢, 这里是什么意思?.

$handler打印出来是这样的

object(GuzzleHttp\HandlerStack)[142]
  private 'handler' => 
    object(Closure)[149]
      public 'static' => 
        array (size=2)
          'default' => 
            object(Closure)[147]
              ...
          'streaming' => 
            object(GuzzleHttp\Handler\StreamHandler)[148]
              ...
      public 'parameter' => 
        array (size=2)
          '$request' => string '<required>' (length=10)
          '$options' => string '<required>' (length=10)
  private 'stack' => 
    array (size=4)
      0 => 
        array (size=2)
          0 => 
            object(Closure)[150]
              ...
          1 => string 'http_errors' (length=11)
      1 => 
        array (size=2)
          0 => 
            object(Closure)[151]
              ...
          1 => string 'allow_redirects' (length=15)
      2 => 
        array (size=2)
          0 => 
            object(Closure)[152]
              ...
          1 => string 'cookies' (length=7)
      3 => 
        array (size=2)
          0 => 
            object(Closure)[153]
              ...
          1 => string 'prepare_body' (length=12)
  private 'cached' => null

6个回答

1

已采纳

PHP5.3.0新增了一个叫做__invoke的魔术方法,这个方法会被这样调用:
当一个对象当做函数调用的时候, 如果对象定义了__invoke魔幻方法则这个函数会被调用。
例如:
class testClass{

public function __invoke{
    echo 'hello world!";
}

}
$obj = new testClass;
$obj();
执行结果为:hello world!

2

看看实例是不是有__invoke方法,有那么就是执行的它

0

去看下php的闭包函数和回调函数相关内容应该就可以更好的理解了

0
是不是对象,var_dump($handler);就知道了
0

var_dump出来结果明显就是一个对象,直接objectName().,这样调用其实是使用了php的内置魔术方法__invoke。
具体请查看php魔术方法

0

当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

PHP 魔术方法提供了这样的功能,引用官方例子:

<?php
class CallableClass 
{
    function __invoke($x) {
        var_dump($x);
    }
}
$obj = new CallableClass;
$obj(5); // 输出:int(5)
var_dump(is_callable($obj)); // 输出:true

参考:__invoke 魔术方法

撰写答案