Вызов сторонних функций внутри класса.

botan

Новичок
Вызов сторонних функций внутри класса.

Ситуация:
Это, скорее вопрос по архитектуре больших и навороченных приложений.
В основном, разбирая чужие проекты и создавая свои многие из нас приходят к примерно такой архитектуре:
1. Есть некий класс DB_connection (mysql, postgre,ora) и т.д. в рамках которого "переписываются" стандартные функции пхпшные функции для обращения к mysql или к другой базе данных.
2. Есть масса других классов, как правило, наследующих этот. В зависимости от назначения приложений эти классы естественно разняться.
3. Есть ещё некий файл common.php в котором собраны функции, которые не объеденены в классы, посколько разные по смыслу и т.д.
4. Есть все остальные файлы "движка" (или даже нескольких движков), где используются функции, классы и т.д.

Недавно столкнулся с такой ситуацией: Эти самые функции из common.php есть необходимость использовать не только внутри файлов "движка" но и внутри методов класса.

Варианты:
1. Ну собстственно использовать внешние функции внутри классов. При этом возникает необходимость следить за тем, что бы common.php был подключенн раньше этих классов во всех файлах, которые используют этот класс. Либо require_once этот файл в каждом из классов.
2. Можно собрать все функции из common.php в класс который extends dbconnection.class, и затем заставить классы наследовать не сам dbconnection а этот новый класс. В этом случае незачем следить не придётся, но возникнет излишняя нагрузка на компилятор (имхо).
3. Можно забирать функции из коммон.пхп необходиме для каждого класса, в этом случае ни зачем следить не придется но это уже "программирование в столбик" или "плодение кода" :)

Собственно на этом моя фантазия исчерпалась.
Вопрос как сделать лучше в данном случае.
И вообще может быть где-нибудь что-нибудь написано по схожим вопросм, был бы благодарен за ссылки.

З.Ы. Я даже не знаю чего написать в поиске :)
 

svetasmirnova

маленький монстрик
По-моему, вар. №1 нормальный, но можно ещё посмотреть как реализована подгрузка функций в PEAR_PHPCompat
 

lovchy

nacido para cifrar
botan
Не знаю, какие многие из нас приходят к подобной структуре, ибо она довольно странна. Очень вообще у вас странное восприятие ООП. Класс -- это далеко не объединение функций. Объединение функций -- это неймспейс. Но это ладно.

В целом непонятно чем плох вызов библиотеки по зависимостям в ней самой. Имхо, вполне нормальная практика.

И да, ответьте, пожалуйста, _зачем_ вы наследуете DBConnection? Меня терзают смутные сомнения.
 

botan

Новичок
Что касается ООП, угу, замечал за собой.
Что такое неймспейс в ПХП? Где-нибудь почитать можно? :)
"
В целом непонятно чем плох вызов библиотеки по зависимостям в ней самой. Имхо, вполне нормальная практика."
Честное слово, не понял что тут сказано :(

Наследую - для того что бы обращаться к его методам.
Как вариант - можно создать объект класса dbconnection, передавать его в конструктор наследуемых классов. что бы потом обращаться к нему в виде:
$this->Db->Execute_query();

Морально готов к конструктивной критике :)

"Класс инкапсулирует концепцию данных и действий в единой унифицированое образование..." Всё это мы знаем, помним, но на практике не применяем :)
 

lovchy

nacido para cifrar
botan
Как вариант -- не создавать свои, совершенно несостоятельные способы (ибо наследование DBConnection -- это пять) и не идти по ошибкам других, а взять и почитать GoF, скажем. Там есть описание паттерна Singleton. Или про Registry чего-нить нарыть. Они спасут отца русской демократии.

А неймспейсов в PHP нет.
 

bgm

 
Кстати, для обязательного подключения набора классов, функций очень удобна директива auto_prepend_file. Удобство в том, что можно один раз настроить её в .htaccess и больше не вспоминать о необходимости следить за подключением библиотек.
 

lovchy

nacido para cifrar
bgm
Не кошерно. Ничего в ней удобного нет. Всё равно подключаем один файл, который вызывает всё остальное. В чём проблема вызывать скрипт инициализации в итеративном файле? Перекладывая это на язык, мы выносим в его конфигурацию часть логики программы, что совершенно не правильно.
 

Макс

Старожил PHPClub
botan
Наследую - для того что бы обращаться к его методам.
ты, случайно, не по статьям Курепина учился ?
Если да, то забудь об этом.
Ситуаций, когда нужно наследовать класс DB_Connection очень мало.

