Наследование 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 вы используете?