вопрос по свойствам родителя/наследника

Духовность™

Продвинутый новичок
вопрос по свойствам родителя/наследника

PHP:
abstract class parent 
{
    protected $sort_vars = array
    (
        'field_name' => 'id',
        'sort_order' => 'DESC',
    );
}
в наследнике, как правило, данный массив надо предопределять. как правильно делать это - на уровне декларации потомка:
PHP:
class child extends parent 
{
    protected $sort_vars = array
    (
        'other_field_name' => 'id',
        'other_sort_order' => 'ASC',
    );
}
или затирать parent-значение в конструкторе:
PHP:
class child extends parent 
{
    public function __construct()
    {
        $this->sort_vars = array (
                'other_field_name' => 'id',
                'other_sort_order' => 'ASC',
        );
    };
}
 

Духовность™

Продвинутый новичок
я тоже. + конструктор в наследнике явно определять не хочу.
меня просто смутил тот факт, что приходится каждый раз модификатор доступа определять (плодить) ...
 

tz-lom

Продвинутый новичок
может стать критичным то что унаследованные классы не обязаны выполнять конструктор родителя
 

korchasa

LIMB infected
Автор оригинала: tz-lom
может стать критичным то что унаследованные классы не обязаны выполнять конструктор родителя
Они ВСЕГДА обязаны выполнять конструктор родителя.
 

Adelf

Administrator
Команда форума
как вам такой вариант развития событий(он редкий, но возможный):
сначала все декларацией. Потом через какое-то время выясняем, что в родителе для инициации этих данных нужна какая-то логика. И инициация выносится в конструктор :) Наследники немного "ломаются"
 

korchasa

LIMB infected
Тогда в конструкторе нужно проверять наличие данных, и не делать инициализацию.
 

tz-lom

Продвинутый новичок
Они ВСЕГДА обязаны выполнять конструктор родителя.
правда??
а что выведет такой код:?

PHP:
<?php                                                                                                                                                           
                                                                                                                                                                
class A {                                                                                                                                                       
 function __construct(){                                                                                                                                        
   echo "created A\n";                                                                                                                                          
 }                                                                                                                                                              
}                                                                                                                                                               
                                                                                                                                                                
class B extends A {                                                                                                                                             
 function __construct(){
   echo "created B\n";
 }
}

class C extends B {
}


$a = new A();
$b = new B();
$c = new C();
 

tz-lom

Продвинутый новичок
Что программист писавший класс B не молодец.
Правда?
Вообщем то согласно документации это нормальное явление,и никаких предупреждений здесь не полезет
Более того,с точки зрения ООП эта штука ничего не портит,потому что по сути конструктор это тот же метод,его наследование стакающимся быть не обязано
 

korchasa

LIMB infected
Правда?
Вообщем то согласно документации это нормальное явление,и никаких предупреждений здесь не полезет
Более того,с точки зрения ООП эта штука ничего не портит,потому что по сути конструктор это тот же метод,его наследование стакающимся быть не обязано
С точки зрения объектов, конструктор выполняется всегда. Если ты его не выполняешь, ты нарушаешь контракт родительского класса.

Ситуации "ой, у меня все сломалось после обновления" они не редкость.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
С точки зрения объектов, конструктор выполняется всегда. Если ты его не выполняешь, ты нарушаешь контракт родительского класса.
С точки зрения виноват программист С, т.к. "или ты перекрыл нужные методы своим функционалом, или унаследовал."
Если не перекрыл - сам дурак.
 

dimagolov

Новичок
Тут все от непонимания разницы между обязаностями конструктора и метода инициализации.
Конструктор обязан инициализировать объект и ничего более. Чтобы все остальные методы объекта могли корректно работать. Соответственно конструктор наследника обязан инициализировать новые поля в своем классе и вызывать конструктор предка. Если мы не вызываем конструктор предка, то можем поломать его данные и заставить код предка вести себя непредсказуемо.
Если же у нас есть некотарая "инициализация" объекта после его создания, например подгрузка его данных из БД, то ее стоит выделить в отдельный метод и вызывать отдельно. Например для того, чтобы объект можно было инициализировать как-то по-другому, скажем не из БД, а клонированием другого объекта.
 

Духовность™

Продвинутый новичок
Если же у нас есть некотарая "инициализация" объекта после его создания, например подгрузка его данных из БД, то ее стоит выделить в отдельный метод и вызывать отдельно.
а насколько правильным будет такой подход:

PHP:
abstract class Base {
    function __construct() {
        $this->init();
    }

    abstract function init();

    public function printVar() {
        echo $this->var;
    }
}

class Сoncrete extends Base {
    function init() {
        $this->var = 'value';
    }
}
Получается, что конструктор базового класса мы не трогаем, соответственно не боимся, что если завтра изменятся параметры конструктора, не придется переписывать кучу классов-потомков.
 

Adelf

Administrator
Команда форума
Не надо выдумывать второй конструктор. С ним будут те же проблемы.
 
Сверху