bgm
для подключения библиотек классов удобно использовать __autoload(PHP5)
 

botan

Новичок
не, чукча не читатель, чукча писатель :)
Может так случилось просто что разбирая чужое наталкивался именно на такую архитектурку. Шедевр был даже такой:
config.class
mysql extends config
data_prepare extends mysql
data_publish extends data_prepare

А что есть "Курепина" ?

Кстати а если уж так: не наследование а передача объекта класса другому классу?
Кстати как при этом люди поступают со сторонними функциями?

И кстати, что такого страшного в наследовании?

За Кейвордзы спасибо. Почитаю.
 

lovchy

nacido para cifrar
Приведённый пример иерархии явно относится к разряду "аффтар жжот". За такое надо на кол сажать, повесив предварительно на лампочке.

Про глобальные инстансы, -- уже было сказано что читать: паттерны Singleton, Registry. Там будут ответы на все вопросы. Кроме последнего. Ответ на него стоит искать в самой базовой теории ООП, с которой у Вас очевидные проблемы. Думаю, пересказывать здесь её не имеет смысла.

Вообще, по хорошему, топику нечего делать в "advanced"-ветви.
 

demongloom

Новичок
Неймспэйсы есть в пхп5. Только они, не описываются в кода как namespace, а как (можно абстрактный) класс со статичными методами. К примеру:

PHP:
abstract class nVariable {
static public function isInteger($a) {
	return is_integer($a);
} # function
...
} # class

// пример вызова
$a = 10;

if(nVariable::isInteger($a)) {
	echo "int";
} else {
	echo "non int";
} # if
Соответственно, можно использовать namespace, если не сгруппировать общие по некому признаку функции.
Можно даже переписать и упорядочить примитивные функции, хотя этот вариант имеет свои недостатки. К примеру, если функция которая в описана namespace с нечетким кол-вом параметров.

Если кто то найдет наиболее удобный способ упростить такую конструкцию, то буду благодарен.

PHP:
static public function Split($a,$aSep,$aLimit = null) {
	if(func_num_args() >= 2) {
		return Explode($aSep,$a,$aLimit);
	} else {
		return Explode($aSep,$a);
	}	# if
}	# func
Можно реализовать при при помощи:
PHP:
$Args = func_get_args();
call_user_func("explode",$Args);
/* Удобней написать функцию, где аргументы - первый параметр,
то тогда можно использовать нижний такой вариант, иначе нельзя,
так как func_get_* нельзя передавать не первым параметром. */
call_user_func2(func_get_args(),"explode");
Но тогда, как быть с $aLimit? Ведь false, null и прочие заменители не подойдут, поскольку explode воспримет как неправильный/нулевое значение и результат будет неверным, а изначальное значение неизвестно и как function(...,$aLimit = XXX) не опишешь.

Я лично был бы рад, если была бы реализована (не видел нигде) alias команда. К примеру:
PHP:
static public function isInt($a) alias is_integer($a);
Тогда собственные нэймспэйсы было бы легче создавать, плюс меньше потери производительности из за переходов внутри функции.
 

lovchy

nacido para cifrar
demongloom
Всё, что Вы написали -- это бред сивой кобылы. Вы совершенно не знакомы с понятием слова 'неймспейс'. И что-то мне подсказывает, что Вы также не знаете значения абстрактных классов.
 

demongloom

Новичок
Нэймспейс - это некий класс для сбора общих по некому признаку функций. Это даже не совсем класс, а просто возможность сгруппировать функции. Неймспэйсвов в пхп нет, но есть некое подобие.

Абстрактный класс это класс который нельзя использовать при создании обьекта.

И никакого бреда.
 

slach

Новичок
блин, ну нагородили
в advanced точно делать нечего

1) исходный вопрос высосан из пальца
require_once common.php
автар сам знает более или менее понятное ему решение и дальше зачем то пытается изголяться

2) то что написано demongloom вообще без слез читать нельхя =)) неймспейс это не класс =)) для сбора функций =))
скажи зачем тебе инкапсулировать ф-цию внутрь абстрактного класса ? если тебе можно напрямую ее вызывать
или тебе просто очень хочется использовать нотацию вызова типа Class::Method() ?? :)
 

demongloom

Новичок
ага.
нелюблю когда функции которые относятся к строкам (к примеру) разбросаны черт знает как от str_*, до str* и т.д. Проще собрать в одном стиле в одном месте. Плюс можно спокойно добавлять свои в этот псевдо-namespace, также можно организвать константы.
 
Сверху