2010-09-15 3 views
7

из http://www.php.net/manual/en/class.pdo.phpPHP Singleton PDO

###### 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 подключается только к базе данных, когда это необходимо? Такие, как запрос или бежать? Так, если класс/объект не используется то он не подключается.

+2

Singletons были предметом много критики на протяжении многих лет, и вы должны избегать их, если это возможно. Это особенно справедливо в средах, где все объекты живут только для запроса. Посмотрите вокруг SO для получения дополнительной информации. – Gordon

+0

@gordon: Синглтоны не являются (!) Плохим решением в целом. Они очень полезны, например, для фронт-контроллеров, объектов запроса и т. Д. Но я также считаю, что его не рекомендуется использовать с объектами базы данных. Но вы не можете сказать «просто избегайте их», я думаю. Это общий дизайн и очень полезный. –

+1

@faileN Singletons (!) - плохое решение в целом. Даже [Эрих Гамма говорит, что сейчас] (http://www.informit.com/articles/printerfriendly.aspx?p=1404056). Я не буду углубляться в это, поскольку это было достаточно объяснено в другом месте. Как я уже сказал, [взгляните вокруг] (http://stackoverflow.com/search?q=singleton+php) – Gordon

ответ

4

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

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

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

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

+0

A * возможно * ответ на четвертый вопрос - использование одноэлементного шаблона. Существуют и другие способы (например, лениво соединяются). – strager

+0

Почему __callStatic нужен call_user_func_array? – Johnny

+0

@Johnny, Этот '__callStatic' действует как прокси-сервер для' self :: getLink() -> name'. Когда вы вызываете 'Database :: query', он переводится в' Database :: getLink() -> query'. – strager

0

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

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

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

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

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

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

0

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

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

3

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

Возьмем такой пример:

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

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

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

И код 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 

Надеется, что это помогает вам

+0

Спасибо: Почему __callStatic использует call_user_func_array? – Johnny

+0

'call_user_func_array' - это функция, используемая для вызова mathod или функции, а пример использования - так:' call_user_func_array ('Database :: Stack', array ('Overflow')) 'witch будет вызывать статическую функцию в базе данных Stack и передать в 1 аргумент, я в основном использую это для шаблонов и маршрутизаторов MVC. – RobertPitt