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
Форумы портала PHP.SU :: Версия для печати :: Непонятки с наследованием свойств...
Форумы портала PHP.SU » » Вопросы новичков » Непонятки с наследованием свойств...

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

1. Hapson - 12 Марта, 2014 - 19:16:02 - перейти к сообщению
Нашел вот тут статью
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.  


Где правда? Почему автор говорит, что можно перезаписать значение защищенного свойства в родительском классе? Не перезаписывается оно...
2. OrmaJever - 12 Марта, 2014 - 19:19:20 - перейти к сообщению
Hapson пишет:
Не перезаписывается оно...

как это? У вас $b->Get() два раза вывело 0, а не 5.
3. IllusionMH - 12 Марта, 2014 - 19:21:02 - перейти к сообщению
Hapson, в дочернем классе видно именно дочернее свойство(а не свойство родителя) которое переписало(внутри потомка) свойство родителя.
4. Hapson - 12 Марта, 2014 - 19:23:33 - перейти к сообщению
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++;
}
}
5. LIME - 12 Марта, 2014 - 19:26:25 - перейти к сообщению
тут для полноты картины надо убрать метод Get для B
6. IllusionMH - 12 Марта, 2014 - 19:26:52 - перейти к сообщению
Hapson, потомки никак не влияют на родителей. Они переопределяют родительские свойства/методы у себя.
(Добавление)
LIME, точно!
7. Hapson - 12 Марта, 2014 - 19:30:41 - перейти к сообщению
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.  
8. LIME - 12 Марта, 2014 - 19:33:29 - перейти к сообщению
плохо
из описания B убери
а вызовы оставь
может поймешь о чем автор имел ввиду
9. OrmaJever - 12 Марта, 2014 - 19:39:23 - перейти к сообщению
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();

Вроде бы потомок ничего не меняет, но родительский метод вернёт свойства потомка.
10. Hapson - 12 Марта, 2014 - 19:44:40 - перейти к сообщению
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.  
11. LIME - 12 Марта, 2014 - 19:52:46 - перейти к сообщению
Hapson пишет:
Ну правильно, метод использовался родительский, так как он не переопределен, а свойство было переопределено, поэтому и 10
тут OrmaJever слегка передернул колоду )
я не вижу где тут потомок на родителя влияет
попробуй в его примере заменить static на self и будет использоваться родительское свойство
как это часто бывает налицо путаница в терминалогии
под переписать автор имел ввиду используется
видимо так
12. LIME - 12 Марта, 2014 - 19:54:16 - перейти к сообщению
а твой пример я просил изменить следующим образом
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
и всё
13. Hapson - 12 Марта, 2014 - 19:59:06 - перейти к сообщению
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 свойство в родительском классе просто предоставляет возможность обратиться к нему, но не изменить его значение.
14. IllusionMH - 12 Марта, 2014 - 20:35:35 - перейти к сообщению
Hapson, как бы нужно заглянуть в офф доку, там все расписанно
Цитата:
Модификатор protected (защищенный) разрешает доступ наследуемым и родительским классам. Модификатор private (закрытый) ограничивает область видимости так, что только класс, где объявлен сам элемент, имеет к нему доступ.


OrmaJever, для меня это ожидаемое поведение, т.к. используется свойство из дочернего класса, другое дело как оно получено.
15. OrmaJever - 12 Марта, 2014 - 20:47:46 - перейти к сообщению
ладно, согласен, ничё я не разбираюсь в ООП Не понял и опечален

 

Powered by ExBB FM 1.0 RC1