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

 PHP.SU

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


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

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



Частый гость


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


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




Я написал 2 класса. Класс db2 наследуется из класса db1 :
PHP:
скопировать код в буфер обмена
  1. <?PHP
  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 = 'root';
  13.         }
  14. /* *****************************************
  15.          * Функция удаления базы данных.
  16.          * В функцию передается имя базы данных.
  17.          */
  18.         function delete_db($database_name)
  19.         {
  20.                 $this->database_name = $database_name;
  21.                 $con = mysql_connect( $this->servername , $this->username , $this->password );
  22.                         if (!$con)
  23.                         {
  24.                                 die( 'Could not connect: '.mysql_error() );
  25.                         }              
  26.                 /* Delete database */  
  27.                 if (mysql_select_db($this->database_name, $con))
  28.                 {
  29.                         $sql = "DROP DATABASE ".$this->database_name;
  30.                         mysql_query( $sql , $con );    
  31.                 }
  32.                         else
  33.                         {
  34.                                 return 0;              
  35.                         }
  36.         mysql_close($con);     
  37.         }
  38. /* *****************************************/  
  39. }
  40. ?>

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. require_once 'basa1.php';
  3. class db2 extends db1
  4. {
  5.         private $table_name;
  6.         function __construct()
  7.         {
  8.                 parent::__construct();
  9.                 echo 'Это наследуемый класс <br />';
  10.         }
  11.        
  12. /* ****************************************
  13.          * Функция удаления таблицы из базы данных.
  14.          * В функцию передается имя базы данных и таблицы.
  15.          */
  16.         function delete_table($database_name , $table_name)
  17.         {
  18.                 $this->database_name = $database_name;
  19.                 $this->table_name = $table_name;
  20.                 $con = mysql_connect( $this->servername , $this->username , $this->password );
  21.                         if (!$con)
  22.                         {
  23.                                 die( 'Could not connect: '.mysql_error() );
  24.                         }              
  25.                 /* Delete table */     
  26.                 if (mysql_select_db(($this->database_name), $con))
  27.                 {
  28.                         $sql = "DROP TABLE ".$this->table_name;
  29.                         mysql_query( $sql , $con );    
  30.                 }
  31.                         else
  32.                         {
  33.                                 echo 'База не выбрана';
  34.                                 return 0;              
  35.                         }
  36.         mysql_close($con);     
  37.         }      
  38. /**************************************/
  39. }
  40.  
  41. $x = new db2();
  42. $x -> delete_table( 'test' , 'test1' );
  43. ?>

*****
Вопрос: каким образом работает 2й класс если он использует свойства родителя?? Ведь у родителя все свойства Privat !!
private $servername;
private $username;
private $password;

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



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


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


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


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




А оно и не изменяет родительские свойства. Они недоступны потомку.
Во время обращения к свойствам в первый раз создаются свойства у объекта класса db2, которые просто называются так же. Но общего со свойствами db1 они не имеют.
Сравните:
PHP:
скопировать код в буфер обмена
  1. class A
  2. {
  3.    private $foo;
  4.    function __construct()
  5.    {
  6.       $this->foo='bar';
  7.    }
  8. }
  9.  
  10. class B extends A
  11. {
  12.    function __construct()
  13.    {
  14.       parent::__construct();
  15.    }
  16.    function baz()
  17.    {
  18.       $this->foo='accessed';
  19.       echo($this->foo);
  20.    }
  21. }
  22.  
  23. $B = new B();
  24. $B->baz();

И
PHP:
скопировать код в буфер обмена
  1. class A
  2. {
  3.    private $foo;
  4.    function __construct()
  5.    {
  6.       $this->foo='bar';
  7.    }
  8. }
  9.  
  10. class B extends A
  11. {
  12.    function __construct()
  13.    {
  14.       parent::__construct();
  15.    }
  16.    function baz()
  17.    {
  18.       //$this->foo='accessed';
  19.       echo($this->foo);
  20.    }
  21. }
  22.  
  23. $B = new B();
  24. $B->baz();

При включенном error_reporting(2047) Вы увидите:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Notice: Undefined property: B::$foo

во втором случае. В первом же выведется "accessed"


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



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Конструктор пишет:
каким образом работает 2й класс если он использует свойства родителя?? Ведь у родителя все свойства Privat !!

Создаёт свои собственные. У родителя - private, о них наследник не знает вообще и думает, что их и нету. Потому создаёт свои.


-----
PostgreSQL DBA
 
 Top
Конструктор
Отправлено: 25 Августа, 2011 - 13:56:05
Post Id



Частый гость


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


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




EuGen пишет:
..

