Intereting Posts

Шаблон Singleton в php

class SingleTon { private static $instance; private function __construct() { } public function getInstance() { if($instance === null) { $instance = new SingleTon(); } return $instance; } } 

В приведенном выше коде изображен шаблон Singleton из этой статьи. http://www.hiteshagrawal.com/php/singleton-class-in-php-5

Я ничего не понял. Я загружаю этот класс в свой проект, но как бы мне создать объект Singleton изначально. Я буду называть это Singelton :: getInstance()

Может ли кто-нибудь показать мне класс Singleton, где установлено соединение с базой данных?

Пример того, как реализовать шаблон Singleton для класса базы данных, можно увидеть ниже:

 class Database implements Singleton { private static $instance; private $pdo; private function __construct() { $this->pdo = new PDO( "mysql:host=localhost;dbname=database", "user", "password" ); } public static function getInstance() { if(self::$instance === null) { self::$instance = new Database(); } return self::$instance->pdo; } } 

Вы должны использовать класс следующим образом:

 $db = Database::getInstance(); // $db is now an instance of PDO $db->prepare("SELECT ..."); // ... $db = Database::getInstance(); // $db is the same instance as before 

И для справки, интерфейс Singleton будет выглядеть так:

 interface Singleton { public static function getInstance(); } 

Да, вы должны позвонить, используя

 SingleTon::getInstance(); 

В первый раз он проверит частный $instance var $instance который является нулевым, и поэтому скрипт будет запускать $instance = new SingleTon(); ,

Для класса базы данных это одно и то же. Это выдержка из класса, который я использую в Zend Framework:

 class Application_Model_Database { /** * * @var Zend_Db_Adapter_Abstract */ private static $Db = NULL; /** * * @return Zend_Db_Adapter_Abstract */ public static function getDb() { if (self::$Db === NULL) self::$Db = Zend_Db_Table::getDefaultAdapter(); return self::$Db; } } 

Примечание . Образец – Singleton, а не SingleTon.

Несколько исправлений к вашему коду. Вы должны убедиться, что метод getInstance является «статическим», что означает, что метод класса не является методом экземпляра. Вы также должны ссылаться на атрибут через ключевое слово «я».

Хотя это, как правило, не выполняется, вы также должны переопределить метод «__clone ()», который клонирует экземпляр коротких цепей.

 <? class Singleton { private static $_instance; private function __construct() { } private final function __clone() { } public static function getInstance() { if(self::$_instance === null) { self::$_instance = new Singleton(); } return self::$_instance; } } ?> $mySingleton = Singleton::getInstance(); 

Одно дело не в том, что если вы планируете выполнять модульное тестирование, использование шаблона singleton вызовет некоторые трудности. См. http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html

 class Database{ private static $link=NULL; private static $getInitial=NULL; public static function getInitial() { if (self::$getInitial == null) self::$getInitial = new Database(); return self::$getInitial; } public function __construct($server = 'localhost', $username = 'root', $password ='tabsquare123', $database = 'cloud_storage') { self::$link = mysql_connect($server, $username, $password); mysql_select_db($database,self::$link); mysql_query("SET CHARACTER SET utf8", self::$link); mysql_query("SET NAMES 'utf8'", self::$link); return self::$link; } function __destruct(){ mysql_close(self::$link); } }