2012-02-09 48 views
15

Tại sao trong PHP bạn có thể truy cập phương thức tĩnh thông qua cá thể của một số lớp nhưng không chỉ thông qua tên loại?Phương pháp tĩnh trong PHP

CẬP NHẬT: Tôi là nhà phát triển .net nhưng tôi cũng làm việc với các nhà phát triển php. Gần đây tôi đã tìm thấy thời điểm này về phương pháp tĩnh được gọi là từ ví dụ và không thể hiểu tại sao nó có thể hữu ích.

VÍ DỤ:

class Foo 
{ 
    public static Bar() 
    { 
    } 
} 

Chúng ta có thể chấp nhận phương pháp như thế này:

var $foo = new Foo(); 
$foo.Bar(); // ?????? 
+4

phương pháp tĩnh và tài sản là một chút khó khăn lúc đầu. Tất cả những gì bạn cần nhớ là một phương thức tĩnh hoặc thuộc tính là một phương thức có thể được sử dụng mà không cần khởi tạo đối tượng trước. – EGHDK

+0

Bạn có thể làm rõ chính xác ý nghĩa của mình với đoạn mã không? Câu hỏi của bạn có phần mơ hồ. – deceze

+0

Đây không phải là PHP cụ thể. Trong Python, bạn cũng có thể truy cập các phương thức được trang trí với các trình trang trí '@ staticmethod' từ cá thể và sự khác biệt duy nhất là các phương thức tĩnh không nhận được ngữ cảnh (đối tượng) mà chúng được gọi. – Tadeck

Trả lời

24

Trong PHP

lớp được khởi tạo bằng cách sử dụng từ khóa mới ví dụ;

$MyClass = new MyClass();

và phương pháp tĩnh hoặc thuộc tính có thể truy cập bằng cách sử dụng một trong hai phạm vi điều hành giải quyết hoặc nhà điều hành tài liệu tham khảo đối tượng. ví dụ nếu lớp MyClass chứa phương thức tĩnh Foo() thì bạn có thể truy cập nó theo một trong hai cách.

$MyClass->Foo(); Or MyClass::Foo()

Nguyên tắc duy nhất là phương pháp tĩnh hoặc tài sản ra khỏi bối cảnh đối tượng. ví dụ bạn không thể sử dụng $this bên trong phương thức tĩnh.

+1

Mặc dù sử dụng cá thể nó cũng hoạt động: '$ class-> staticMethod()' – dmitry

+5

@Ibrahim - Thực ra, điều đó không chính xác.Bạn có thể truy cập cả hai phương thức tĩnh và không tĩnh từ một thể hiện của lớp hoặc chính lớp đó. Thời gian duy nhất bạn sẽ nhận được một lỗi là khi bạn gọi một phương pháp đề cập đến '$ this' tĩnh. –

+1

@ nhầm lẫn-quỷ không bao giờ biết PHP cho phép điều này, cảm ơn bạn :) –

3

Tại sao trong PHP, bạn có thể truy cập phương pháp tĩnh thông qua cá thể của một số lớp nhưng không chỉ thông qua tên loại?

Không giống như những gì bạn có thể sử dụng với .NET. PHP có các loại động. Hãy xem xét:

class Foo 
{ 
    static public function staticMethod() { } 
} 

class Bar 
{ 
    static public function staticMethod() { } 
} 

function doSomething($obj) 
{ 
    // What type is $obj? We don't care. 
    $obj->staticMethod(); 
} 

doSomething(new Foo()); 
doSomething(new Bar()); 

Vì vậy, bằng cách cho phép truy cập vào phương pháp tĩnh thông qua đối tượng, bạn có thể dễ dàng gọi hàm tĩnh cùng tên trên các loại khác nhau.

Bây giờ tôi không biết liệu có lý do chính đáng để truy cập phương pháp tĩnh qua -> được cho phép hay không. PHP (5.3?) Cũng hỗ trợ:

$obj::staticMethod(); 

có lẽ ít gây nhầm lẫn. Khi sử dụng ::, nó phải là một chức năng tĩnh để tránh cảnh báo (không giống như ->, cho phép).

+0

có lẽ không tĩnh phương pháp với một giao diện nên được sử dụng trong ví dụ của bạn, vì sử dụng phương pháp tĩnh là một chút bối rối phải không? – donRumatta

+0

@donRumatta, tôi sẽ không tuyên bố rằng ở trên là mã tốt. Nhưng do các tính năng động của PHP, các giao diện không thực sự cần thiết và nhiều người không có mã. Lưu ý rằng PHP không phải lúc nào cũng có hỗ trợ OOP tốt, vì vậy một số câu trả lời cho "lý do" chỉ là "các quyết định thiết kế tồi của các phiên bản trước". – Matthew

11
Class Do { 
    static public function test() { 
     return 0; 
    } 
} 

sử dụng như thế này:

echo Do::test(); 
Các vấn đề liên quan