Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Непонятки с наследованием свойств...

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
Hapson
Отправлено: 12 Марта, 2014 - 19:16:02
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Нашел вот тут статью
http://habrahabr[dot]ru/post/136560/
Но, что-то лыжи не едут...
PHP:
скопировать код в буфер обмена
  1.  
  2. class A{
  3.         protected $prop = 5;
  4.        
  5.         public function Get(){
  6.                 return $this->prop;
  7.         }
  8. }
  9.  
  10. class B extends A{
  11.         protected $prop = 0;
  12.        
  13.         public function Get(){
  14.                 return $this->prop;
  15.         }
  16. }
  17.  
  18. $a = new A();
  19. $b = new B();
  20.  
  21. echo $a->Get(), "<br />"; // 5
  22. echo $b->Get(), "<br />"; // 0
  23. echo $a->Get(), "<br />"; // 5
  24. echo $b->Get(), "<br />"; // 0
  25.  


Где правда? Почему автор говорит, что можно перезаписать значение защищенного свойства в родительском классе? Не перезаписывается оно...

(Отредактировано автором: 12 Марта, 2014 - 19:16:37)



-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
OrmaJever Модератор
Отправлено: 12 Марта, 2014 - 19:19:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Hapson пишет:
Не перезаписывается оно...

как это? У вас $b->Get() два раза вывело 0, а не 5.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
IllusionMH
Отправлено: 12 Марта, 2014 - 19:21:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




Hapson, в дочернем классе видно именно дочернее свойство(а не свойство родителя) которое переписало(внутри потомка) свойство родителя.

(Отредактировано автором: 12 Марта, 2014 - 19:21:33)

 
 Top
Hapson
Отправлено: 12 Марта, 2014 - 19:23:33
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


IllusionMH
Но в родителе ведь не переписалось ничего.

А по ссылке автор пишет
Цитата:

class Example
{
// количество кусочков в торте
protected $slices = 5;

protected function Separate($cake)
{
return $cake / $this->slices;
}
}

class ExtendedExample extends Example
{
// количество приготовленных кусочков
// в торте (ах, мы забыли, что оно
// используется в одном из методов родителя,
// не можем же мы помнить весь код)
protected $slices = 0;
// и теперь метод Separate будет выдавать
// ошибку деления на ноль

public function addSlice()
{
$this->slices++;
}
}


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
LIME
Отправлено: 12 Марта, 2014 - 19:26:25
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




тут для полноты картины надо убрать метод Get для B
 
 Top
IllusionMH
Отправлено: 12 Марта, 2014 - 19:26:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




Hapson, потомки никак не влияют на родителей. Они переопределяют родительские свойства/методы у себя.
(Добавление)
LIME, точно!
 
 Top
Hapson
Отправлено: 12 Марта, 2014 - 19:30:41
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


LIME пишет:
тут для полноты картины надо убрать метод Get для B

Хорошо...
PHP:
скопировать код в буфер обмена
  1.  
  2. class A{
  3.         protected $prop = 5;
  4. }
  5.  
  6. class B extends A{
  7.         protected $prop = 0;
  8. }
  9.  
  10. $a = new A();
  11. $b = new B();
  12.  
  13.  
  14. /*
  15. object(A)[2]
  16.   protected 'prop' => int 5
  17.  
  18. object(B)[3]
  19.   protected 'prop' => int 0
  20.  
  21. object(A)[2]
  22.   protected 'prop' => int 5
  23.  
  24. object(B)[3]
  25.   protected 'prop' => int 0
  26. */
  27.  


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
LIME
Отправлено: 12 Марта, 2014 - 19:33:29
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




плохо
из описания B убери
а вызовы оставь
может поймешь о чем автор имел ввиду
 
 Top
OrmaJever Модератор
Отправлено: 12 Марта, 2014 - 19:39:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




IllusionMH пишет:
Hapson, потомки никак не влияют на родителей.

ну тут как посмотреть.
PHP:
скопировать код в буфер обмена
  1. class A {
  2.         protected static $a = 5;
  3.  
  4.         public function getA() {
  5.                 return static::$a;
  6.         }
  7. }
  8.  
  9. class B extends A {
  10.         protected static $a = 10;
  11. }
  12.  
  13.  
  14. $obj = new B();
  15. echo $obj->getA();

