PHP Singleton PDO

с http://www.php.net/manual/en/class.pdo.php

###### config.ini ###### db_driver=mysql db_user=root db_password=924892xp [dsn] host=localhost port=3306 dbname=localhost [db_options] PDO::MYSQL_ATTR_INIT_COMMAND=set names utf8 [db_attributes] ATTR_ERRMODE=ERRMODE_EXCEPTION ############ <?php class Database { private static $link = null ; private static function getLink ( ) { if ( self :: $link ) { return self :: $link ; } $ini = _BASE_DIR . "config.ini" ; $parse = parse_ini_file ( $ini , true ) ; $driver = $parse [ "db_driver" ] ; $dsn = "${driver}:" ; $user = $parse [ "db_user" ] ; $password = $parse [ "db_password" ] ; $options = $parse [ "db_options" ] ; $attributes = $parse [ "db_attributes" ] ; foreach ( $parse [ "dsn" ] as $k => $v ) { $dsn .= "${k}=${v};" ; } self :: $link = new PDO ( $dsn, $user, $password, $options ) ; foreach ( $attributes as $k => $v ) { self :: $link -> setAttribute ( constant ( "PDO::{$k}" ) , constant ( "PDO::{$v}" ) ) ; } return self :: $link ; } public static function __callStatic ( $name, $args ) { $callback = array ( self :: getLink ( ), $name ) ; return call_user_func_array ( $callback , $args ) ; } } ?> <?php // examples $stmt = Database :: prepare ( "SELECT 'something' ;" ) ; $stmt -> execute ( ) ; var_dump ( $stmt -> fetchAll ( ) ) ; $stmt -> closeCursor ( ) ; ?> 

Мои вопросы:

Что такое синглтон?

Что статично означает / делает?

Что такое общедоступная статическая функция __callStatic (используется для?

И как я могу это сделать, что PDO только подключается к базе данных по мере необходимости? Например, запрос или побег? Поэтому, если класс / объект не используется, он не подключается.

Синглтон – это шаблон разработки программного обеспечения, который ограничивает инициализацию класса одним экземпляром. http://en.wikipedia.org/wiki/Singleton_pattern

Статический означает, что что-то принадлежит классу, а не конкретному экземпляру. В PHP это также означает, что статический метод нужно вызывать с :: not ->

_callStatic возвращает ссылку PDO, если она уже установлена. В противном случае он сначала создает ссылку, а затем возвращает ее.

Ответ на ваш четвертый вопрос – это именно одноэлементный шаблон. Это гарантирует, что соединение устанавливается только один раз, когда это необходимо.

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

Возьмем следующий пример:

 $db1 = new Database(); $db2 = new Database(); 

поскольку вы можете видеть, что db1 и db2 – это два новых экземпляра базы данных, поэтому там не то же самое, сейчас возьмите этот пример.

 $db1 = Database::Instance(); $db2 = Database::Instance(); 

И код для экземпляра

 class Database { private static $_instance; public static Instance() { if(self::$_instance !== null) { //We have already stored the object locally so just return it. //This is how the object always stays the same return self::$_instance; } return self::$_instance = new Database(); //Set the instance. } } 

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

статическая функция – это метод внутри класса / объекта isa тип метода, который можно использовать без инициализации объекта.

Что касается метода __callStatic, это метод магии, который выполняется, когда статический метод недоступен.

Например:

 class Database { public static function first() { echo 'I actually exists and I am first'; } public function __callStatic($name,$args) { echo 'I am '. $name .' and I was called with ' . count($args) . ' args'; } } 

позволяет проверить их.

 Database::first(); //Output: I actually exists and I am first Database::second(); //Output: I am second and I was called with 0 args Database::StackOverflow(true,false); //Output: I am StackOverflow and I was called with 2 args 

Надеюсь, это поможет вам

Синглтон – это объект, который гарантирует, что только один экземпляр сам по себе активен одновременно. То есть вы можете делать только одну программу, если знаете, что я имею в виду.

Статический метод – это метод, который можно вызывать как нормальную функцию, вне контекста объекта. Как SomeClass:afunc() а не только $this->afunc() .

Синглтон означает, что у вас есть этот класс, который будет иметь только один объект, связанный с ним. Таким образом, этот класс будет создан только один раз, после чего вы вызовете метод с именем, таким как getInstance() , который вернет ваш экземпляр.

Static, означает, что для доступа к этому method или property вам не нужен, и экземпляру этого объекта, вы можете вызвать этот method непосредственно с его классом class::myMethod()

__callStatic – это способ доступа к статическому методу. Является одним из magic-methods PHP и похож на __call с той разницей, о которой я только что упомянул.

По последнему вопросу этот класс получает только одно соединение с базой данных. Если вы добавите другой метод, например executeSelect($sql) вас будет что-то вроде:

 public static function executeSelect($sql) { if (self::$link) { self::getLink() } // execute your query here... return null; } 

Вам нужно будет только назвать его: Database::executeSelect($sql); и он никогда не получит двух соединений с DB одновременно.