Наследование в PHP

scorpion-ds

Новичок
Есть такая задача:

Базовый класс:

PHP:
abstract class CSProperties {
   protected $ID;
   protected function __construct($id) {
       $this->ID = $id;
   }

    static function getInstance($id)	{
    //эта функция возвращает объект согласно его типу		
		modelProperties::$pdo = MAIN_CLASS::cs()->pdo;
		if(self::$PropertiesTypes == array())
			self::$PropertiesTypes = modelProperties::getTypes();
			
		switch (self::$PropertiesTypes[$id])	{
			case 'text'		:	{
				return new CSPropertiesText($id);
			}break;
			case 'textarea'		:	{
				return new CSPropertiesTextarea($id);
			}break;
			case 'tinymce'		:	{
				return new CSPropertiesTinymce($id);
			}break;
			case 'select'		:	{
				return new CSPropertiesSelect($id);
			}break;
			case 'file'		:	{
				return new CSPropertiesFiles($id);
			}break;
			case 'image'		:	{
				return new CSPropertiesImage($id);
			}break;
			case 'images'		:	{
				return new CSPropertiesImages($id);
			}break;
		}
		
	}

   //общий функионал
}
далее:
PHP:
class CSPropertiesText extends CSProperties {
	
	public function __construct($id) {
		parent::__construct ($id);
	}
    //функционал для текстового поля
}

class CSPropertiesSelect extends CSProperties {
	
	public function __construct($id) {
		parent::__construct ($id);
	
	}
     //функционал для select поля
}
далее, идут другие типы свойств.

При это в системе, есть "каталог" и "менеджер пользователей" (это примерно, могут быть разные модули), свойства типа CSPropertiesText и CSPropertiesSelect одинаковые, но другой CSProperties, выглядит примерно так:

PHP:
abstract class CatProperties extends CSProperties {
		
	protected function __construct($id) {
		parent::__construct($id);
	}
	
	static function create($name, $title, $typeData, $typeDisplay, $refID)	{
		
		//***
		
	}
	
	public function delete()	{
		
		//***
		
	}
	
}
здесь, переопределяются функции создания и удаления, все бы ни чего, но!
Когда делается вызов, типа:
$prop = CatProperties::getInstance($id);
то возвращается объект который нам нужен, но вот базовый класс получаем не CatProperties, а CSProperties.

Не могу понять, как мне добиться создания объектов типа CSPropertiesText и т.п., не от CSProperties, а от CatProperties, можно было бы просто скопировать функционал CSPropertiesText в CatPropertiesText и делать у него родителя от CatProperties, но это ведь не решение, так как код там одинаковый будет.
 

vasa_c

Новичок
Когда непонятно, как реализовать архитектурную задумку, в большинстве случаев помогает пересмотр архитектуры.
 

fixxxer

К.О.
Партнер клуба
Архитектурная ошибка - базовый класс знает о производных.
 

AmdY

Пью пиво
Команда форума
правильно, потому что у тебя стати метод, от этого спагетти статических вызовов нужно избавиться
 

scorpion-ds

Новичок
правильно, потому что у тебя стати метод, от этого спагетти статических вызовов нужно избавиться
В общем-то избавление от "getInstance" проблему особо не решит, так или иначе придется создавать объекты CSPropertiesText, а они то имееют родительский класс CSProperties, а CatProperties, вот если бы можно было как динамически указывать от какого класса наследовать ...

Как вариант, позволить создавать объекты типа CatProperties, от родительского класса CSProperties, в свою очередь объекты типа CSPropertiesText, не являются наследниками класса CSProperties, а просто отельными классами которые CSProperties, вызывает (создаем внутри себя) по мере необходимости, правда таким образом получится два объекта на одно свойство, вроде "CSProperties"->"CSPropertiesText"->"updateValue()"
 

fixxxer

К.О.
Партнер клуба
Если хочется унаследоваться от двух классов, значит, что-то не так с архитектурой. Судя по названиям классов

CatProperties

CSProperties

это неудивительно. :)

Попробуй для начала дать такие названия, чтобы тут все по одним этим названиям поняли, о чем у тебя речь. (Сейчас и с кодом непонятно). А там будем думать дальше :)
 

scorpion-ds

Новичок
CSProperties - это бызовый вариант класса, приставка CS это что-то типа фирменного знака, для общих файлов, а подход там такой:

Перед CSProperties есть класс, CSForm он отвечает только за саму форму, ее рендеринг и отправку, в этот класс через функцию addElement, передаются элементы формы, тоже объекты типа CSFormElement, ну и их наследники согласно всевозможным элементам формы, к примеру CSFormElementUploadify загружает файл(ы) и сохраняет во временной папке, на выходе CSForm возвращает массив переданных данных, которые принимает уже CSProperties, он обрабатывает полученные данные, к примеру если было загружено изображение, то он порежет его согласно правилам, в итоге на выходе CSProperties мы также получаем массив, которые уже должен быть вставлен в БД или сохранен еще где-то. Все это работает на Ajax.

CSProperties - в какой-то мере контролер, название такое имеет лишь, потому, что все началось с настраиваемых полей для каталога (назывался тогда CatProperties, Cat - типа каталог), теперь же появилась задача создать такие же настраиваемые поля в "менеджере пользователей", времени критично мало, а на этом механизме надо сдать сразу три реальных проекта, один из них до конца недели.

За выходные решил пойти более простым путем, при создании объекта CSProperties, я кроме его ИД буду передавать, дополнительный не обязательный объект, который будет расширять функции create & delete.
 
Сверху