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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как использовать один объект класса, Не создавать несколько раз объет класса 
:(
    Опции темы
nmc
Дата 18.8.2010, 16:57 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток!

Как использовать единственный объект в разных php файлах( одного и того же сайта, конечно) ?

Есть класс для работы с БД.

Первый вариант
в файле set.php создаем объект 

Код

$db = new Bd(....);


В index.php  подключать файл  через include

Код

...
include 'set.php';

$a = $db->funVan("......");

...


то так объект  создается каждый раз заново или используется один?

Если  так
Код

global $db;
$db = new Bd(....);

то что меняется (в смысле вопроса темы)

Второй вариант

в файле set.php создаем объект 
и записываем его в сессию 

Код


$db = new Bd(....);

$_SESSION['a'] = $db'


В чем недостатки второго варианта??

P.S. Какой оптимальны вариант для работы с единственным объектом класса ???




Это сообщение отредактировал(а) nmc - 18.8.2010, 16:58
PM   Вверх
bars80080
Дата 18.8.2010, 18:57 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(nmc @  18.8.2010,  16:57 Найти цитируемый пост)

то так объект  создается каждый раз заново или используется один?

ну, сколько раз подключал файл set.php, столько и создавался


Цитата(nmc @  18.8.2010,  16:57 Найти цитируемый пост)
то что меняется (в смысле вопроса темы)

согласно приведённому контексту global совершенно бессмысленная операция. она ничего не делает


Цитата(nmc @  18.8.2010,  16:57 Найти цитируемый пост)
в файле set.php создаем объект 
и записываем его в сессию 

а смысл? чем обычная переменная не угодила? зачем его записывать в сессию?
PM MAIL WWW   Вверх
overmet
Дата 18.8.2010, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

согласно приведённому контексту global совершенно бессмысленная операция. она ничего не делает


Цитата

разных php файлах

я не понял bars80080, почему бессмысленная операция?
PM MAIL WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
bars80080
Дата 18.8.2010, 21:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(overmet @  18.8.2010,  20:07 Найти цитируемый пост)
я не понял bars80080, почему бессмысленная операция? 

и что, что они разные? как это влияет на область видимости, если один файл подключается в другой?
PM MAIL WWW   Вверх
ZneP
Дата 18.8.2010, 21:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 15.7.2008
Где: Россия, Москва

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



Цитата(nmc @  18.8.2010,  16:57 Найти цитируемый пост)
то так объект  создается каждый раз заново или используется один?

Файл set.php будет подключаться только 1 раз в index.php, следовательно, при каждом обновлении страницы будет создаваться новый объект.

Цитата(nmc @  18.8.2010,  16:57 Найти цитируемый пост)
Если  так
код PHP
1: global $db;
2: $db = new Bd(....);

то что меняется (в смысле вопроса темы)

Ну во первых, при каждом обновлении страницы объекты будут создаваться по новому.
Во вторых, использовать глобальные переменные - плохая идея. Вообще нужно стараться избегать их.
Почему? Да потому, что глобальные переменные можно изменить откуда угодно, а в серьезном проекте это очень сложно отследить.
Еще один минус, то что может много времени уйти, чтобы понять, почему не работает та или иная функция.
Когда много программируешь (особенно если проект большой, сложный), бывает забываешь, что эта переменная глобальная или не обращаешь внимания, что она не подключается в функции. Из-за этого, когда что-то не работает и при этом ошибок никаких нет, подозрения на эту переменную в основном не падают и уходит много времени, чтобы найти причину.

Цитата(nmc @  18.8.2010,  16:57 Найти цитируемый пост)
В чем недостатки второго варианта??

То же, что и с глобальными переменными.


Вот например схема.

Есть базовый класс. В нем создаются все необходимые объекты других классов, таких как класс по работе с Пользователями, класс по работе с БД, класс Обработки ошибок и тд.

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

Классы в модулях наследуются от базового класса, тем самым получаем доступ к объектам родительского класса.

Никаких глобальных переменных. Все красиво и по правилам ООП
PM MAIL ICQ Skype   Вверх
NLspieler
Дата 18.8.2010, 22:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно ли самому сделать супер-глобальную переменную, что бы она была глобальной, при этом,
что бы не нужно было прописывать в каждой функции/методе, которые ее используют global $var ; ?


PM MAIL   Вверх
overmet
Дата 18.8.2010, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Можно ли самому сделать супер-глобальную переменную, что бы она была глобальной, при этом,
что бы не нужно было прописывать в каждой функции/методе, которые ее используют global $var ; ?

Код

<?php
$a = 1;
$b = 2;

function Sum()
{
     global $a, $b;

     $b = $a + $b;
} 

Sum();
echo $b;
?>
Глобальные переменные - это переменные, которые доступны всей программе, включая подпрограммы (пользовательские функции).

Локальные переменные - переменные, определенные внутри подпрограммы (пользовательской функции). Они доступны только внутри функции, в которой они определены.

сча найду еще интерестных примеров

Код

function isURLAllowed($url) {
        global $limitURLs;

        if ($limitURLs !== false && is_array($limitURLs)) {
                $matched = false;

                foreach ($limitURLs as $limitString) {
                        // checking if string is a regex or just a prefix
                        if (preg_match('/^[^a-zA-Z\\\s]/', $limitString))
                        {
                                if (preg_match($limitString, $url)) {
                                        $matched = true;
                                }
                        } else if (substr($url, 0, strlen($limitString)) == $limitString) {
                                $matched = true;
                                break;
                        }
                }

                return !$matched;
        }
        return true;
}



google.ru/codesearch/ хороший поиск кода

Это сообщение отредактировал(а) overmet - 18.8.2010, 23:14
PM MAIL WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Vasay
Дата 18.8.2010, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

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



nmc, 

Есть паттерн Singleton .

Однако в случае с PHP, Singleton живет в рамках одного запроса. Так как время жизни PHP приложения - время обработки одного запроса.  

Если объект хочется расшарить между  запросами - его надо куда-то сериализовать. 

Сериализация объекта в сессию возможна, но тогда он будет доступен только в рамках сессии. 


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
nmc
Дата 19.8.2010, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Цитата(nmc @  18.8.2010,  16:57 Найти цитируемый пост)
в файле set.php создаем объект 
и записываем его в сессию 
а смысл? чем обычная переменная не угодила? зачем его записывать в сессию? 

Есть 10 страниц в каждой из них нужна работа с базой данных.
И что бы не создавать один объект много раз (при обновлении страницы ведь  снова создается  этот объект) записать этот объект класса для работы с базой данных в сессию.
Код

$db = new Bd(....);
$_SESSION['a'] = $db'

В сессии он существует пока оттуда не будет удален.
В чем недостаток такого  простого  варианта????

Цитата

Однако в случае с PHP, Singleton живет в рамках одного запроса. Так как время жизни PHP приложения - время обработки одного запроса.  

 При перезагрузке(обновлении) страницы объект удаляется и создается снова?






PM   Вверх
Vasay
Дата 19.8.2010, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

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



nmc, 

Цитата

В сессии он существует пока оттуда не будет удален.
В чем недостаток такого  простого  варианта????


С сессиями не все так просто. Погугли на тему "php Storing objects in a session". А так же на тему __sleep and __wakeup 



Цитата

 При перезагрузке(обновлении) страницы объект удаляется и создается снова?


Все приложение на PHP живет только во время обработки одного запроса. Т.е. все объекты при каждом запросе вновь создаются, инициализируются, потом умирают.  Хочешь что-то сохранить - файлы, база, какие-нибудь кэшеры...


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
bars80080
Дата 19.8.2010, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(nmc @  19.8.2010,  12:21 Найти цитируемый пост)
В сессии он существует пока оттуда не будет удален.
В чем недостаток такого  простого  варианта????

недостаток в том, что во-первых, выигрыш ещё вилами по воде написан. что быстрее, считать объект и распаковать его из сессии или создать снова? в каждом отдельном случае надо считать

и главное, загромождение памяти. сколько должна существовать эта сессия? сколько места на сервере это займёт?
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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