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 :: Версия для печати :: Помогите разобраться с private и __constructor [2]
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Помогите разобраться с private и __constructor

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

16. Конструктор - 25 Августа, 2011 - 14:25:26 - перейти к сообщению
EuGen пишет:
Ради проверки задайте в классе-родителе другие значения и убедитесь, что от этого ничего не изменится.

Опять запутали...)
На самом деле я пробовал это делать... и действительно это не влияет на наследник..
Но как же это долбанный наследник подключается к баз данных, у которой есть пороль??!!
Ведь они нифига этот пароль не знает Не понял
Короче нафиг локалку,
пойду тестить на реальном хостинге заказчика )))) Радость
17. EuGen - 25 Августа, 2011 - 14:27:31 - перейти к сообщению
Конструктор пишет:
Но как же это долбанный наследник подключается к баз данных

Да Вы задаете значения в конструкторе класса. Уже трижды об этом написано. Вызывая parent::__construct() Вы и присваиваете значения. Только значения эти относятся к потомку и никак не связаны со значениями предка.
18. iflight - 25 Августа, 2011 - 14:32:08 - перейти к сообщению
Вот что происходит:

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

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

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


Значит parent::__construct(); в конструкторе работает как include() в обычном коде?
20. EuGen - 25 Августа, 2011 - 14:37:39 - перейти к сообщению
Не как include, конечно, но в данном примере контекст - это объект-потомок. И все операции применятся к нему.
21. Конструктор - 25 Августа, 2011 - 14:42:45 - перейти к сообщению
Всем спасибо, многое прояснили..
но одна проблема все же осталась..
и она мена сильно сбивала с толку..
1. Класс родитель работает только с правильными данными mysql_connect( $this->servername , $this->username , $this->password );
2. А класс наследник работает с любыми!!
проблема наверное частично и с настройками сервера базы данных..
22. EuGen - 25 Августа, 2011 - 14:45:33 - перейти к сообщению
Конструктор пишет:
А класс наследник работает с любыми!!

Поясните, что Вы имеете ввиду
23. Конструктор - 25 Августа, 2011 - 14:53:48 - перейти к сообщению
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)
24. EuGen - 25 Августа, 2011 - 15:13:36 - перейти к сообщению
Значит, Вы по-прежнему ничего не поняли.
Ваш класс-наследник работает не с любыми данными, а с теми, которые указаны в __construct. Поскольку Вы используете конструктор родительского класса, то свойства дочернего берутся при вызове этого констуктора. Но свойства родительского не влияют на дочерний, так как не видны.
Если же использовать родительский класс, то свойства уже видны и вступают в силу. Оттого и ошибка.
То есть дочерний работает не с "любыми данными" а с теми, которые Вы указали в конструкторе. И как бы Вы не меняли определение родительских приватных свойств - это повлияет только на родительский, но не на дочерний класс.

P.S. вообще, весь Ваш пример - это показатель весьма неудачной организации классов и применения ООП вцелом.
25. Конструктор - 25 Августа, 2011 - 15:16:54 - перейти к сообщению
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';
Но наследник пашет, и ни у родителя ни у наследника нет нужногно пароля к базе!!
26. EuGen - 25 Августа, 2011 - 15:18:51 - перейти к сообщению
Конструктор пишет:
В классе родителе db1 (файл basa1.php) я ставлю пароль отбалды.. например $this->password = 'sdfs131231'

Но оно - приватно. И оно не видно потомку. Потомок получит то значение свойства, которое установится в его конструкторе при вызове parent::__construct()
27. Конструктор - 25 Августа, 2011 - 15:20:49 - перейти к сообщению
EuGen пишет:
Потомок получит то значение свойства, которое установится в его конструкторе при вызове parent::__construct()

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

 

Powered by ExBB FM 1.0 RC1