[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Singleton pattern
tatti
минус только один )
Цитата
Глобальные объекты могут быть вредны для объектного программирования, в некоторых случаях приводя к созданию немасштабируемого проекта.

взято с : http://ru.wikipedia.org/wiki/%D0%9E%D0%B4%...BD%D0%B8%D1%8F)


не поняла что за минус такой - "создание немасштабируемого проекта". может кто растолкует?



Спустя 11 минут, 35 секунд (17.06.2011 - 20:30) linker написал(а):
Мотивация к таким глупостям одна, причём детская: "А вдруг мне понадобиться апосля два объекта иметь данного класса".

Спустя 10 минут, 50 секунд (17.06.2011 - 20:41) Guest написал(а):
это у кого простите такая мотивация?

Спустя 3 минуты, 12 секунд (17.06.2011 - 20:44) Guest написал(а):
class win2db{
protected static $DB = "ххх"; // database.
protected static $HN = "ххх"; // hostname.
protected static $UN = "ххх"; // username.
protected static $PW = "ххх"; // password.
protected static $dblink; // connection descriptor.

protected $res; // sql resource.
//

private function __construct() { /* ... */ }
private function __clone() { /* ... */ }
//
public static function connect()
{ // DB connection.
self::$dblink = mysql_connect(self::$HN, self::$UN, self::$PW);
if(!is_resource(self::$dblink)) die('is_resource error');
if(!mysql_select_db(self::$DB, self::$dblink)) die(mysql_error());
//mysql_query ("SET NAMES utf8");
mysql_set_charset('utf8', self::$dblink);
mysql_query("set character_set_client='utf8'");
mysql_query("set character_set_results='utf8'");
mysql_query("set collation_connection='utf8_general_ci'");
}
//
public function execute($query)
{
if(!self::$dblink) self::connect();
if(!$this->res = mysql_query($query))
return mysql_errno() ."|". mysql_error() ."|". $query;
return (TRUE);
}
}
всё верно?

Спустя 1 час, 29 минут, 5 секунд (17.06.2011 - 22:13) Basili4 написал(а):
Guest
А где простите сингелтон ???

Спустя 20 минут, 1 секунда (17.06.2011 - 22:33) Guest написал(а):
так вот я и думаю можно вот так сделать?
class win2db{
protected static $DB = "ххх"; // database.
protected static $HN = "ххх"; // hostname.
protected static $UN = "ххх"; // username.
protected static $PW = "ххх"; // password.
protected static $dblink; // connection descriptor.

protected $res; // sql resource.
//

private function __construct() { /* ... */ }
private function __clone() { /* ... */ }
//
private static function connect()
{ // DB connection.
self::$dblink = mysql_connect(self::$HN, self::$UN, self::$PW);
if(!is_resource(self::$dblink)) die('is_resource error');
if(!mysql_select_db(self::$DB, self::$dblink)) die(mysql_error());
//mysql_query ("SET NAMES utf8");
mysql_set_charset('utf8', self::$dblink);
mysql_query("set character_set_client='utf8'");
mysql_query("set character_set_results='utf8'");
mysql_query("set collation_connection='utf8_general_ci'");
}
//
public function execute($query)
{
if(!self::$dblink) self::connect();
if(!$this->res = mysql_query($query))
return mysql_errno() ."|". mysql_error() ."|". $query;
return (TRUE);
}
}


$db = new win2db();

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

Спустя 23 минуты, 52 секунды (17.06.2011 - 22:57) linker написал(а):
Да вообще ни одного объекта нельзя будет создать.

Спустя 30 минут, 12 секунд (17.06.2011 - 23:27) tatti написал(а):
linker
у меня создаётся

не ну а вообще такое реально сделать синглтон для БД одно подключение для всех или нет? если да, плюсы минусы....

и в чём будет разница при вызове
$query='Select * From `tblnames` ';
$win2db = new win2db();
$win2db->execute($query);
и
win2db::$dblink->execute($query);

Спустя 1 день, 11 часов, 15 минут, 32 секунды (19.06.2011 - 10:43) Basili4 написал(а):
в таком случае наследуется класс сингелтона сколько раз сколько нужно и каждому наследнику передаются свои конфиги.

Спустя 3 часа, 30 минут, 1 секунда (19.06.2011 - 14:13) tatti написал(а):
Гость_lekafe
Да это понятно, спасибо. Меня сам принцип интересует. Хочу научится использовать этот СИНГЛТОН правильно.

Basili4
ДЫК... иными словами это уже не синглтон становится?

