2012-05-01 42 views
8

thể trùng lặp:
PHP: Static and non Static functions and ObjectsTrong PHP, tại sao tôi có thể truy cập phương thức không tĩnh theo cách tĩnh?

Trong đoạn mã sau, không tĩnh() không phải là một phương pháp tĩnh. Thậm chí sau đó tôi có thể truy cập nó mà không cần tạo một đối tượng (theo cách tĩnh). Bất cứ ai có thể xin vui lòng giúp tôi hiểu vì điều này là không thể trong các ngôn ngữ khác như Java?

<?php 
class MyClass 
{ 
    function nonStatic() { 
     echo "This can be printed"; 
    } 
} 
MyClass::nonStatic(); // This can be printed 
+4

vì các khái niệm OO đã được bắt đầu vào PHP như một suy nghĩ? Nghiêm túc, PHP, không phải là một mô hình cho nghiên cứu OOP. – DGM

+0

Bạn có thể gọi nó tĩnh miễn là nó không bao gồm tham chiếu cá thể ('$ this'). Không chắc chắn nếu bạn sẽ nhận được cảnh báo theo 'E_STRICT' (tôi hy vọng bạn sẽ làm). –

+0

Tôi không đồng ý điều này là trùng lặp vì câu hỏi này có chứa các giải thích tốt hơn ít nhất –

Trả lời

0

Không chắc chắn, có thể là một số phép thuật PHP (đôi khi đôi khi), nhưng bạn không nên làm điều đó.

Đọc ở đây http://php.net/manual/en/language.oop5.static.php

Họ cũng cho thấy một ví dụ tương tự, nhưng lưu ý hơn:

Gọi phương pháp không tĩnh tĩnh tạo ra một ý nghĩa cảnh báo mức E_STRICT khả năng kỳ diệu này có thể biến mất trong các phiên bản trong tương lai. Vì vậy, đừng làm điều đó :)

+1

Nói chung, PHP cố gắng, nếu có thể, không bị lỗi và ghi nếu không cần thiết. Trong ví dụ của mình, không có gì không tĩnh được thực hiện, và vì lý do đó, phương thức này có hiệu quả tĩnh. Một cách khác để suy nghĩ về nó là tĩnh là một cách để có được php để kiểm tra để chắc chắn rằng bạn đã không thực hiện một cuộc gọi đến $ này kể từ khi phương pháp được dự định sẽ được sử dụng tĩnh - đó là những gì tất cả các ngôn ngữ khác làm anyway. Nó chỉ là một cấu trúc.PHP biên dịch và thực hiện cùng một lúc, vì nó là một ngôn ngữ kịch bản, do đó, nó có tính linh hoạt cao hơn và làm cho biến lỗi này thường gây tử vong thành một cảnh báo - có thể. –

2

Dường như các nhà phát triển PHP không thấy bất kỳ giá trị nào trong việc không cho phép truy cập tĩnh các phương thức không tĩnh. Đây chỉ là một trong những tính năng riêng của PHP không thực sự phục vụ cho mục đích. Nó chắc chắn là thực hành lập trình xấu để gọi một phương thức tĩnh không tĩnh, nhưng trong PHP nó là có thể. Có lẽ trong một phiên bản tương lai của PHP họ sẽ không cho phép điều này, nhưng bây giờ, nó chỉ là một phần của ngôn ngữ.

Edit:

Rất may, ngược lại là không được phép - bạn không thể gọi một phương thức tĩnh từ một bối cảnh đối tượng. Như Jack đã chỉ ra bên dưới, bạn có thể gọi phương thức tĩnh từ ngữ cảnh đối tượng - hầu như không phải là phương pháp hay nhất trong mô hình OOP, nhưng nó được cho phép.

+1

Đối diện * là * thực sự được phép; không chắc chắn cho dù đó là tốt hay xấu mặc dù ;-) –

+0

Cảm ơn đã cảnh báo tôi với điều đó, Jack! Tôi đã cập nhật nhận xét của mình. – Andrew

6

Nó cho phép, nhưng nó tạo ra một E_STRICT cảnh báo:

Error #: 2048, Error: Non-static method MyClass::nonStatic() should not be called statically, assuming $this from incompatible context 

Trong việc triển khai OO trước của PHP này được phép im lặng, nhưng thực hành tốt hơn kể từ đó được áp dụng.

Các công trình đối diện mà không có một xô mặc dù:

class Test 
{ 
    function foo() 
    { 
     echo $this->bar(); 
    } 

    static function bar() 
    { 
     return "Hello world\n"; 
    } 
} 

$x = new Test; 
$x->foo(); 

này in Hello world.

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