2017-05-09 13 views
7

Xét đoạn mã sau:Tại sao gọi các thuộc tính có thể gọi trong PHP 7 hoạt động?

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

class LargeDoll 
{ 
    private $inner; 

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

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

này sẽ không làm việc vì nó là hy vọng $this->inner trở thành một phương pháp, chứ không phải là một tài sản có thể được gọi.

Sau đó, nó xảy ra với tôi, giống như việc có (new LargeDoll)(); sẽ hoạt động, còn nếu tài sản được gói trong dấu ngoặc đơn thì sao? Vì vậy, tôi thử nghiệm nó trên 3v4l:

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

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

Tuy nhiên, tôi không thể tìm thấy bất kỳ đề cập đến in the changelogs này.

Tôi có thể tìm thêm thông tin về tính năng này ở đâu?

Trả lời

9

Khả năng sử dụng IIFE (có hiệu lực là ($this->inner)()) đã được thêm vào như một phần của Uniform Variable Syntax RFC bởi Nikita Popov, được triển khai trong PHP7.

Đó là hậu quả của việc xử lý cú pháp biến tốt hơn trong trình phân tích cú pháp. Xem xét một trong những mục tiêu của PHP7 là cải tiến phân tích cú pháp cú pháp, tôi nghĩ rằng họ đã đạt được một số tiến bộ thực sự ở đó.

Các vấn đề liên quan