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 и __constructor [2]

 PHP.SU

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


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

> Описание: почему свойства не наследуются , но при этом класс-наследник получает чо надо..
Конструктор
Отправлено: 25 Августа, 2011 - 14:25:26
Post Id



Частый гость


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


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




EuGen пишет:
Ради проверки задайте в классе-родителе другие значения и убедитесь, что от этого ничего не изменится.

Опять запутали...)
На самом деле я пробовал это делать... и действительно это не влияет на наследник..
Но как же это долбанный наследник подключается к баз данных, у которой есть пороль??!!
Ведь они нифига этот пароль не знает Не понял
Короче нафиг локалку,
пойду тестить на реальном хостинге заказчика )))) Радость

(Отредактировано автором: 25 Августа, 2011 - 14:27:14)



-----
Если все время идти вперед, до цели будет немного ближе..
 
 Top
EuGen Администратор
Отправлено: 25 Августа, 2011 - 14:27:31
Post Id


Профессионал


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


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




Конструктор пишет:
Но как же это долбанный наследник подключается к баз данных

Да Вы задаете значения в конструкторе класса. Уже трижды об этом написано. Вызывая parent::__construct() Вы и присваиваете значения. Только значения эти относятся к потомку и никак не связаны со значениями предка.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
iflight
Отправлено: 25 Августа, 2011 - 14:32:08
Post Id



Гость


Покинул форум
Сообщений всего: 119
Дата рег-ции: Март 2011  
Откуда: Россия, Сыктывкар


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




Вот что происходит:

1) Создаем объект класса db2
2) Запускается конструктор этого класса
3) конструктор db2 вызывает конструктор родительского класса
4) В конструкторе db1 переменным с логином и паролем присваиваются данные.
5) Так как класс db2 не знает таких переменных, которые описаны в конструкторе db1, то он создает новые переменные с таким же именами для класса db2 (т.к. указанно $this) и присваивает им соответствующие значения
6) дальше во всех методах класса используются созданные конструктором переменные
 
 Top
Конструктор
Отправлено: 25 Августа, 2011 - 14:33:10
Post Id



Частый гость


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


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




EuGen пишет:
никак не связаны со значениями предка.

тоесть подразумевается что как бы предка и нет,
и все происходит якобы в едином конструкторе наследника?
Тоесть

заменяется конструкцией
PHP:
скопировать код в буфер обмена
  1. $this->servername = 'localhost';
  2.                 $this->username = 'root';
  3.                 $this->password = 'root123';


Значит parent::__construct(); в конструкторе работает как include() в обычном коде?

(Отредактировано автором: 25 Августа, 2011 - 14:34:32)



-----
Если все время идти вперед, до цели будет немного ближе..
 
 Top
EuGen Администратор
Отправлено: 25 Августа, 2011 - 14:37:39
Post Id


Профессионал


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


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




Не как include, конечно, но в данном примере контекст - это объект-потомок. И все операции применятся к нему.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Конструктор
Отправлено: 25 Августа, 2011 - 14:42:45
Post Id



Частый гость


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


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




Всем спасибо, многое прояснили..
но одна проблема все же осталась..
и она мена сильно сбивала с толку..
1. Класс родитель работает только с правильными данными mysql_connect( $this->servername , $this->username , $this->password );
2. А класс наследник работает с любыми!!
проблема наверное частично и с настройками сервера базы данных..

(Отредактировано автором: 25 Августа, 2011 - 14:43:34)



-----
Если все время идти вперед, до цели будет немного ближе..
 
 Top
EuGen Администратор
Отправлено: 25 Августа, 2011 - 14:45:33
Post Id


Профессионал


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


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




Конструктор пишет:
А класс наследник работает с любыми!!

Поясните, что Вы имеете ввиду


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Конструктор
Отправлено: 25 Августа, 2011 - 14:53:48
Post Id



Частый гость


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


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




