2011-01-21 46 views
6

Dưới đây là ví dụ:

class Test { 

    public function TestMethod() { 

     print_r($this); // Gives me "Test1 Object ()" 

    } 
} 

class Test1 { 

    public function Test1Method() { 

     Test::TestMethod(); 

    } 
} 

$test1 = new Test1; 
$test1->Test1Method(); 

Tôi thấy điều này thật lạ. Bất cứ ai có thể vui lòng giải thích cho tôi tại sao nó xảy ra?

+2

Tôi đã hỏi một câu hỏi rất giống (Không phải một câu hỏi). Các câu trả lời rất hữu ích http://stackoverflow.com/questions/516355/calling-static-method-from-class-bwhich-extends-class-a-of-class-a –

Trả lời

7

Từ http://www.php.net/manual/en/language.oop5.basic.php:

Các giả biến $this có sẵn khi một phương pháp được gọi là từ bên trong một bối cảnh đối tượng. $this là một tham chiếu đối tượng gọi (thường là đối tượng mà phương pháp thuộc về, nhưng có thể là một đối tượng khác, nếu phương pháp được gọi tĩnh từ ngữ cảnh của đối tượng phụ).

Điều này không nhất thiết phải có nhiều ý nghĩa, và sẽ gọi cảnh báo nếu E_STRICT được bật.

+0

Sẽ có ý nghĩa nếu 'Test1' là một lớp con của 'Test'; có lẽ nó chỉ là một cách rẻ tiền để tái tạo hành vi 'này' được tìm thấy trong các ngôn ngữ được thiết kế cho OOP ngay từ đầu. – tdammers

+0

Cách tốt nhất để kiểm tra xem liệu tham chiếu '$ this' này có thuộc lớp hiện tại không? Tôi cần nó để kiểm tra nếu phương pháp được gọi là tĩnh hoặc từ đối tượng. Tôi đoán nó là một cái gì đó giống như 'if ($ this instanceof __CLASS__) {}'. Tôi có đúng không? – SaltLake

+1

@SaltLake: Tôi không biết. Nhưng cá nhân, tôi sẽ cho phép 'E_STRICT' ngăn chặn loại hackery này! Nó chỉ có thể dẫn đến đau trong thời gian dài. –

4

Trả lời ngắn: Bạn đang gọi phương thức "không tĩnh" bằng cách sử dụng lệnh gọi hàm tĩnh, sau đó cố gắng tìm "$ this" và giá trị thực "$ this" cuối cùng là giá trị trong Test1.

Nếu bạn bật báo cáo lỗi E_STRICT, nó sẽ khiếu nại về điều đó.

0

late static binding nếu tôi không nhầm, điều này có thể xảy ra vào thứ Sáu tuần trước.

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