Хуки и расширение функции.

pilot911

Новичок
Хуки и расширение функции.

Господа, такой сакраментальный вопрос по хукам, расширяющим функции.


Задача: необходимо обеспечить возможность расширения функциональности модуля, не переписывая его исходный код. Необходимо также каким-то образом вести учёт объявленных точек расширения, предоставляя обзор их текущего набора. Что из себя должна представлять конкретная точка расширения - объект, метод или что-то другое?


Например, есть класс, выводящий поля из таблицы пользователя. Один экстеншен добавляет в эту таблицу поле "money" , второй - поле "phone".

Как в классе, формирующем HTML о пользователе, лучше обработать новые поля таблицы ?

До сего момента делал так:

в конфиге первого экстеншена писал
PHP:
	loadconfigs::extendFunction('page_manage'/* оригинальный класс вывода HTML */, 'page_manage_ext_1', 'main');
в конфиге второго
PHP:
	loadconfigs::extendFunction('page_manage'/* оригинальный класс вывода HTML */, 'page_manage_ext_2', 'main');
класс loadconfigs заполнял массив

$GLOBALS['FUNCTION_EXT']['page_manage']['main'][] = 'page_manage_ext_1';
$GLOBALS['FUNCTION_EXT']['page_manage']['main'][] = 'page_manage_ext_2';


и потом обработка новых полей шла из функции
PHP:
class page_manage {

    function main() {
		// формирование стандартных полей
		// ............
	
		$this->extendFunction('main');
	}

}



PHP:
	function	extendFunction($function, &$args=array())	{
		$current_class	=	get_class($this);
		
		if (isset($GLOBALS['FUNCTION_EXT'][$current_class][$function]))	{
			foreach($GLOBALS['FUNCTION_EXT'][$current_class][$function] as $k=>$class)	{
				if (method_exists($class, $function))	{
					$args	=	call_user_func_array(array($class, $function), array(array('pObj'=>$this,'params'=>$args)));
				}
			}
		}
	}

получается так, что в каждом классе page_manage_ext_1, page_manage_ext_2 вызывается функция main, которая добавляет через шаблонизатор новые поля в HTML.
 

cDLEON

Онанист РНРСlub
Мда...Быдло-стиль рулит...
Нахрена ты используешь классы, если всё что можно хранишь в глобалах ?
 

pilot911

Новичок
Автор оригинала: cDLEON
Мда...Быдло-стиль рулит...
Нахрена ты используешь классы, если всё что можно хранишь в глобалах ?
в том-то и вопрос, как сделать красиво ?

-~{}~ 10.11.08 19:44:

:(
 

HraKK

Мудак
Команда форума
pilot911
Красиво - строить нормальную архитектуру с overload
 

fixxxer

К.О.
Партнер клуба
почитай наконец книги про object oriented design и design patterns.
 

HraKK

Мудак
Команда форума
Martin Fowler - Guide to PHP Design Patterns
А после
Martin Fowler - Refactoring
 

fixxxer

К.О.
Партнер клуба
ну для начала классика жанра
Design Patterns: Elements of Reusable Object-Oriented Software (aka GoF)
Martin Fowler, Patterns of Enterprise Application Architecture
 

pilot911

Новичок
Автор оригинала: HraKK
pilot911
Красиво - строить нормальную архитектуру с overload
нарыл по теме ссылка

Extension (ExtensionPoint) и Hook (HookPoint) - в чём принципиальная разница, или это псевдонимы одного и того же определения?

Всё о принципах расширения - учёт, организация, наимование.

Задача: необходимо обеспечить возможность расширения функциональности модуля, не переписывая его исходный код. Необходимо также каким-то образом вести учёт объявленных точек расширения, предоставляя обзор их текущего набора. Что из себя должна представлять конкретная точка расширения - объект, метод или что-то другое?
 

HraKK

Мудак
Команда форума
Martin Fowler, Patterns of Enterprise Application Architecture
кстате это тоже в обязательном, да.

pilot911
Кран вентильный для форсирования автомибиля куда надо вставить в левый бардачек или на крышу?
 

pilot911

Новичок
Автор оригинала: HraKK
кстате это тоже в обязательном, да.

pilot911
Кран вентильный для форсирования автомибиля куда надо вставить в левый бардачек или на крышу?
ты в своей системе что используешь: Extension (ExtensionPoint) или Hook (HookPoint) ?
 

HraKK

Мудак
Команда форума
Ты в автомашине используешь фрезерный или токарный станок
 

HraKK

Мудак
Команда форума
не увожу твой ответ на мой вопрос будет ответом на твой вопрос
 

pilot911

Новичок
хорошо, спрошу конкретнее... можно ли в твоей системе вывести в стандартном модуле в админке новое поле из таблицы без модификации модуля ?
 

HraKK

Мудак
Команда форума
Ты можешь на автомобиле выполнить мертвую петлю?
 

pilot911

Новичок
ответ отрицательный... вот так всегда.. а как дышал.. как дышал..
 

HraKK

Мудак
Команда форума
Логично что отрицательный, ведь автомобиль не преднозначен выполнять мертвую петлю. И изменение модуля не преднозначенно проводиться без изменения модуля. Там где ты подменяешь функцию, и кладешь ее непонятно куда где и что. Я сделаю overload 1 функции. Ясно и прозрачно. Ты тоже именяешь код модуля только через узкую и кривую жопу.
 

pilot911

Новичок
Автор оригинала: HraKK
Логично что отрицательный, ведь автомобиль не преднозначен выполнять мертвую петлю. И изменение модуля не преднозначенно проводиться без изменения модуля. Там где ты подменяешь функцию, и кладешь ее непонятно куда где и что. Я сделаю overload 1 функции. Ясно и прозрачно. Ты тоже именяешь код модуля только через узкую и кривую жопу.
оверлоад - это жесткая перегрузка функции, причем один раз, насколько я понимаю.. это не есть гут
 

HraKK

Мудак
Команда форума
PHP:
class module_news
{
    public function get()
    {
        return array(1,2,3);
    }

    public function put()
    {

    }

}

class module_news_custom extends module_news
{
    public function get()
    {
        return array(1,2,3,4);
    }
}

$news = new module_news_custom();
$news->get();
И так сколько хочешь. Есть базовый класс который ты не трогаешь, а создаешь свой и расширяешь + оверлоадишь нужные методы в своем кустомном. Ясно и понятно.

А не какие-то шаманские методы каких-то классов из GLOBALS.
У тебя в цмс ВСЕ функции практически в твоих хуюках. И понять структуру не смотря туда каждые 3 сек и без литра водки нереально.
 
Сверху