минус только один )
Цитата |
Глобальные объекты могут быть вредны для объектного программирования, в некоторых случаях приводя к созданию немасштабируемого проекта. взято с : http://ru.wikipedia.org/wiki/%D0%9E%D0%B4%...BD%D0%B8%D1%8F) |
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);
}
}
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();
win2db::execute($query)->fetchall_assoc();мы создаём один обьект СИНГЛТОН который в следующий раз будет вызыватся вместо того чтоб создавался каждый раз новый? вызывая же класс вот таким образом
$db = new win2db();каждый раз создаётся новый обьект. в этом и вся разница, правильно?
Цитата (Гость_lekafe @ 19.06.2011 - 10:21) |
tatti singleton для работы с БД делать не надо, потому что в ходе работы может возникнуть ситуация когда тебе нужно будет иметь подключение к 10 разным типам БД (я тут утрирую). Делай как в Zend_db |
$maindb = DB::getInstance();//Мой любимый способ синглетонизации
$somedb = new DB;
private function __construct()В каком месте оно создаётся? Оно создастся только внутри класса, снаружи написать
$db = new win2db();нельзя, PHP будет рьяно материться.
public function execute()потом нам и не надо new делать в том и фишка синглтона.
{
if(!self::$dblink) self::conn();
}
class win2dbни одного объекта не будет создано по факту, работа этого примера завершится с ошибкой. Ну это как бы уже есть
{
private function __construct() { /* ... */ }
private function __clone() { /* ... */ }
}
$db = new win2db();
if(!self::$dblink) self::connect();но даже с этим не будет создано ни одного объекта. А вся фишка в том, что новый объект создает именно "оператор" new, т.е. без него никогда и нигде не обойтись.
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;
Цитата (linker @ 19.06.2011 - 22:01) |
Nikitian Если тебе нужно несколько объектов, то это уже не называется синглтоном и городить его не имеет никакого смысла. |