PHP 单例 PDO

标签 php design-patterns 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 ( ) ;
?>

我的问题是:

什么是单例?

静态是什么意思/做什么?

什么是公共(public)静态函数 __callStatic (用于什么?

我怎样才能让 PDO 只在需要时连接到数据库?比如查询或者转义?因此,如果类/对象未被使用,则它不会连接。

最佳答案

单例是一种软件设计模式,它将类的启动限制为一个实例。 http://en.wikipedia.org/wiki/Singleton_pattern

静态意味着某些东西属于类而不是特定实例。在 PHP 中,这也意味着需要使用 :: 而不是 ->

调用静态方法

_callStatic 返回 PDO 链接(如果它已经建立)。否则,它首先创建链接然后返回它。

第四个问题的答案正是单例模式。它确保只在需要时建立一次连接。

关于PHP 单例 PDO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3714978/

相关文章:

php - 在带有 Doctrine2 的 Symfony2 上,Object = Entity 吗?

java - 记录器究竟如何是单例以及如何创建不同的日志文件?实现了我自己的记录器以供理解

design-patterns - 为什么这个单例构造代码不是线程安全的?

wcf - WCF 服务通常是否应该是单例的?

java - 从类(class)收集信息的适当方式/模式是什么?

php - 仅当重新初始化继承类中的实例变量时,PHP 中使用单例模式的类继承才有效。但为什么?

php - 文本框不允许使用某些字符和符号

php - 通过 ZipArchive php 获取损坏或空的 zip

php - 在 laravel 5.4 查询中随机显示一个用户特定的列

design-patterns - 具有相同参数化类型的 Scala mixin