Почему унаследованный класс, получает доступ к приватному свойству базового класса? Не должно же такого быть. Ну и что, что parent указан, всё равно такого не должно быть. PHP: <?php header('Content-Type: text/html; charset=utf-8'); class ShopProduct{ private $price; public function __construct ($price){ $this->price = $price; } public function getPrice(){ return $this->price; } } class BookProduct extends ShopProduct{ public function getPrice(){ return parent::getPrice() . $this->price; } } $product1 = new BookProduct(10.40); echo $product1->getPrice();
Ну у меня вывод такой твоего скрипта: Код (Text): E_NOTICE : type 8 -- Undefined property: BookProduct::$price -- at line 18 10.4 Так что всё ОК. Метод производного класса не видит свойство price базового класса, это то, как и должно быть. Но только не надо делать эту ошибку. Свойства наследуются все - и публичные, и приватные, и защищённые. Приватные недоступны из методов, определённых в производном классе, но они у него есть. Иначе бы половина методов базового класса, их использующая, отваливалась бы при наследовании, что не назовёшь идеальным поведением интерпретатора.
Но почему, если отключить вывод ошибок, то не ругается? --- Добавлено --- А если так сделать return parent::getPrice(); то работает
Ещё раз. У объектов производного класса есть абсолютно все свойства, определённые в базовом, с любым уровнем видимости. Но, если свойство определено в базовом классе как приватное, то метод, определённый в производном классе, не может к нему обратиться через $this->property_name. Однако, всем унаследованным, но не переопределённым методам базового класса это свойство доступно. При вызове через parent::, ты вызываешь метод, определённый в базовом классе, и ему доступны все приватные свойства своего класса (базового) --- Добавлено --- Про отключения вывода ошибок - это нужно делать на уже отлаженном, рабочем сайте, после того, как он выложен на production-сервер. И даже тогда ошибки должны логироваться, вдруг ты что-то упустил, и в каком-то случае сайт таки работает неверно. Если есть лог ошибок, то php может тебе подсказать. А пока ты разрабатываешь сайт, вывод ошибок - это наивысшее благо, он должен быть включён обязательно. Ведь если у тебя есть описание ошибки нормальным английским языком, то найти её будет в 40 раз проще, чем если у тебя будет просто неработающий сайт по неизвестной причине. --- Добавлено --- Вообще, если препод говорит "приватные свойства не наследуются", то это признак жуткой некомпетентности.
Существуют методы, которые определяются для того чтобы работать с приватными свойствами класса. Они называются геттеры и сеттеры твоем случае getPrice() это геттер, который специально определен чтобы могли получить занчение свойства price
так он не говорил об этом ничего И препод его, мне кажется это книга "PHP объекты, шаблоны и методики программирования Мэтт Зандстра". Похоже он только начал заниматься, и пока не все понимает.