2015-12-18 17 views
12

question làm tôi tò mò về việc sử dụng các cấu trúc ngôn ngữ kết hợp với các phương pháp ma thuật của PHP. Tôi đã tạo ra một mã bản demo:PHP Sử dụng cấu trúc Ngôn ngữ kết hợp với các phương pháp ma thuật

<?php 
class Testing { 

    public function scopeList() { 
     echo "scopeList"; 
    } 

    public function __call($method, $parameters) { 
     if($method == "list") { 
      $this->scopeList(); 
     } 
    } 

    public static function __callStatic($method, $parameters) { 
     $instance = new static; 
     call_user_func_array([$instance, $method], $parameters); 
    } 
} 

//Testing::list(); 
$testing = new Testing(); 
$testing->list(); 

Tại sao Testing::list() ném một lỗi cú pháp và không?

Do php reserved keywords cả hai đều không thành công?

+0

Mặc dù nó hoạt động như thế này: 'Testing :: { 'danh sách'}();' –

+0

Các toàn bộ câu hỏi có thể được giảm xuống hai đoạn văn cuối cùng. Có thực sự không phải là bất kỳ điểm nào trong việc đọc và thấu hiểu mẫu mã đó. – deceze

+0

@ lừa có thể nó có thể. Nhưng tôi nghĩ một ví dụ có ý nghĩa ở đây cho rõ ràng? Tôi muốn thể hiện, làm thế nào các phương pháp ma thuật làm việc trong ví dụ này ... –

Trả lời

3

Update PHP 7

PHP 7 giải quyết các hành vi được mô tả và thực hiện một tính năng gọi là bối cảnh nhạy cảm lexer như nuôi dưỡng bởi marcio.

Mã của bạn sẽ chỉ đơn giản là làm việc với PHP 7.


Trước tình hình PHP 7

lỗi cú pháp được ném trước PHP thậm chí còn nhận thức được thực tế là một phương pháp có sẵn thông qua __callStatic(), nó xảy ra ở giai đoạn phân tích cú pháp.

Hành vi bạn mô tả có vẻ là một lỗi trong trình phân tích cú pháp PHP, ít nhất một sự không nhất quán cần được mô tả trong tài liệu.

Tôi sẽ file a bug report. Nắm bắt tốt!


Cập nhật: OP có nộp báo cáo lỗi có thể được tìm thấy ở đây: định danh nhạy cảm https://bugs.php.net/bug.php?id=71157

+0

Cảm ơn bạn đã nhập. Tôi luôn nhớ rằng nó có thể là một lỗi trong trình phân tích cú pháp, nhưng tôi không có kiến ​​thức để chắc chắn về điều đó. –

+0

Bạn được hoan nghênh! Một lần nữa, bắt tốt. Thật không may là lập trình viên (PHP) không thể làm bất cứ điều gì ở đây, ngoại trừ việc tránh sử dụng các từ khóa reserverd. Có muốn nghe ý kiến ​​của nhà phát triển cốt lõi PHP về điều đó, tôi có nghĩa là nếu họ sẽ sửa chữa nó hoặc nói không sử dụng 'danh sách' trong bối cảnh đó. – hek2mgl

+0

Yeah, im quan tâm đến loại công cụ này;) Nếu không tôi sẽ không nghiên cứu. Tôi đã gửi báo cáo lỗi, nhưng chỉ trong trường hợp 'các vấn đề về tài liệu'. Tôi nghĩ rằng đó không phải là một lỗi 'thực' mà là một sự mâu thuẫn. –

0

Theo tôi đó là vì từ dành riêng,

nếu bạn thay thế Testing::list(); với call_user_func_array(['Testing', 'list'], []); nó hoạt động như mong đợi.

+1

Tôi quen thuộc với các từ dành riêng, đó là lý do tại sao tôi đăng liên kết đó đến tài liệu php. Nhưng tại sao nó thất bại nếu tôi gọi danh sách() tĩnh và nó không nếu tôi gọi danh sách trên một đối tượng thực tế? Phương thức ma thuật __callStatic() sẽ xử lý điều này. –

+0

Trong khi nó thực sự không phải là một câu trả lời cho vấn đề này, tôi upvote này bởi vì nó cung cấp một workaround có thể là thú vị cho những người khác stumbling này. – hek2mgl

3

Bối cảnh hiện nay được hỗ trợ cho PHP 7.0 trở lên và mã của bạn chỉ đơn giản là sẽ làm việc. Cập nhật PHP của bạn sẽ khắc phục được sự cố.

Đây là RFC được phê duyệt đã thực hiện thay đổi: https://wiki.php.net/rfc/context_sensitive_lexer.

Bạn có thể tìm thêm thông tin về các tính năng mới và thay đổi phá vỡ trên như sau (không chính thức) PHP 7 tham khảo: https://github.com/tpunt/PHP7-Reference#loosening-reserved-word-restrictions

+1

Ồ, tôi không biết điều đó. Đây sẽ là câu trả lời được chấp nhận. – hek2mgl

+0

cảm ơn thông tin của bạn;) Php 7.0 tuy nhiên là do lưu trữ các hạn chế chưa phải là một lựa chọn cho tôi (và có thể cho nhiều người khác nữa). Và như tôi đã nói, tôi đã nhận thức được các hạn chế từ khóa dành riêng, nhưng trường hợp trong OP trông khá lạ và không nhất quán với tôi. –

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