PHP5.3 : How to use PDO singleton class (indirectly) from the main source code

标签 php class singleton pdo

使用 PHP5.3.3,我有 2 个类,分别称为 SinglePDOManager,它们都可以工作,但我当然需要您的建议来优化那些低效的代码脚本。因此我有 2 个问题,但我猜一个问题与另一个问题严格相关:


1) 从主代码中的 Manager 对象访问 SinglePDO 方法

来自主要代码:

$test=new Manager('mydbname', $some_parameters);
$dbfields = $test->getFieldsSummary(false);

Manager 类中,重新定义函数,前提是它在 SinglePDO 类中定义:

public function getFieldsSummary($param)
{
    return $this->_dbh->getFieldsSummary($param);
}

问题:
如何摆脱在 Manager 类中重新定义所有 SinglePDO 方法的必要性? (我试过:class Manager extends SinglePDO 并使用:__call() 但没有成功)


2) 将 SinglePDO 分成 2 个类
SinglePDO 类嵌入了许多方法。我想解压缩这些方法并将它们扔到另一个类中,比如 Tool 使用方法 1、method_2 等重载 SinglePDO 类...

问题:
如何在之前的上下文中实现这一点(仍然有Manager Class)


这是 SinglePDO 类,这是一个典型的类,但具有其他方法。

       class SinglePDO extends PDO {
            private static $_dsn    = 'mysql:host=127.0.0.1;dbname=foobar';
            private static $_dbuser= 'dbuser' ;
            private static $_dbpwd  = 'dbpwd' ;
            private static $_lock = true;

        public function __construct( $dsn , $uname, $upass ) {

           if( self::$lock ) {
            trigger_error( 'Forbidden Class usage (singleton)');
           }
           parent::__construct( $dsn , $uname, $upass  );

        }

    public static function getInstance($dbh) {
        if( self::$instance == NULL ){
            self::$lock= FALSE;
                    self::$instance = new SinglePDO(self::$_dsn, self::$_dbuser, self::$_dbpwd);
                    self::$lock = TRUE;
        }
    return self::$instance;
    }

    /* lots of added methods that I'd like to drop into a Tool class  */
    public function my_method_1($param) {
     // do this and that
    }
} /* end of the uggly class */

编辑:
顺便说一句,我找到了这个 very interesting link

最佳答案

第一个问题,你有没有把call和call_user_func_array结合使用?因为这在我之前的项目中有用过:

function __call( $fname, array $fargs )
{
    return call_user_func_array( array( $this->_dbh, $fname ), $fargs );
}

对于问题二:好吧,如果你得到了问题 1 的答案,你也将能够得到这个问题的答案。我可能有这样的东西:

class PDOTool
{
    /* why does getInstance have a parameter? */
    private static $pdo = SinglePDO::getInstance(NULL);

    public static my_method_1($param) {
       self::$pdo->doSomething($param);
    }
    /**  __callStatic works in PHP >= 5.3.0  */
    public function __callStatic( $fname, array $fargs )
    {
        return call_user_func_array( array( self::$pdo, $fname ), $fargs );
    }
}

关于PHP5.3 : How to use PDO singleton class (indirectly) from the main source code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6618733/

相关文章:

php - 6300万奖品代码如何生成

Java读取学生记录并计算每次测验的高低和平均值

PHP乱序执行

javascript - Cakephp 多个表单 1 提交按钮

javascript - 如何在JS中编写api类并调用Vuex更改状态

java - 单例还是静态类?

java - 使用静态内部类创建java单例

f# - 用于测试单例序列的 Seq.exactlyOne 的非抛出版本

javascript - Chrome下加载资源失败!目前不工作ajax

java - TestChatBot 类的方法未定义?