2013-06-04 38 views
7

Nói rằng tôi có một lớp cha mẹ

class parentClass { 
    public function myMethod() { 
     echo "parent - myMethod was called."; 
    } 
} 

và lớp trẻ sau

class childClass extends parentClass { 
    public function callThroughColons() { 
     parent::myMethod(); 
    } 
    public function callThroughArrow() { 
     $this->myMethod(); 
    } 
} 

$myVar = new childClass(); 
$myVar->callThroughColons(); 
$myVar->callThroughArrow(); 

sự khác biệt trong việc sử dụng hai cách khác nhau để gọi myMethod() từ bên trong lớp kế thừa là gì? Sự khác biệt duy nhất tôi có thể nghĩ là nếu childClass ghi đè myMethod() bằng phiên bản của riêng mình, nhưng có bất kỳ khác biệt đáng kể nào khác không? Tôi nghĩ rằng toán tử dấu hai chấm (:) được cho là chỉ được sử dụng để gọi các phương thức tĩnh, nhưng tôi không nhận được bất kỳ cảnh báo nào khi gọi $ myVar-> callThroughColons(), ngay cả với E_STRICT và E_ALL trên đó. Tại sao vậy?

Cảm ơn bạn.

Trả lời

3

self::, parent::static:: là các trường hợp đặc biệt. Chúng luôn hoạt động như thể bạn sẽ thực hiện cuộc gọi không tĩnh và hỗ trợ các cuộc gọi phương thức tĩnh mà không cần ném một số E_STRICT.

Bạn sẽ chỉ gặp sự cố khi bạn sử dụng tên của lớp thay vì các số nhận dạng tương đối đó.

Vậy điều gì sẽ làm việc là:

class x { public function n() { echo "n"; } } 
class y extends x { public function f() { parent::n(); } } 
$o = new y; 
$o->f(); 

class x { public static function n() { echo "n"; } } 
class y extends x { public function f() { parent::n(); } } 
$o = new y; 
$o->f(); 

class x { public static $prop = "n"; } 
class y extends x { public function f() { echo parent::$prop; } } 
$o = new y; 
$o->f(); 

Nhưng điều gì sẽ không làm việc là:

class x { public $prop = "n"; } 
class y extends x { public function f() { echo parent::prop; } } // or something similar 
$o = new y; 
$o->f(); 

Bạn vẫn phải xử lý các thuộc tính một cách rõ ràng với $this.

+0

Tôi không nhận được cảnh báo ngay cả khi tôi sử dụng parentClass :: myMethod() thay vì parent ::, nhưng tôi có ý tưởng tổng thể - gọi phương thức từ lớp kế thừa bằng toán tử :: không thực sự tạo cuộc gọi tĩnh, và đó là một trường hợp đặc biệt. Cảm ơn. – user2339681

+0

@ user2339681 Bạn gặp lỗi E_STRICT. Khi bạn bật báo cáo lỗi cao hơn, bạn sẽ thấy báo cáo lỗi. – bwoebi

5

Trong trường hợp này, không có sự khác biệt. Nó không tạo sự khác biệt nếu cả cấp độ gốc và cấp độ con thực hiện myMethod. Trong trường hợp này, $this->myMethod() gọi thực hiện lớp hiện tại, trong khi parent::myMethod() gọi rõ ràng việc triển khai phương thức của cha mẹ. parent:: là cú pháp đặc biệt cho loại cuộc gọi đặc biệt này, nó không liên quan gì đến các cuộc gọi tĩnh. Nó được cho là xấu xí và/hoặc khó hiểu.

Xem https://stackoverflow.com/a/13875728/476.

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