Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как можно использовать объект в функции 
:(
    Опции темы
Rusman
Дата 19.12.2011, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.5.2006
Где: Пермь

Репутация: нет
Всего: нет



Здравствуйте!

Есть объект работы с БД.
Мне его нужно использовать в функциях. Неужели выход только если его создавать заново в самой функции?
или есть какой то другой способ?

Спасибо!
PM MAIL ICQ Skype   Вверх
skyboy
Дата 19.12.2011, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



чтоб не создавать объект внутри функции у тебя есть несколько выходов:
а) сделать класс нужного объекта Синглтоном
б) передавать в параметрах
в) обращаться к переменной с объектом как к глобальной

Вариант 3 самый чреватый проблемами.
Вариант 2 самый "правильный"(так код имеет меньше неявных связей)
Вариант 1 как на меня - баланс между "правильностью" и гибкостью.
PM MAIL   Вверх
krundetz
Дата 20.12.2011, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Rusman, попробуйте использовать шаблон проектирования Registry, он гибче чем Singleton предложенный skyboy.

Цитата(skyboy @  19.12.2011,  19:37 Найти цитируемый пост)
Вариант 2 самый "правильный"(так код имеет меньше неявных связей)

??? а если у меня вложенность не явная, т.е. работаю я с интерфейсами? это мне поможет?
Или другой вариант, функция в своём теле может вызвать 5 других функций, из этих пяти только в 2 передается экземпляр соединения с БД. И только одна из них использует его самостоятельно и не передает дальше по цепочки вызовов. А если цепочка простирается на 10 вложений, тащить туда неиспользуемый явно переменную через все вложения, только чтобы воспользоваться ею в самом конце цепочки, а может и не воспользоваться, если там ветвлении?

Цитата(skyboy @  19.12.2011,  19:37 Найти цитируемый пост)
Вариант 1 как на меня - баланс между "правильностью" и гибкостью. 

И где баланс? Где неявные связи (Это больше к интерфейсам относится)? По моему Singleton::getInstance() очень даже явная связь и самый правильный вариант. Он для этого и придуман.

Это сообщение отредактировал(а) krundetz - 20.12.2011, 10:41


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
MoLeX
Дата 20.12.2011, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Я использую такое
Код

function load_class( $class  )
{
    static $obj = array();
        
    if( ! isset($obj[$class]) )
    {            
        $obj[$class] = new $class();
    }
            
    return $obj[$class];
}


/*************************/

function f_test()
{
    $c_test = load_class('c_test');
    $c_test->hello();
}


class c_test {

    function __construct()
    {
        echo __METHOD__.'<br />';
    }
    
    function hello()
    {
        echo __METHOD__.'<br />';    
    }
}


$c_test = load_class('c_test');
$c_test->hello();

echo '<br /><hr />';
f_test();



--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 20.12.2011, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



я делаю так

есть класс для работы с базой и в неё вставляем функцию
Код

class dababase{
.....
    public static function getInstance() {
        static $instance;
        if (!is_object($instance)) {
            $instance = new dababase();
        }
        return $instance;
    }
.....
}

в функциях активируем так
Код

function myFunc(){
    $db = dababase::getInstance();
}

в классах или также или так
Код

class MyClass{
        private $db;
.....
    private function __construct() {
             $this->db = dababase::getInstance();
        }
.....
}



Это сообщение отредактировал(а) Gold Dragon - 20.12.2011, 12:18


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
krundetz
Дата 20.12.2011, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



MoLeX, твой вариант некое подобие универсального Singleton, почему пришел к такому варианту, а не используешь наследование?

Gold Dragon, как я понял класический Singleton, только ваш код совсем не рабочий. И дело точно не в объявление класса
Код

classs dababase() {

который должен выглядеть так:
Код

class dababase {

Посмотрите пожалуйста и поправьте, а то запудрим голову топикстартеру.

Это сообщение отредактировал(а) krundetz - 20.12.2011, 11:40


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Gold Dragon
Дата 20.12.2011, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



krundetz, прикольно получилось.  Если честно даже сам офигел от себя  smile 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
krundetz
Дата 20.12.2011, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(Gold Dragon @  20.12.2011,  11:57 Найти цитируемый пост)
Если честно даже сам офигел от себя

Бывает. Смотри личку.


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
MoLeX
Дата 20.12.2011, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Цитата(Gold Dragon @  20.12.2011,  11:57 Найти цитируемый пост)
прикольно получилось.  Если честно даже сам офигел от себя 

особенно наверное от этого
Код

private static function getInstance()

 smile 


Цитата(krundetz @  20.12.2011,  11:37 Найти цитируемый пост)
MoLeX, твой вариант некое подобие универсального Singleton, почему пришел к такому варианту, а не используешь наследование?

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

Да и считаю нецелесообразным держать целый класс для этого, достаточно функции.

Может я конечно в чем-то и не прав, может логика ООП в этом случае рушится, но все работает как часы - а это главное)

Добавлено через 1 минуту и 5 секунд
Эх, давно не было интересных диалогов.


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 20.12.2011, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(MoLeX @  20.12.2011,  13:02 Найти цитируемый пост)
особенно наверное от этого
и от этого тоже smile Наверное сегодня не мой день



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
krundetz
Дата 20.12.2011, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(MoLeX @  20.12.2011,  12:02 Найти цитируемый пост)
особенно наверное от этого

я ему уже отписался.
Цитата(MoLeX @  20.12.2011,  12:02 Найти цитируемый пост)
по замерам у нас выходило, что ф-цию использовать выгоднее. Экономия на спичках конечно, но в нагруженных проектах каждая спичка в итоге дает коробок)

