Наследование PHP: дочерний класс переопределяет родительскую переменную / свойство для использования в конструкторе

У меня есть (абстрактный) родительский класс, который должен обеспечивать функциональность во время создания. Дочерние классы могут переопределять свойства, используемые в конструкторе:

class Parent extends MiddlewareTest
{
    // abstract channel properties
    protected $title = NULL;
    protected $type = NULL;
    protected $resolution = NULL;

    function __construct() {
        parent::__construct();

        $this->uuid = $this->createChannel($this->title, $this->type, $this->resolution);
    }
}

class Child extends Parent
{
    // channel properties
    protected $title = 'Power';
    protected $type = 'power';
    protected $resolution = 1000;
}

Проблема в том, что переопределенные свойства не используются, когда Child::__construct() который не переопределяется работает ($this->createChannel называется с NULL параметры).

Возможно ли это в PHP или мне придется каждый раз прибегать к переопределению дочерних конструкторов для обеспечения желаемой функциональности?

Примечание: я видел свойства, совместно используемые дочерним и родительским классом в php, но это отличается, поскольку дочерние свойства назначаются не в конструкторе, а по определению.

Обновить

Оказывается, мой тестовый случай был неисправен. Поскольку MiddlewareTest был основан на модульном тесте SimpleTest, SimpleTest фактически - что я не осознавал - благодаря автозапуску создал сам класс Parent, который никогда не предназначался. Исправлено, если сделать родительский класс абстрактным.

Извлеченные уроки: создайте чистый тестовый пример и запустите его, прежде чем просить о помощи.

1 ответ

Решение

Я не уверен, как это происходит на вашем сервере. Я должен был сделать предположения о MiddlewareTest class, измените имена классов и добавьте несколько простых строк отладки, но с этим кодом:

<?php
/**
* I'm not sure what you have in this class.
* Perhaps the problem lies here on your side.
* Is this constructor doing something to nullify those properties?
* Are those properties also defined in this class?
*/
abstract class MiddlewareTest {
    // I assume this properties are also defined here
    protected $title = NULL;
    protected $type = NULL;
    protected $resolution = NULL;
    protected $uuid = NULL;

    public function __construct()
    {}

    protected function createChannel($title, $type, $resolution)
    {
        echo "<pre>" . __LINE__ . ": "; var_export(array($this->title, $this->type, $this->resolution)); echo "</pre>";
        echo "<pre>" . __LINE__ . ": "; var_export(array($title, $type, $resolution)); echo "</pre>";
        return var_export(array($title, $type, $resolution), true);
    }
}

// 'parent' is a keyword, so let's just use A and B
class A extends MiddlewareTest
{
    // abstract channel properties
    protected $title = NULL;
    protected $type = NULL;
    protected $resolution = NULL;

    function __construct() {
        parent::__construct();

        echo "<pre>" . __LINE__ . ": "; var_export(array($this->title, $this->type, $this->resolution)); echo "</pre>";
        $this->uuid = $this->createChannel($this->title, $this->type, $this->resolution);
        echo "<pre>" . __LINE__ . ": "; var_export($this->uuid); echo "</pre>";
    }
}

class B extends A
{
    // channel properties
    protected $title = "Power";
    protected $type = "power";
    protected $resolution = 1000;
}

$B = new B();
?>

Я получаю эти результаты:

37: array (
  0 => 'Power',
  1 => 'power',
  2 => 1000,
)

20: array (
  0 => 'Power',
  1 => 'power',
  2 => 1000,
)

21: array (
  0 => 'Power',
  1 => 'power',
  2 => 1000,
)

39: 'array (
  0 => \'Power\',
  1 => \'power\',
  2 => 1000,
)'

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

Не могли бы вы рассказать о вашем классе MiddlewareTest, который мог бы пролить свет на то, почему вы испытываете такое поведение?

Какую версию php вы используете?

Другие вопросы по тегам