Вроде бы потомок ничего не меняет, но родительский метод вернёт свойства потомка.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Hapson
Отправлено: 12 Марта, 2014 - 19:44:40
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


OrmaJever пишет:
Вроде бы потомок ничего не меняет, но родительский метод вернёт свойства потомка.

Ну правильно, метод использовался родительский, так как он не переопределен, а свойство было переопределено, поэтому и 10
(Добавление)
LIME пишет:
плохо
из описания B убери
а вызовы оставь
может поймешь о чем автор имел ввиду

PHP:
скопировать код в буфер обмена
  1.  
  2. class A{
  3.         protected $prop = 5;
  4.        
  5.         public function Sep(){
  6.                 return 55 / $this->prop;
  7.         }
  8. }
  9.  
  10. class B extends A{
  11.         protected $prop = 0;
  12.        
  13.         public function Add(){
  14.                 $this->prop++;
  15.                 return $this->prop;
  16.         }
  17. }
  18.  
  19. $a = new A();
  20. $b = new B();
  21.  
  22. echo $a->Sep(), "<br />"; // 11
  23. echo $b->Add(), "<br />"; // 1
  24. echo $a->Sep(), "<br />"; // 11
  25. echo $b->Add(), "<br />"; // 2
  26.  


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
LIME
Отправлено: 12 Марта, 2014 - 19:52:46
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Hapson пишет:
Ну правильно, метод использовался родительский, так как он не переопределен, а свойство было переопределено, поэтому и 10
тут OrmaJever слегка передернул колоду )
я не вижу где тут потомок на родителя влияет
попробуй в его примере заменить static на self и будет использоваться родительское свойство
как это часто бывает налицо путаница в терминалогии
под переписать автор имел ввиду используется
видимо так
 
 Top
LIME
Отправлено: 12 Марта, 2014 - 19:54:16
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




а твой пример я просил изменить следующим образом
PHP:
скопировать код в буфер обмена
  1. class A{
  2.         protected $prop = 5;
  3.        
  4.         public function Get(){
  5.                 return $this->prop;
  6.         }
  7. }
  8.  
  9. class B extends A{
  10.         protected $prop = 0;
  11. }
  12.  
  13. $a = new A();
  14. $b = new B();
  15.  
  16. echo $a->Get(), "<br />"; // 5
  17. echo $b->Get(), "<br />"; // 0
  18. echo $a->Get(), "<br />"; // 5
  19. echo $b->Get(), "<br />"; // 0
и всё
 
 Top
Hapson
Отправлено: 12 Марта, 2014 - 19:59:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


LIME пишет:
попробуй в его примере заменить static на self и будет использоваться родительское свойство

Ну да
PHP:
скопировать код в буфер обмена
  1.  
  2. class A {
  3.         protected static $a = 5;
  4.  
  5.         public function getA() {
  6.                 return self::$a;
  7.         }
  8. }
  9.  
  10. class B extends A {
  11.         protected static $a = 10;
  12. }
  13.  
  14.  
  15. $obj = new B();
  16. echo $obj->getA(); // 5
  17.  


Ну в общем и целом, как я понял, дочерний класс не может повлиять на свойства родительского.
protected свойство в родительском классе просто предоставляет возможность обратиться к нему, но не изменить его значение.


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
IllusionMH
Отправлено: 12 Марта, 2014 - 20:35:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




Hapson, как бы нужно заглянуть в офф доку, там все расписанно
Цитата:
Модификатор protected (защищенный) разрешает доступ наследуемым и родительским классам. Модификатор private (закрытый) ограничивает область видимости так, что только класс, где объявлен сам элемент, имеет к нему доступ.


OrmaJever, для меня это ожидаемое поведение, т.к. используется свойство из дочернего класса, другое дело как оно получено.
 
 Top
OrmaJever Модератор
Отправлено: 12 Марта, 2014 - 20:47:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




ладно, согласен, ничё я не разбираюсь в ООП Не понял и опечален


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB