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 :: Почиму у меня наследуется Private свойство ???

 PHP.SU

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


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

> Без описания
p33t
Отправлено: 11 Сентября, 2016 - 18:27:05
Post Id


Новичок


Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014  


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




Доброго времени всем специалистам. Радость

есть такой кусок кода:
PHP:
скопировать код в буфер обмена
  1.  
  2. class A implements Serializable{
  3.         private $varA;
  4.                 public function __construct() {
  5.                 $this->varA = 'A';
  6.         }
  7.         public function serialize() {
  8.                 return serialize($this->varA);
  9.         }
  10.         public function unserialize($serialized) {
  11.                 $this->varA = unserialize($serialized);
  12.         }
  13.         public function showVar() {
  14.                 echo $this->varA . "\n";
  15.         }
  16. }
  17. class B extends A {
  18.         private $varB;
  19.         public function __construct() {
  20.                 parent::__construct();
  21.                 $this->varB = 'B';
  22.         }
  23.         public function serialize() {
  24.                 $aSerialized = parent::serialize();
  25.                 return serialize(array($this->varB, $aSerialized));
  26.         }
  27.         public function unserialize( $serialized ) {
  28.                 $temp = unserialize($serialized);
  29.                 $this->varB = $temp[0];
  30.                 parent::unserialize($temp[1]);
  31.         }
  32.         function foo(){
  33.                 echo $this->varA;
  34.         }
  35. }
  36.  
  37. $obj = new B();
  38. $obj->showVar();
  39.  



Мой вопрос, почему я получаю значение A::$varA вызывая B::showVar() ???

Воспользовался debug_backtrace() поместив ее в A::showVar(); и вот что мне вывело:

PHP:
скопировать код в буфер обмена
  1.  
  2. array(1) {
  3.   [0]=>
  4.   array(7) {
  5.     ["file"]=>
  6.     string(30) "C:\xampp\htdocs\serialize+.php"
  7.     ["line"]=>
  8.     int(40)
  9.     ["function"]=>
  10.     string(7) "showVar"
  11.     ["class"]=>
  12.     string(1) "A"
  13.     ["object"]=>
  14.     [b]object(B)[/b]#1 (2) {
  15.      ["varB":"B":private]=>
  16.       string(1) "B"
  17.       [b]["varA":private ]=>
  18.       string(1) "A"[/b]
  19.     }
  20.     ["type"]=>
  21.     string(2) "->"
  22.     ["args"]=>
  23.     array(0) {
  24.     }
  25.   }
  26. }
  27.  


Выходит, что несмотря на то что $varA - private, она все равно унаследдовалась ??? Не понял

И вопрос номер 2:
На сколько полезно и часто используемая вами SPL ???

Заранее всем спасибо Радость
 
 Top
Sail
Отправлено: 12 Сентября, 2016 - 09:00:40
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


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




p33t пишет:
Выходит, что несмотря на то что $varA - private, она все равно унаследдовалась ???

Посмотрите на класс B и найдите там метод showVar().
Вот он-то и унаследовался.
 
 Top
p33t
Отправлено: 12 Сентября, 2016 - 10:13:12
Post Id


Новичок


Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014  


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




Получается, что унаследовался сам алгоритм с уже имеющимся значением ??? Однако
B::showVar(){echo "A\n";} - в таком виде он уже был унаследован в классе В ???
 
 Top
OrmaJever Модератор
Отправлено: 12 Сентября, 2016 - 12:29:48
Post Id



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


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


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




Вы сильно буквально поняли наследование. Ничего не наследуется, есть просто вызов метода, если php не находит showVar в классе B то он идет искать его в класс А, там находит и вызывает, а метод showVar имеет полный доступ к приватным свойствам класса А, т.к. он сам оттуда.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
p33t
Отправлено: 12 Сентября, 2016 - 14:20:27
Post Id


Новичок


Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014  


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




Orma Javer - Спасибо вам огромное. !!!
Все коротко и ясно Радость
(Добавление)
Но как по мне, тут уже теряется весь смысл private свойств.
 
 Top
OrmaJever Модератор
Отправлено: 13 Сентября, 2016 - 00:22:28
Post Id



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


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


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




p33t пишет:
Но как по мне, тут уже теряется весь смысл private свойств.

нет. Доступа из вне к приватному свойству нет, с ним работает только метод описанный в этом классе. Суть приватных свойств не в том что бы скрыть какие-то данные, а что бы предотвратить доступ/изменение их, и с этим всё впорядке.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
p33t
Отправлено: 13 Сентября, 2016 - 10:27:47
Post Id


Новичок


Покинул форум
Сообщений всего: 40
Дата рег-ции: Окт. 2014  


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




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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB