2011-10-29 36 views
22

Đoạn mã sau sẽ không có PHP mà customMethod() là riêng tư. Tại sao điều này là trường hợp? Mức độ hiển thị có được xác định bởi vị trí nào đó được khai báo thay vì được xác định không?Chức năng riêng tư trừu tượng

Nếu tôi muốn đặt customMethod chỉ hiển thị với mã bản mẫu trong lớp Mẫu và ngăn không cho nó bị ghi đè, tôi có thể bảo vệ nó và cuối cùng không?

template.php:

abstract class Template() { 
    abstract private function customMethod(); 

    public function commonMethod() { 
     $this->customMethod(); 
    } 
} 

CustomA.php:

class CustomA extends Template { 
    private function customMethod() { 
     blah... 
    } 
} 

Main.php

... 
$object = new CustomA(); 
$object->commonMethod(); 
.. 

Trả lời

41

Phương pháp trừu tượng không thể là riêng tư, bởi vì theo định nghĩa chúng phải được thực hiện bởi một lớp dẫn xuất. Nếu bạn không muốn nó là public, nó cần phải là protected, có nghĩa là nó có thể được nhìn thấy bởi các lớp dẫn xuất, nhưng không ai khác.

The PHP manual on abstract classes hiển thị cho bạn các ví dụ về cách sử dụng protected theo cách này.

+9

Điều này khác với cách C++ (và tôi nghĩ Java) hoạt động. C++ cho phép các hàm ảo thuần túy (tương đương với các hàm trừu tượng) của chúng là riêng tư. Điều này là tốt đẹp bởi vì nó cho phép các lớp dẫn xuất để xác định và kiểm soát những gì để làm, trong khi thực thi rằng chỉ có các lớp cơ sở có thể chọn KHI để làm điều đó. Các hàm trừu tượng được bảo vệ không thể cung cấp cho bạn sự bảo đảm giống như lớp dẫn xuất có thể tự do tạo ra một hàm công khai gọi các thực thi được bảo vệ và phá vỡ sự đóng gói. – Aaron

+0

Làm việc xung quanh: Bạn có thể thêm từ khóa 'final' vào hàm được bảo vệ trong định nghĩa lớp trừu tượng (tức là' hàm được bảo vệ cuối cùng my_function() '). Điều này sẽ ngăn chặn các hàm bị ghi đè bởi các lớp con, mặc dù lớp con có thể gọi hàm đó cho chính nó (một cái gì đó không thể xảy ra với hàm riêng của cha mẹ). Có hay không điều này đánh bại mục đích xác định một lớp trừu tượng là một cuộc thảo luận triết học cho một ngày khác. (Ngoài ra, bạn có thể định nghĩa một lớp mới mở rộng lớp trừu tượng và định nghĩa hàm riêng tư ở đó.) – Slicktrick

1

Tóm tắt phương pháp đều công khai hoặc được bảo vệ. Đây là điều bắt buộc.

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