2013-08-01 7 views
4

У меня есть (абстрактный) родительский класс, который должен обеспечивать функциональность во время строительства. Наследуемые классы могут переопределить свойства, используемые в конструкторе:Наследование 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 или мне придется каждый раз прибегать к переопределению дочерних конструкторов для обеспечения желаемой функциональности?

Примечание: я видел Properties shared between child and parents class in php, но это другое, поскольку дочерние свойства не назначаются в конструкторе, но по определению.

Update

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

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

ответ

2

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

<?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 работает?

+0

Извините за отсутствие рабочего примера. Ваш намек заставил меня начать строить один, и я вижу вашу точку зрения. Попытка найти различия сейчас. – andig