![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
Rusman |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 4.5.2006 Где: Пермь Репутация: нет Всего: нет |
Здравствуйте!
Есть объект работы с БД. Мне его нужно использовать в функциях. Неужели выход только если его создавать заново в самой функции? или есть какой то другой способ? Спасибо! |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
чтоб не создавать объект внутри функции у тебя есть несколько выходов:
а) сделать класс нужного объекта Синглтоном б) передавать в параметрах в) обращаться к переменной с объектом как к глобальной Вариант 3 самый чреватый проблемами. Вариант 2 самый "правильный"(так код имеет меньше неявных связей) Вариант 1 как на меня - баланс между "правильностью" и гибкостью. |
|||
|
||||
krundetz |
|
||||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
Rusman, попробуйте использовать шаблон проектирования Registry, он гибче чем Singleton предложенный skyboy.
??? а если у меня вложенность не явная, т.е. работаю я с интерфейсами? это мне поможет? Или другой вариант, функция в своём теле может вызвать 5 других функций, из этих пяти только в 2 передается экземпляр соединения с БД. И только одна из них использует его самостоятельно и не передает дальше по цепочки вызовов. А если цепочка простирается на 10 вложений, тащить туда неиспользуемый явно переменную через все вложения, только чтобы воспользоваться ею в самом конце цепочки, а может и не воспользоваться, если там ветвлении?
И где баланс? Где неявные связи (Это больше к интерфейсам относится)? По моему Singleton::getInstance() очень даже явная связь и самый правильный вариант. Он для этого и придуман. Это сообщение отредактировал(а) krundetz - 20.12.2011, 10:41 |
||||
|
|||||
MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
Я использую такое
-------------------- Amazing ![]() |
|||
|
||||
Gold Dragon |
|
||||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
я делаю так
есть класс для работы с базой и в неё вставляем функцию
в функциях активируем так
в классах или также или так
Это сообщение отредактировал(а) Gold Dragon - 20.12.2011, 12:18 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||||
|
|||||||
krundetz |
|
||||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
MoLeX, твой вариант некое подобие универсального Singleton, почему пришел к такому варианту, а не используешь наследование?
Gold Dragon, как я понял класический Singleton, только ваш код совсем не рабочий. И дело точно не в объявление класса
который должен выглядеть так:
Посмотрите пожалуйста и поправьте, а то запудрим голову топикстартеру. Это сообщение отредактировал(а) krundetz - 20.12.2011, 11:40 |
||||
|
|||||
Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
krundetz, прикольно получилось. Если честно даже сам офигел от себя
![]() -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
||||
|
||||
MoLeX |
|
||||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
особенно наверное от этого
![]()
по замерам у нас выходило, что ф-цию использовать выгоднее. Экономия на спичках конечно, но в нагруженных проектах каждая спичка в итоге дает коробок) Да и считаю нецелесообразным держать целый класс для этого, достаточно функции. Может я конечно в чем-то и не прав, может логика ООП в этом случае рушится, но все работает как часы - а это главное) Добавлено через 1 минуту и 5 секунд Эх, давно не было интересных диалогов. -------------------- Amazing ![]() |
||||
|
|||||
Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
и от этого тоже
![]() -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
krundetz |
|
||||||||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
я ему уже отписался.
ну в нагруженных проектах самое узкое место это БД, а следовательно необходимо в первую очередь выполнить балансировку нагрузки на БД, в приведенном же тобой коде сделать это проблематично, или я чего то не понимаю?
почему нецелесообразно?
думаю здесь проблема не в логике ООП, хотя и тоже в логике, а именно в том что у тебя экземпляр класса название которого ты передаешь в функцию load_class, может быть создан помимо этой функции, то есть никто мне не запретит сделать так:
Конечно это будет не последовательные вызовы, и они будут находиться в разных частях приложения, но вызов будет осуществлен за один запрос сервера, то есть вместо одного соединения, чего по сути мы добивались, мы получим наличие двух. А значит тормоза в приложение. Это сообщение отредактировал(а) krundetz - 20.12.2011, 12:29 |
||||||||
|
|||||||||
MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
krundetz, если сделаешь как описал то получишь fatal error при обращении к методу
или я не про то? -------------------- Amazing ![]() |
|||
|
||||
krundetz |
|
||||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
MoLeX, вот этот кусок
перепиши так:
а то ты пытаешься у строки вызвать несуществующий метод. |
||||
|
|||||
MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
krundetz, тогда да, конечно будет два вызова. просто у тебя не было new, я и не понял)
-------------------- Amazing ![]() |
|||
|
||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
ну так вот в этом я и вижу основную проблему твоего кода. Задача сделать модуль взаимодействующий с БД, так чтобы затратная операция на установления соединения с БД выполнялась один раз и использовалась многократно в процессе работы скрипта. Предположим, что соединение с БД происходит через экземпляр класса DB. Если этот класс реализует Singleton, то будет использоваться одно соединение, и наверняка оно будет создаваться задолго до вызова конкретного модуля. Обойти же создание дубля возможно только правкой кода самого класса. При правильном процессе разработки изменения в базовые классы (все то что влияет на работоспособность всей системы, DB на 100% такой класс) вносятся только ответственным за это человеком. Поэтому исполнитель будет вынужден делать так как надо, иначе поставленная перед ним задача не будет выполнена. Если этот класс создается через твою функцию, за долго до вызова разрабатываемого модуля, то исполнитель из-за невнимательности или незнания (того что она есть) может создать дублирующий класс DB непосредственно в модуле и никто ему не помешает. Тесть задача будет выполнена не в полном объеме. А следовательно весь выигрыш производительности в использование функции съест создание дублирующего соединения. И ты очень не скоро поймешь почему у тебя начала тормозить система, так как в эту сторону смотреть не будешь так как оптимизацию ее уже произвел. И ты мне не ответил ничего про балансировку нагрузки на БД. Это сообщение отредактировал(а) krundetz - 20.12.2011, 13:45 |
|||
|
||||
Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
убедился что для базы нужно иметь собственный класс
![]() -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
||||
|
||||
MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
в основном кэшируем результат. если он большой по объему и хранить его надо долго - в файл пишем, если маленький и часто обновляется в мемкэш лично нам не хватало лога sql запросов со временем выполнения -------------------- Amazing ![]() |
|||
|
||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
тоесть создаете полностью статичный контент? или сериализуете модель? это понятно, но я спрашивал немного не про это, я спрашивал вы используете один или больше серверов БД и как балансируете нагрузку между ними? |
|||
|
||||
Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
Ну это больше вопрос что лучше использовать функции или классы. Извечная война предпочтений ![]() -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
MoLeX |
|
||||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
в основном статичный контент.
единственный раз использовали N серверов, и то не я настраивал. все остальные БД пока что нормально живут, правда на отдельном сервере) -------------------- Amazing ![]() |
||||
|
|||||
MoLeX |
|
||||||||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
Решил переложить функционал своей ф-ции на многими не любимый __autoload()
test.php
index.php
В итоге статический массив не срабатывает, как оказывается из-за бага датированного 2005 годом Добавлено через 2 минуты и 12 секунд Так же не срабатывает такой пример index.php
а вот такой уже работает
![]() -------------------- Amazing ![]() |
||||||||
|
|||||||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
а такое будет срабатывать? __autoload вообще-то ничего не возвращает, он просто обеспечивает подгрузку несуществующего пока класса, так что мастерить из него синглтон не корректно. Это сообщение отредактировал(а) ksnk - 13.1.2012, 09:55 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
будет)
да, да. ты прав. лечиться мне уже надо ![]() -------------------- Amazing ![]() |
|||
|
||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
||||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
отсюда Подключать сторонние плагины может оказаться проблематично, если каждый из них пожелает переопределить __autoload. Типичная проблема с глобальными сущьностями -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
думал отвергаются все autoload, даже те которые появились в 5.3 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |