с 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
одновременно.