Связывание классов
731 сообщение
#17 лет назад
Здравствуйте,Какие возможны варианты связывания классов между собой. Сейчас использую объявление в конструкторе. А вообще есть еще какие-нибудь варианты?
(PHP 5)
1410 сообщений
#17 лет назад
Смотря что Вы хотите сделать. Есть много вариантов. К тому же есть паттерны..Есть наследование, есть передача в конструктор, есть глобальные хранилища данных(пример смотрите в Zend_Registry), есть глобальные переменные (но это не рекомендую использовать)...
В общем конкретизируйте задачу, тогда можно будет сказать что-то точнее

731 сообщение
#17 лет назад
Ну глобальные переменные я сам не очень хочу использовать.Ну например сделаем такой тестовый класс:
class Page() {
private $sql;
function __construct() {
$this->sql = new Sql();
}
protected function GetContent() {
$this->sql->Query("Показать нужный контент");
}
}
Ну соответственно в классе sql имеется функции по работе с БД и некоторые часто используемые функции относящиеся к разным типам баз.
Как видно в данном случае я использовал определение в конструкторе, т.к. функций наподобии GetContent может быть сколько угодно не только в этом классе ну и например в наследуемом.
731 сообщение
731 сообщение
#17 лет назад
Какие здесь еще применимы варианты, кроме глобальных переменных и определний в конструкторе?
1410 сообщений
#17 лет назад
Другие варианты думаю тут не подойдут, если Вам нужно еще и наследование в других классах без заморочек.А этот вариант Вам не подходит? А вообще судя из описания "в классе sql имеется функции по работе с БД и некоторые часто используемые функции относящиеся к разным типам баз" - Вам нужно использовать паттерн Абстрактная Фабрика - ссылка .
Написать несколько классов-драйверов и подключать нужный.
731 сообщение
#17 лет назад
Спасибо за совет, наверное так и сделаю.Почему варианты еще искал, т.к. думал найти более оптимальные. Всетаки надо не только программировать, но и оптимизировать, поэтому спрашиваю совета у более опытных программистов

1267 сообщений
#17 лет назад
Пусть у класа для работы с БД все функции будут статическими (static public function query), тогда вам не нужно будет всякий раз создавать экземпляр класа.SQL::query($query);
Ещё есть паттерн глобального хранилища. Вы создаёте экземпляр класса лишь 1 раз и потом его используете (паттерн registry).
Registry::get('SQL')->query($query);
731 сообщение
#17 лет назад
Zionit, cпасибо, это уже интересней. Сейчас поэксперементирую со статическими методами. Интересно как они поведут себя, если их переопределять.
1267 сообщений
#17 лет назад
Тоесть переопределять? 
Важно помнить, что в статических функция нет $this (замена - self), кроме того если они обьявлены, как статические к ним нужно обращаться только, как к статике (иначе PHP выводит предупреждение, при максимальном уровне error_reporting).
1410 сообщений
#17 лет назад
Цитата ("Zionit"):Пусть у класа для работы с БД все функции будут статическими (static public function query), тогда вам не нужно будет всякий раз создавать экземпляр класа.SQL::query($query);
Ещё есть паттерн глобального хранилища. Вы создаёте экземпляр класса лишь 1 раз и потом его используете (паттерн registry).Registry::get('SQL')->query($query);
Вы этим только повторили то, что я уже сказал выше :
Цитата:
Есть наследование, есть передача в конструктор, есть глобальные хранилища данных(пример смотрите в Zend_Registry)

Единственное, что это не паттерн (по крайней мере я не стал бы его считать таким - его даже нет в GoF - ссылка)
1267 сообщений
#17 лет назад
Если вы имеете введу наследствие классов, то ведут они себя ничучуть не хуже, чем обычные функции.Вообще только-что эксперементировал с драйверами для БД. В голову пришла идея, что вместо стандартного класса со списком функций-алиасов можно создать асоциативный массив.
$arr = array
(
"query" => "mysql_query",
...
);
И через паттерны программирования реализовать что-то типа такого:
if(in_array($func, $arr)) $arr();
(При вызове функции SQL::query будет выполнена функция mysql_query)
Короче делать мне нефик, извращаюсь

1267 сообщений
#17 лет назад
Цитата ("ArtLab"):Вы этим только повторили то, что я уже сказал выше :
Спорим, что я написал более доходчивое для программиста объяснение (особенно для начинающего)?

Человеку нужно быстро разобраться, а вы его в Zend Framework отправили. Даже я не люблю разбираться с такими объёмами чужого кода, хотя всегда это делаю тк. приходиться

Цитата:
Единственное, что это не паттерн (по крайней мере я не стал бы его считать таким
Не помню, что читал. Привык называть registry паттерном

Вот, например: ссылка
И вообще... Чего нам стоит дописать в википедию 1 строчку?

1410 сообщений
#17 лет назад
Цитата ("Zionit"):Цитата ("ArtLab"):Вы этим только повторили то, что я уже сказал выше :
Спорим, что я написал более доходчивое для программиста объяснение (особенно для начинающего)?
Человеку нужно быстро разобраться, а вы его в Zend Framework отправили. Даже я не люблю разбираться с такими объёмами чужого кода, хотя всегда это делаю тк. приходиться
Ему так или иначе прийдется это сделать - так, как Вы не указали, как в регистр положить что-то, ровно как и структуру самого класса.
Насчет спорим - чего ж тут спросить - пример дан, но пример не снимает всех вопросов, пока не глянешь пример - куда я и отправил автора. Что намного эффективнее, чем дать кусок не работающего примера частичной реализации.
Цитата ("Zionit"):
Цитата:Единственное, что это не паттерн (по крайней мере я не стал бы его считать таким
Не помню, что читал. Привык называть registry паттерном
Вот, например: ссылка
И вообще... Чего нам стоит дописать в википедию 1 строчку?
Линк не открывается.
731 сообщение
#17 лет назад
Цитата:Тоесть переопределять?
Это я с бухты барахты написал, просто имелось ввиду обращение к объекту из наследуемого класса, а так же обращение если такая же функция уже определена в наследуемом классе.
Цитата:
Спорим, что я написал более доходчивое для программиста объяснение
ArtLab предложил через паттерны, а вы через Static, поэтому сравнивать ответы нельзя

Спасибо ArtLab и Zionit за развернутые ответы.
1267 сообщений
#17 лет назад
Цитата ("VeMax"):Цитата:Тоесть переопределять?
Это я с бухты барахты написал, просто имелось ввиду обращение к объекту из наследуемого класса, а так же обращение если такая же функция уже определена в наследуемом классе.
Цитата:Спорим, что я написал более доходчивое для программиста объяснение
ArtLab предложил через паттерны, а вы через Static, поэтому сравнивать ответы нельзя
Спасибо ArtLab и Zionit за развернутые ответы.
Не за что, всегда рад ответить на вопросы по PHP на данном форуме.
P.S. Я предлагал 2 варианта, 1 - статика, 2 - паттерны.
P.S.2. Поведений абсолютно одинаковое, если я правильно помню. Вообще в мануалах пхп всё есть.
1267 сообщений
#17 лет назад
Цитата ("VeMax"):Цитата:http://www.patternsforphp.com/wiki/Registryбитый линк
А у меня работает оО