2010-01-21 3 views
4

У меня есть иерархия классов в PHP 5.2.9.Унаследованные свойства массива PHP

Базовый класс имеет защищенное свойство, которое является ассоциативным массивом.

Детские классы могут добавлять некоторые элементы в массив.

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

Каков наилучший способ добавить элементы к свойству в дочерних классах, чтобы объявление нового ребенка было максимально простым?

<?php 
     class A { 
       protected $myproperty = array (
         'A1' => 1, 
         'A2' => 2 
       ); 

       function myprint() 
       { 
         print_r($this->myproperty); 
       } 
     }; 

     class B extends A { 
       // add 'B1', 'B2' to myproperty 
     }; 

     class C extends B { 
       // add 'C1', 'C2' to myproperty 
     }; 

     $c = new C(); 
     $c->myprint(); 
     // The line above should print A1, A2, B1, B2, C1, C2 
?> 

В идеале я хотел бы сделать это для разработчиков, как просто, как объявить переменный или частную собственность, не имея необходимость CopyPaste коды.

ответ

3

Сделать использование constructors унаследованных классов, для класса В это стало бы что-то вроде этого:

class B extends A { 
    function __construct() { 
     parent::__construct();    // Call constructor of parent class 
     array_push($myproperty, "B1", "B2"); // Add our properties 
    } 
} 

То же самое относится к классу С.

Если у вас есть много унаследованных классов, или хотите предоставить как можно больше поддержки, вы можете поместить этот код в некоторую функцию. Поэтому другим разработчикам нужно только вызвать эту функцию в своем конструкторе, чтобы «зарегистрировать» своего ребенка.

+0

Это именно то, о чем я впервые подумал, но есть ли более простой способ? – Quassnoi

+0

Вы можете попытаться автоматизировать этот процесс с помощью get_class() и добавить свойства в конструктор класса A. Но я полагаю, что это намного сложнее (для вас как минимум). – Veger

+0

Как это сделать с помощью 'get_class()'? – Quassnoi

Смежные вопросы