PHP Singleton PDO - PullRequest
       41

PHP Singleton PDO

7 голосов
/ 15 сентября 2010

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

Ответы [ 5 ]

4 голосов
/ 15 сентября 2010

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

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

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

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

3 голосов
/ 15 сентября 2010

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

Возьмите этот пример:

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

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

$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.
    }
}

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

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

Что касается метода __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 голосов
/ 18 июля 2018
<code><?php 
class DB {
protected static $instance;
protected function __construct() {
if(empty(self::$instance)) {
        try {
            self::$instance = new PDO("mysql:host=localhost;dbname=techprojects", 'root', '');
            self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
        } catch(PDOException $error) {
            echo $error->getMessage();
        }
    }

}
public static function getInstance() {
    if(empty(self::$instance)) {
        try {
            new DB();
            //var_dump(self::$instance);
        } catch(PDOException $error) {
            echo $error->getMessage();
        }
    }
    //var_dump(self::$instance);
    return self::$instance;
}

private function __clone() {
    // Stopping Clonning of Object
}

private function __wakeup() {
    // Stopping unserialize of object
}
}
?>
<?php
try {
$db = DB::getInstance();
$db1 = DB::getInstance();
$sqlExample = 'SELECT * FROM keywords';
$stm = $db->prepare($sqlExample);
$stm->execute();
$result = $stm->fetchAll(PDO::FETCH_ASSOC);

var_dump($db);
var_dump($db1);
echo "<pre>";
print_r($result);
echo "
";} catch (Exception $ e) {print $ e-> getMessage ();}?>
0 голосов
/ 15 сентября 2010

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

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

0 голосов
/ 15 сентября 2010

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

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

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

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

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

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

...