EuGen пишет:
Поясните, что Вы имеете ввиду

1. В классе родителе db1 (файл basa1.php) я ставлю пароль отбалды.. например $this->password = 'sdfs131231'
2. В классе наследнике db2 (файл basa2.php) я ниже пишу
PHP:
скопировать код в буфер обмена
  1. $x = new db2();
  2. $x -> delete_table( 'test' , 'test1' );

и он удачно запускается и удаляет таблицу.

3. Но при этом класс-родитель db1 (файл basa1.php)
запускается только с правильным паролем $this->password = 'root';
PHP:
скопировать код в буфер обмена
  1. $x = new db1();
  2. $x -> delete_db('test');

иначе при $this->password = 'sdfs131231' выдает ошибку
CODE (htmlphp):
скопировать код в буфер обмена
  1. Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'root'@'localhost' (using password: YES) in C:\xampp\htdocs\test.loc\www\basa1.php on line 21
  2. Could not connect: Access denied for user 'root'@'localhost' (using password: YES)

(Отредактировано автором: 25 Августа, 2011 - 15:11:37)



-----
Если все время идти вперед, до цели будет немного ближе..
 
 Top
EuGen Администратор
Отправлено: 25 Августа, 2011 - 15:13:36
Post Id


Профессионал


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


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




Значит, Вы по-прежнему ничего не поняли.
Ваш класс-наследник работает не с любыми данными, а с теми, которые указаны в __construct. Поскольку Вы используете конструктор родительского класса, то свойства дочернего берутся при вызове этого констуктора. Но свойства родительского не влияют на дочерний, так как не видны.
Если же использовать родительский класс, то свойства уже видны и вступают в силу. Оттого и ошибка.
То есть дочерний работает не с "любыми данными" а с теми, которые Вы указали в конструкторе. И как бы Вы не меняли определение родительских приватных свойств - это повлияет только на родительский, но не на дочерний класс.

P.S. вообще, весь Ваш пример - это показатель весьма неудачной организации классов и применения ООП вцелом.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Конструктор
Отправлено: 25 Августа, 2011 - 15:16:54
Post Id



Частый гость


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


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




EuGen пишет:
Ваш класс-наследник работает не с любыми данными, а с теми, которые указаны в __construct.

Ну как же не слюбыми? Я же в верхнем сообщении привел пример, что ввожу в __construct
любые данные, и наследник с ними работает..!
PHP:
скопировать код в буфер обмена
  1.  
  2. class db1
  3. {
  4.         private $servername;
  5.         private $username;
  6.         private $password;
  7.         private $database_name;
  8.         function __construct()
  9.         {
  10.                 $this->servername = 'localhost';
  11.                 $this->username = 'root';
  12.                 $this->password = 'пароль от балды'; //меняем значение!!
  13.         }

Больше никгде не будет строчки $this->password = 'root';
Но наследник пашет, и ни у родителя ни у наследника нет нужногно пароля к базе!!

(Отредактировано автором: 25 Августа, 2011 - 15:19:25)



-----
Если все время идти вперед, до цели будет немного ближе..
 
 Top
EuGen Администратор
Отправлено: 25 Августа, 2011 - 15:18:51
Post Id


Профессионал


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


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




Конструктор пишет:
В классе родителе db1 (файл basa1.php) я ставлю пароль отбалды.. например $this->password = 'sdfs131231'

Но оно - приватно. И оно не видно потомку. Потомок получит то значение свойства, которое установится в его конструкторе при вызове parent::__construct()


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Конструктор
Отправлено: 25 Августа, 2011 - 15:20:49
Post Id



Частый гость


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


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




EuGen пишет:
Потомок получит то значение свойства, которое установится в его конструкторе при вызове parent::__construct()

тут тоже нет правильных свойств... их нет нигде в коде,
но он работает!


-----
Если все время идти вперед, до цели будет немного ближе..
 
 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