Максим В.
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 сообщение
#17 лет назад
Оффтопик
В <pre> </pre> хоть бы помещали код, а то все пробелы исчезли
Максим В.
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 за развернутые ответы.
Максим В.
731 сообщение
#17 лет назад
Цитата:
http://www.patternsforphp.com/wiki/Registry
битый линк
Андрей Д.
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
битый линк

А у меня работает оО
Андрей Д.
1267 сообщений
#17 лет назад