Forum Webscript.Ru

Программирование => PHP => Тема начата: Алексей от 20 Декабря 2004, 18:31:57

Название: extendes && OOP
Отправлено: Алексей от 20 Декабря 2004, 18:31:57
Правило для PHP 4: Если класс не имеет конструктора, вызывается конструктор базового класса.

У меня есть главный класс DB:

DB{
   function DB(){
   //инициализация, соеденение с бд, выбор БД  
   }
}

и есть:

class pages extends DB{
//....
}

без конструктора.

Работаю:
$myDB = new DB;
//....
$pgs = new pages();

Исходя из вышепредставленного правила, получается, что у меня класс DB 2 раза инициализируется! Недавно эту ошибку обнаружил, хотя никаких реальных ошибок до этого нет и не было...
Очевидно, я не совсем до конца понял суть extends..

Правильно ли я понимаю, что теперь, когда мне нужно использовать в сценарии класс БД и класс отстраничиватель pages, то достаточно вызвать один раз pages и работать только с ним, т.к. он наследует от главного класса все функции и переменные этого класса и pages не имея конструктора сам инициализирует класс DB? Или же существует како-нибудь другое решение?
Просто у меня в классе pages используются методы из класса БД, в частности  - запросы к базе.
Название: extendes && OOP
Отправлено: hanslinger от 20 Декабря 2004, 18:52:38
У тебя все методы DB и конструктор тоже наследуются в pages. Поэтому DB отдельно надо инициализировать, только если ты с переменной $myDB собираешься работать отдельно. А так - для работы с $pgs - тебе оно не надо.
Название: extendes && OOP
Отправлено: Макс от 20 Декабря 2004, 22:33:49
Цитировать
Алексей:
что у меня класс DB 2 раза инициализируется!

нет, каждый объект у тебя инициализируется по разу, но код конструктора DB() у тебя выполняется 2 раза
Название: extendes && OOP
Отправлено: Алексей от 21 Декабря 2004, 08:40:10
ааа, понял!
Название: extendes && OOP
Отправлено: ThE0ReTiC от 21 Декабря 2004, 09:37:25
отсутствие конструктора у класса - нарушение парадигмы в принципе...
Название: extendes && OOP
Отправлено: UltraMax от 21 Сентября 2005, 20:07:33
Такой вопрос
из описания PHP документации


class A
{
    function A()
    {
        echo "I am the constructor of A.
\\n";
    }

    function B()
    {
        echo "I am a regular function named B in class A.
\\n";
        echo "I am not a constructor in A.
\\n";
    }
}

class B extends A
{
    function C()
    {
        echo "I am a regular
\\n";
    }
}

// Это вызов B() как конструктора.
$b = new B;

Цитировать
В PHP 3 функция B() в классе A станет конструктором в классе B, хотя это никак не предполагается. Правило PHP 3: \'Конструктор это функция с тем же именем, что и класс\'. PHP 3 не заботиться о том, определяется ли функция в классе B или наследуется.

Это изменено в PHP 4 путём модификации правила: \'Конструктор это функция с тем же именем, что и класс, в котором она определяется\'. Таким образом, в PHP 4 класс B может не иметь собственной функции-конструктора, и будет вызван конструктор базового класса, печатая \'I am the constructor of A.
\'.


Проверяю на своем PHP версии 4.3.10 получаю

I am B::example() and provide additional functionality.
I am A::example() and provide basic functionality.


Так кто чего наследует? В документации одно - в реальности другое...