Тоесть у меня проблема с базой данных? (тестирую на веб-сервере XAMP)
И она дает уделить таблицу из базы с нулевыми паролем и юзером?
Ведь как то класс-наследник всеже удаляет таблицы..
(ps. пишу проект для крупной банковской системы, поэтому безопасность очень актуальна )) Ниндзя )

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



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


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


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


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




БД тут ни при чем.
Ваш класс-потомок создает свои свойства - они не имеют ничего общего со свойствами родительского класса (они попросту не видны потомку)


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



Частый гость


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


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




EuGen пишет:
БД тут ни при чем.
Ваш класс-потомок создает свои свойства - они не имеют ничего общего со свойствами родительского класса (они попросту не видны потомку)

Тогда как происходит подключение если наследник не знает данных подключения?
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. require_once 'basa1.php';
  3. class db2 extends db1
  4. {
  5. .............
  6. $con = mysql_connect( $this->servername , $this->username , $this->password ); // ??????
  7. ..........
  8.  

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



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



Гость


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


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




Затупил (:


я терь боюсь онлайновскими банковскими услугами пользоваться

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

 
 Top
Конструктор
Отправлено: 25 Августа, 2011 - 14:10:02
Post Id



Частый гость


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


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




iflight пишет:
ы же в наследнике их и присваевете

Присваивание это когда есть переменная и есть значение которое ей присваивается.
А во втором классе что присваивается этим свойствам ? >>( $this->servername , $this->username , $this->password );
ведь в этом классе нет нужных значений..
Дело в том что я писал это подключение не зная что privat родителя не наследуестя
и хотел что все данны шли от родителя.. а теперь не пойму как все таки это подключение к базе данных происходит..
Может тут браузер виноват? кеш какой нибудь.. не знаю как это назвать..

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



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



Гость


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


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




Конструктор Выполняется конструктор, наследованный и в нем создаются новые переменные класса наследника
При создание объекта класса насследника выполняется вот этот код:
PHP:
скопировать код в буфер обмена
  1.    function __construct()
  2.         {
  3.                 $this->servername = 'localhost';
  4.                 $this->username = 'root';
  5.                 $this->password = 'root';
  6.         }


При выполннии кода создаются НОВЫЕ переменные класа-наследника.

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

 
 Top
Конструктор
Отправлено: 25 Августа, 2011 - 14:14:22
Post Id



Частый гость


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


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




iflight пишет:
новые переменные класса наследника

с какими значениями?

тоесть все таки переменные наследуются?

Пусть это уже новые переменные, но они с теме же именами и значениями??

этот конструктор и сбиватет меня с толку..
работает он в наследнике или нет?
PHP:
скопировать код в буфер обмена
  1. function __construct()
  2.         {
  3.                 $this->servername = 'localhost';
  4.                 $this->username = 'root';
  5.                 $this->password = 'root';
  6.         }

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



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


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


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


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




Переменные создадутся, но они будут относиться к классу-наследнику и не будут иметь ничего общего с классом-предком.
То есть вызывая parent::__construct() Вы создадите свойства в контексте текущего объекта. Родительские Вы не затронете.


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



Частый гость


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


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




EuGen пишет:
Переменные создадутся, но они будут относиться к классу-наследнику и не будут иметь ничего общего с классом-предком.
То есть вызывая parent::__construct() Вы создадите свойства в контексте текущего объекта. Родительские Вы не затронете.

Если я правильно Всех понял то:
1. Создаются новые переменные подключения .
2. Эти новые переменные все таки получают значения приватных переменных родителя.
3. Но при этом ЭТИ ЗНАЧЕНИЯ СТАНОВЯТСЯ PUBLIC ((( А?!

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



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



Гость


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


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




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

Если бы вы в классе родителе сразу определяли значения, например так:

PHP:
скопировать код в буфер обмена
  1. class db1
  2. {
  3.         private $servername = 'localhost';
  4.         private $username = 'root';
  5.         private $password = 'root';
  6.  //другой код
  7. }

Тогда бы была ошибка, ибо эти значения класс-наследник не видит.


Наследник получает не значения приватных переменных, а явно присвоенные ему в конструкторе значения.

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

 
 Top
EuGen Администратор
Отправлено: 25 Августа, 2011 - 14:22:28
Post Id


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


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


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




Конструктор пишет:
2. Эти новые переменные все таки получают значения приватных переменных родителя.

Нет. Свойства создаются - это верно, но они создаются в контексте текущего объекта и стало быть являются его свойствами. Ни о каком наследовании тут нет и речи.
Ради проверки задайте в классе-родителе другие значения и убедитесь, что от этого ничего не изменится.


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



Гость


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


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




EuGen так изменится же, он же наследует весь конструктор, в котором присвоение, а в контексте нового класса создание переменных и присвоение значений?
 
 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