За последние 24 часа нас посетили 44469 программистов и 2997 роботов. Сейчас ищут 1317 программистов ...

Наследуется приватное свойство

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 10 апр 2017.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Почему унаследованный класс, получает доступ к приватному свойству базового класса?

    Не должно же такого быть.

    Ну и что, что parent указан, всё равно такого не должно быть.

    PHP:
    1. <?php
    2. header('Content-Type: text/html; charset=utf-8');
    3.  
    4. class ShopProduct{
    5.    
    6.     private $price;
    7.  
    8.     public function __construct ($price){
    9.         $this->price = $price;
    10.     }
    11.     public function getPrice(){
    12.         return $this->price;
    13.     }
    14. }
    15.  
    16. class BookProduct extends ShopProduct{
    17.     public function getPrice(){
    18.         return parent::getPrice() . $this->price;
    19.     }
    20. }
    21. $product1 = new BookProduct(10.40);
    22.  
    23. echo $product1->getPrice();
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну у меня вывод такой твоего скрипта:
    Код (Text):
    1.  
    2. E_NOTICE : type 8 -- Undefined property: BookProduct::$price -- at line 18
    3. 10.4
    Так что всё ОК. Метод производного класса не видит свойство price базового класса, это то, как и должно быть. Но только не надо делать эту ошибку. Свойства наследуются все - и публичные, и приватные, и защищённые. Приватные недоступны из методов, определённых в производном классе, но они у него есть. Иначе бы половина методов базового класса, их использующая, отваливалась бы при наследовании, что не назовёшь идеальным поведением интерпретатора.
     
  3. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Но почему, если отключить вывод ошибок, то не ругается?
    --- Добавлено ---
    А если так сделать return parent::getPrice(); то работает
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    [​IMG]
    Потому что getPrice() - это публичный метод.
     
    mahmuzar и denis01 нравится это.
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ещё раз. У объектов производного класса есть абсолютно все свойства, определённые в базовом, с любым уровнем видимости. Но, если свойство определено в базовом классе как приватное, то метод, определённый в производном классе, не может к нему обратиться через $this->property_name. Однако, всем унаследованным, но не переопределённым методам базового класса это свойство доступно. При вызове через parent::, ты вызываешь метод, определённый в базовом классе, и ему доступны все приватные свойства своего класса (базового)
    --- Добавлено ---
    Про отключения вывода ошибок - это нужно делать на уже отлаженном, рабочем сайте, после того, как он выложен на production-сервер. И даже тогда ошибки должны логироваться, вдруг ты что-то упустил, и в каком-то случае сайт таки работает неверно. Если есть лог ошибок, то php может тебе подсказать. А пока ты разрабатываешь сайт, вывод ошибок - это наивысшее благо, он должен быть включён обязательно. Ведь если у тебя есть описание ошибки нормальным английским языком, то найти её будет в 40 раз проще, чем если у тебя будет просто неработающий сайт по неизвестной причине.
    --- Добавлено ---
    Вообще, если препод говорит "приватные свойства не наследуются", то это признак жуткой некомпетентности.
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Существуют методы, которые определяются для того чтобы работать с приватными свойствами класса. Они называются геттеры и сеттеры твоем случае getPrice() это геттер, который специально определен чтобы могли получить занчение свойства price
     
  7. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    так он не говорил об этом ничего :)

    И препод его, мне кажется это книга "PHP объекты, шаблоны и методики программирования Мэтт Зандстра".

    Похоже он только начал заниматься, и пока не все понимает.
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Заголовок темы и первое сообщение это подразумевает
     
  9. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Я про заголовок забыл. А первый пост не подразумевает это )).