ну в нагруженных проектах самое узкое место это БД, а следовательно необходимо в первую очередь выполнить балансировку нагрузки на БД, в приведенном же тобой коде сделать это проблематично, или я чего то не понимаю?
Цитата(MoLeX @  20.12.2011,  12:02 Найти цитируемый пост)
Да и считаю нецелесообразным держать целый класс для этого, достаточно функции.

почему нецелесообразно?
Цитата(MoLeX @  20.12.2011,  12:02 Найти цитируемый пост)
Может я конечно в чем-то и не прав, может логика ООП в этом случае рушится, но все работает как часы - а это главное)

думаю здесь проблема не в логике ООП, хотя и тоже в логике, а именно в том что у тебя экземпляр класса название которого ты передаешь в функцию load_class, может быть создан помимо этой функции, то есть никто мне не запретит сделать так:
Код

$className = 'DB';
function load_class( $class  )
{
    static $obj = array();
        
    if( ! isset($obj[$class]) )
    {            
        $obj[$class] = new $class();
    }
            
    return $obj[$class];
}
$DB1 = load_class($className);
$DB2 = $className;

Конечно это будет не последовательные вызовы, и они будут находиться в разных частях приложения, но вызов будет осуществлен за один запрос сервера, то есть вместо одного соединения, чего по сути мы добивались, мы получим наличие двух. А значит тормоза в приложение.

Это сообщение отредактировал(а) krundetz - 20.12.2011, 12:29


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
MoLeX
Дата 20.12.2011, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



krundetz, если сделаешь как описал то получишь fatal error при обращении к методу
Код

class test
{
    function __construct()
    {
        echo __METHOD__.'<br />';
    }
    
    function hello()
    {
        echo __METHOD__.'<br />';    
    }
}


$className = 'test';
function load_class( $class  )
{
    static $obj = array();
        
    if( ! isset($obj[$class]) )
    {            
        $obj[$class] = new $class();
    }
            
    return $obj[$class];
}


$test1 = load_class($className);
$test1->hello();

$test2 = $className;
$test2->hello();


или я не про то?


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
krundetz
Дата 20.12.2011, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



MoLeX, вот этот кусок
Код

$test2 = $className;
$test2->hello();

перепиши так:
Код

$test2 = new $className;
$test2->hello();

а то ты пытаешься у строки вызвать несуществующий метод.


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
MoLeX
Дата 20.12.2011, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



krundetz, тогда да, конечно будет два вызова. просто у тебя не было new, я и не понял)


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
krundetz
Дата 20.12.2011, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(MoLeX @  20.12.2011,  13:02 Найти цитируемый пост)
krundetz, тогда да, конечно будет два вызова.

ну так вот в этом я и вижу основную проблему твоего кода.

Задача сделать модуль взаимодействующий с БД, так чтобы затратная операция на установления соединения с БД выполнялась один раз и использовалась многократно в процессе работы скрипта. Предположим, что соединение с БД происходит через экземпляр класса DB

Если этот класс реализует Singleton, то будет использоваться одно соединение, и наверняка оно будет создаваться задолго до вызова конкретного модуля. Обойти же создание дубля возможно только правкой кода самого класса. При правильном процессе разработки изменения в базовые классы (все то что влияет на работоспособность всей системы, DB на 100% такой класс)  вносятся только ответственным за это человеком. Поэтому исполнитель будет вынужден делать так как надо, иначе поставленная перед ним задача не будет выполнена.

Если этот класс создается через твою функцию, за долго до вызова разрабатываемого модуля, то исполнитель из-за невнимательности или незнания (того что она есть) может создать дублирующий класс DB непосредственно в модуле и никто ему не помешает. Тесть задача будет выполнена не в полном объеме. А следовательно весь выигрыш производительности в использование функции съест создание дублирующего соединения. И ты очень не скоро поймешь почему у тебя начала тормозить система, так как в эту сторону смотреть не будешь так как оптимизацию ее уже произвел.

И ты мне не ответил ничего про балансировку нагрузки на БД.

Это сообщение отредактировал(а) krundetz - 20.12.2011, 13:45


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1042 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.