2012-02-24 27 views
6

Tôi thấy điều này trong PHP OOP thủ http://www.php.net/manual/en/language.oop5.visibility.php và tôi không thể có được đầu của tôi xung quanh lý do tại sao sản lượng không phải là: Foo :: testPrivate Foo :: testPublicPHP tầm nhìn của nhãn hiệu OOP dụ - ai đó có thể giải thích nó

class Bar 
{ 
    public function test() { 
     $this->testPrivate(); 
     $this->testPublic(); 
    } 

    public function testPublic() { 
     echo "Bar::testPublic\n"; 
    } 

    private function testPrivate() { 
     echo "Bar::testPrivate\n"; 
    } 
} 

class Foo extends Bar 
{ 
    public function testPublic() { 
     echo "Foo::testPublic\n"; 
    } 

    private function testPrivate() { 
     echo "Foo::testPrivate\n"; 
    } 
} 

$myFoo = new foo(); 
$myFoo->test(); // Bar::testPrivate 
       // Foo::testPublic 
+1

Gợi ý: bạn sẽ nhận được kết quả mong muốn nếu bạn thay đổi 'riêng tư thành' được bảo vệ'. Đọc về cả hai công cụ sửa đổi truy cập. –

+0

kiểm tra chủ đề này. Câu trả lời đầu tiên giúp tôi rất nhiều. http://stackoverflow.com/questions/12794290/php-manual-visibilty-example-confused – Sam

+0

Kiểm tra chủ đề này. Câu trả lời đầu tiên giúp tôi rất nhiều. http://stackoverflow.com/questions/12794290/php-manual-visibilty-example-confused – Sam

Trả lời

11

Đó là tất cả về khả năng hiển thị của các biến/phương pháp.

Bạn sẽ nhận thấy rằng trong lớp Bar, phương pháp testPrivate()private. Điều đó có nghĩa là bản thân ONLY có thể truy cập phương thức đó. Không có con.

Vì vậy, khi Foo kéo dài Bar, và sau đó yêu cầu để chạy các phương pháp test(), nó thực hiện hai điều:

  1. Nó sẽ ghi đè các phương pháp testPublic() vì nó là công cộng, và Foo có quyền ghi đè bằng riêng của nó phiên bản.
  2. Gọi số test()trên Bar (vì test() chỉ tồn tại trên Bar()).

testPrivate()không ghi đè, và là một phần của lớp chứa test(). Do đó, Bar::testPrivate được in.
testPublic() bị ghi đè và là một phần của lớp kế thừa. Do đó, Foo::testPublic được in.

+0

Phải. Cảm ơn @rockerest vì lời giải thích rõ ràng. –

+0

Nhưng nếu bạn 'echo $ this-> testPrivate()' từ bên trong 'Foo: testPublic', nó sẽ lặp lại' Foo :: testPrivate'. Vì vậy, có vẻ như nó đã bị ghi đè khi được gọi từ ngữ cảnh này. Bây giờ tôi đang bối rối! – bfavaretto

+0

@bfavaretto Hãy nhớ rằng, '$ this' này là một biến động tham chiếu đến lớp mà mã đang ở. Vì vậy, trong khi nó xử lý' test() ',' $ this' tham chiếu tới bản sao tạm thời của lớp 'Bar' (cho bạn 'Bar :: testPrivate()'), nhưng '$ this' bên trong lớp' Foo' sẽ tham chiếu lớp 'Foo' (cho bạn' Foo :: testPrivate() '). – rockerest

1

Trong một số trường hợp, nó rất dễ dàng để nhận thấy rằng bạn muốn có một phương pháp tin trên lớp Bar, nhưng bạn cũng muốn lớp Foo để truy cập nó.
Nhưng chờ đợi, nó là công khai hoặc riêng tư?
Ở đây có được bảo vệ công cụ sửa đổi.
Khi phương thức là riêng, chỉ bản thân lớp đó mới có thể gọi phương thức.
Khi phương thức là công khai, mọi người có thể gọi nó, như một bữa tiệc miễn phí.
Khi phương pháp là được bảo vệ, chính lớp đó có thể gọi nó và bất kỳ ai sử dụng phương pháp này (trẻ em) đều có thể gọi nó là phương pháp của riêng mình.

-1

Tôi đã đăng cùng một câu hỏi vài ngày trước ... vì hành vi này không hợp lý đối với tôi. $ này luôn luôn được gọi là đối tượng hiện tại mà nó được sử dụng in Trong ví dụ ý kiến ​​của tôi như thế này nên ném một lỗi hoặc cảnh báo hoặc một cái gì đó. Bởi vì trong ví dụ trên, bạn đang thực sự truy cập các thành viên cá nhân: SSS ĐƯỢC CUNG CẤP KHÔNG THỂ KHÔNG THỂ!

+1

Không phải là câu trả lời mang tính xây dựng. Bạn có thể để lại một bình luận với một cái gì đó mang tính xây dựng và không phải là một rant. –

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