#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: Я не могу ответить на ваш вопрос из-за отсутствия информации о том, что вы там делаете.