Đ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();
..
Đ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
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