鍍金池/ 問(wèn)答/PHP  網(wǎng)絡(luò)安全/ 在php中, 為什么一個(gè)實(shí)例對(duì)象還可以用括號(hào)像執(zhí)行函數(shù)那樣使用

在php中, 為什么一個(gè)實(shí)例對(duì)象還可以用括號(hào)像執(zhí)行函數(shù)那樣使用

圖片描述
如上, 這是guzzle庫(kù)中的client.php文件, 不明白這里的$handler,他是一個(gè)實(shí)例對(duì)象了吧, 為什么可以像一個(gè)函數(shù)那樣使用呢, 這里是什么意思?.

$handler打印出來(lái)是這樣的

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
回答
編輯回答
乖乖瀦

當(dāng)嘗試以調(diào)用函數(shù)的方式調(diào)用一個(gè)對(duì)象時(shí),__invoke() 方法會(huì)被自動(dòng)調(diào)用。

PHP 魔術(shù)方法提供了這樣的功能,引用官方例子:

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

參考:__invoke 魔術(shù)方法

2017年12月27日 21:57
編輯回答
懶豬

PHP5.3.0新增了一個(gè)叫做__invoke的魔術(shù)方法,這個(gè)方法會(huì)被這樣調(diào)用:
當(dāng)一個(gè)對(duì)象當(dāng)做函數(shù)調(diào)用的時(shí)候, 如果對(duì)象定義了__invoke魔幻方法則這個(gè)函數(shù)會(huì)被調(diào)用。
例如:
class testClass{

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

}
$obj = new testClass;
$obj();
執(zhí)行結(jié)果為:hello world!

2018年2月5日 19:47
編輯回答
話寡

var_dump出來(lái)結(jié)果明顯就是一個(gè)對(duì)象,直接objectName().,這樣調(diào)用其實(shí)是使用了php的內(nèi)置魔術(shù)方法__invoke。
具體請(qǐng)查看php魔術(shù)方法

2017年1月20日 17:52
編輯回答
凝雅

去看下php的閉包函數(shù)和回調(diào)函數(shù)相關(guān)內(nèi)容應(yīng)該就可以更好的理解了

2017年12月6日 14:02
編輯回答
避風(fēng)港

看看實(shí)例是不是有__invoke方法,有那么就是執(zhí)行的它

2018年4月13日 08:47
編輯回答
淺時(shí)光
是不是對(duì)象,var_dump($handler);就知道了
2018年1月19日 04:53