2017-05-09 13 views
7

Rozważmy następujący kod:Dlaczego wywoływanie właściwości wywoływalnych w PHP 7 działa?

interface Doll 
{ 
    /** 
    * @return string 
    */ 
    function __invoke(); 
} 

class LargeDoll 
{ 
    private $inner; 

    function __construct(Doll $inner) 
    { 
     $this->inner = $inner; 
    } 

    function __invoke() 
    { 
     return $this->inner() . ' world'; 
    } 
} 

to nie będzie działać, ponieważ spodziewa $this->inner być metoda, zamiast właściwości na żądanie.

Potem przyszło mi do głowy, tak jak gdyby działało (new LargeDoll)();, a co jeśli własność została również opakowana w parantezę? Więc ja testowałem to na 3v4l:

return ($this->inner)() . ' world'; 

And found that it works for PHP 7, but not for previous versions.

Jednak nie mogę znaleźć żadnej wzmianki o tym in the changelogs.

Gdzie mogę znaleźć więcej informacji o tej funkcji?

Odpowiedz

9

Możliwość korzystania z IIFE (które skutecznie jest ($this->inner)()) została dodana jako część Uniform Variable Syntax RFC przez Nikitę Popov, która została zaimplementowana w PHP7.

Jest to konsekwencja lepszej obsługi zmiennych składniowych w analizatorze składni. Biorąc pod uwagę, że jednym z celów PHP7 było zmodyfikowanie analizy składni, myślę, że osiągnęli tam prawdziwy postęp.

Powiązane problemy