2016-04-03 20 views
6

Tôi đã found một số hành vi lạ (đối với tôi) của trình thông dịch PHP và tôi không chắc liệu có an toàn khi sử dụng nó trong sản xuất hay không.Gọi phương thức không tĩnh thông qua toán tử phân giải phạm vi

Khi chúng ta gọi là Foo::bar() và lớp Foo không có bar phương pháp tĩnh nhưng nó có không tĩnh bar phương pháp, người phiên dịch sẽ gọi không tĩnh bar trên null (vâng, nó có vẻ vô lý). Tôi mong đợi số __callStatic được gọi trong trường hợp này. Nhưng nó không phải là những gì đang xảy ra vì một lý do nào đó.

Tôi đã sau đó tìm thấy một cách sử dụng tiện dụng cho hành vi này: để cung cấp các lớp học với phương pháp tĩnh và không tĩnh có cùng tên như thế này:

class Foo 
{ 
    public function bar(){ 
     if (isset($this)) { 
      $this->nonStaticBar(); 
     } else { 
      static::staticBar(); 
     } 
    } 

    private function nonStaticBar() { 
     echo "Non-static\n"; 
    } 

    private static function staticBar() { 
     echo "Static\n"; 
    } 
} 

(new Foo())->bar(); // Output: "Non-static" 
Foo::bar(); // Output: "Static" 

Vâng, tôi biết, rằng phương pháp này không phải là thanh lịch và kiến ​​trúc sai. Câu hỏi đặt ra là nếu nó an toàn (tuân thủ theo tiêu chuẩn) để sử dụng tính năng "" này hay không. Có trường hợp nào khác khi isset($this) có thể bằng false không?

Trả lời

3

Mặc dù ví dụ trên của bạn không hoạt động nhưng đây không phải là phương pháp hay nhất. này được ghi nhận trong các tài liệu PHP here và khẳng định rằng trong PHP phiên bản trước phiên bản 7, nếu E_STRICT báo cáo lỗi được kích hoạt thì nó sẽ phát ra các lỗi:

Strict Standards: Non-static method Foo::bar() should not be called statically in /Path/to/file.php on line 22 

Ngoài ra trong các phiên bản PHP 7 trở lên gọi chức năng tĩnh tĩnh không được dùng nữa và sẽ gây ra lỗi sau khi thực hiện:

Deprecated: Non-static method Foo::bar() should not be called statically in /Path/to/file.php on line 22 
+0

Cảm ơn bạn đã tham khảo tài liệu. Tôi tin rằng '__callStatic' phải được gọi trong trường hợp này. Lớp không có phương thức tĩnh với tên như vậy. Và các tài liệu nói rằng '__callStatic() được kích hoạt khi gọi các phương thức không tiếp cận được trong một ngữ cảnh tĩnh.' – Kolyunya

+0

@Kolyunya Một điều thú vị mà tôi nhận thấy khi cố gán/gán lại biến '$ this' trong một static (hoặc không tĩnh)) phương thức là nó sẽ trả về lỗi nghiêm trọng 'Lỗi nghiêm trọng: Không thể gán lại $ giá trị này trong/Path/to/file.php'. Vì vậy, mặc dù nó không phải là thực hành tốt nhất, tôi không thể tưởng tượng một trường hợp khác mà 'isset ($ this)' sẽ bằng 'false'. –

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