Должен ли я написать конструктор для расширенного класса?

#php #class

#php #класс

Вопрос:

Родительский класс имеет такой конструктор:

 function CD_Log( $id = false ) {
    $this->__construct( $id );
}

function __construct( $id = false ) {
    global $cd;

    if ( !empty( $id ) ) {
        $this->id = $id;
        $this->populate();
    }
}
 

В расширенном классе я хочу сохранить часть родительской переменной и дочерней переменной в другое место, также не будет использоваться функция populate() . В остальном дочерний элемент создается так же, как и родительский. Должен ли я написать конструктор для дочернего элемента?

Ответ №1:

Если вы следуете ООП, как сейчас, вам следует удалить глобальный вызов для $cd, установите его в качестве переменной-члена родительского или дочернего класса.

Конструкторы, как я видел, обычно используются, обычно вызываются при создании экземпляра объекта, а не через другой метод того же класса, как это делает метод CD_Log.

Например:

 $myCdObject = new MyCdClass(); // Automatically calls constructor
$myCdObject->Cd_Log($string);
 

В приведенном выше примере вы убедитесь, что метод CD_Log имеет дело только с log логикой. Если вы не сделаете CD_Log статической функцией, вы можете создать экземпляр класса внутри:

 public static function CD_Log($id)
{
    $myCdObject = MyCdClass(); // Automatically calls constructor

    // Continue with `log` logic
}
 

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

 class parent
{
    public function __construct($id)
    {
        $this->id = $id;
    }
}

class child extends parent
{
    public function __construct($id)
    {
        // Going to take advantage of shared logic
        parent::__construct($id);

        // Now lets do some child class specific stuff
    }
}
 

Комментарии:

1. Спасибо! кстати, должен ли я использовать метод extrends, если дочернему элементу не нужны родительские функции, нужен только родительский var для выполнения других заданий, когда родитель делает свои вещи?

2. Если классы будут совместно использовать какие-либо атрибуты, будь то переменные-члены или методы, лучше всего расширить.

3. Хотя вы все написали правильно — фраза «Если вы используете ООП» режет мне глаза. ООП нельзя использовать, это не инструмент, это парадигма. Вы можете следовать ему, но не использовать .

Ответ №2:

Если вам нужно — вы можете переопределить конструктор в дочернем классе. Но имейте в виду, что в этом случае родительский конструктор не будет вызываться автоматически, и вам нужно сделать это вручную parent::_construct()

Комментарии:

1. @zerkmas, спасибо! Итак, я напишу конструктор для дочернего элемента. Цель дочернего элемента — использовать родительский var для выполнения других заданий при вызове родительского. У него будет свой собственный идентификатор, поэтому я должен дать идентификатору ребенка другое имя, верно?

2. @Jenny: Я не могу ответить на ваш вопрос из-за отсутствия информации о том, что вы там делаете.