получается что вызывая класс вот так
win2db::execute($query)->fetchall_assoc();
мы создаём один обьект СИНГЛТОН который в следующий раз будет вызыватся вместо того чтоб создавался каждый раз новый? вызывая же класс вот таким образом
$db = new win2db();
каждый раз создаётся новый обьект. в этом и вся разница, правильно?

Спустя 2 часа, 3 минуты, 21 секунда (19.06.2011 - 16:16) Basili4 написал(а):
tatti
Скажем так сингелтон он в любом случае сингелтон. просто испоьзовать его если в проекте ожидается подключение у нескольким БД мне кажется не целесообразно в таких случаях я бв реализовал модели для каждой используемой БД. Одну модель как родительскую другие наследовал бы от неё. И все прозрачно.

Спустя 41 минута, 48 секунд (19.06.2011 - 16:58) Nikitian написал(а):
Цитата (Гость_lekafe @ 19.06.2011 - 10:21)
tatti singleton для работы с БД делать не надо, потому что в ходе работы может возникнуть ситуация когда тебе нужно будет иметь подключение к 10 разным типам БД (я тут утрирую). Делай как в Zend_db

Синглетон - это не тип класса, а способ инициализации объекта, если это поддерживается классом. Таким образом можно совершенно спокойно сделать так:

$maindb = DB::getInstance();//Мой любимый способ синглетонизации
$somedb = new DB;

Где $maindb - объект работы с основной базой, который множество раз может быть использован где угодно, $somedb - объект работы с какой-то другой базой, который нужен здесь и сейчас.

Спустя 1 час, 44 минуты (19.06.2011 - 18:42) tatti написал(а):
спасибо. синглтон - сила smile.gif

Спустя 8 минут, 31 секунда (19.06.2011 - 18:50) linker написал(а):
tatti
private function __construct()
В каком месте оно создаётся? Оно создастся только внутри класса, снаружи написать
$db = new win2db();
нельзя, PHP будет рьяно материться.

Спустя 38 минут, 38 секунд (19.06.2011 - 19:29) tatti написал(а):
linker
__construct() и __clone() делается для защиты(взято с википедии ;) )

это вопервых. а вовторых будет работать если добавить в класс один метод.
public function execute()
{
if(!self::$dblink) self::conn();
}
потом нам и не надо new делать в том и фишка синглтона.

Спустя 13 минут, 22 секунды (19.06.2011 - 19:42) Nikitian написал(а):
Не вижу смысла делать приватным конструктор. Тем самым вы ограничиваете использование класса только синглтоном, а выше я показал, что из одного класса вполне корректно создавать объекта как одиночки, так и несвязанные с ними.

Спустя 4 минуты, 28 секунд (19.06.2011 - 19:47) tatti написал(а):
Nikitian
тут уже от проекта зависит, но вообще да ohmy.gif я оценила

Спустя 2 часа, 9 минут, 18 секунд (19.06.2011 - 21:56) linker написал(а):
tatti
Я знаю для чего делаются приватными конструктор и клон, но в свете приведённого человеком примера
class win2db
{
private function __construct() { /* ... */ }
private function __clone() { /* ... */ }
}


$db = new win2db();
ни одного объекта не будет создано по факту, работа этого примера завершится с ошибкой. Ну это как бы уже есть
if(!self::$dblink) self::connect();
но даже с этим не будет создано ни одного объекта. А вся фишка в том, что новый объект создает именно "оператор" new, т.е. без него никогда и нигде не обойтись.

Спустя 5 минут, 15 секунд (19.06.2011 - 22:01) linker написал(а):
Nikitian
Если тебе нужно несколько объектов, то это уже не называется синглтоном и городить его не имеет никакого смысла.

Спустя 33 минуты, 41 секунда (19.06.2011 - 22:35) tatti написал(а):
linker
спокуха, всё работает на ура
class db {
protected static $link;

function __construct(){}
function __clone(){}

private static function conn()
{
self::$link++;
return self::$link;
}
public function exec()
{
if(!self::$link) return self::conn();
}
}


$a = db::exec();
echo $a;

Спустя 3 минуты, 10 секунд (19.06.2011 - 22:38) Nikitian написал(а):
Цитата (linker @ 19.06.2011 - 22:01)
Nikitian
Если тебе нужно несколько объектов, то это уже не называется синглтоном и городить его не имеет никакого смысла.

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

Спустя 9 часов, 42 минуты, 13 секунд (20.06.2011 - 08:20) linker написал(а):
tatti
Это уже не синглтон, не надо путать классы с объектами. И второе, если метод используется как статический, то и объявлять его надо статическим.


Nikitian
Читаем внимательно, что такое синглтон. Это когда в системе может существовать ТОЛЬКО ОДИН объект какого-либо класса.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.