PHP5.3:如何从主要源代码中使用PDO单例类(间接)

时间:2011-07-08 00:35:30

标签: php class singleton pdo

使用PHP5.3.3,我有2个类,名为 SinglePDO Manager ,两者都有效,但我当然需要你的建议来优化那些无效的代码脚本。因此,我有两个问题,但我想严格相互关联:


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 方法的必要性? (我尝试过:类管理器扩展了SinglePDO 并使用: __ call()但没有成功)


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

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


这是 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 */

修改
在btwn中,我发现了这个very interesting link

2 个答案:

答案 0 :(得分:1)

对于第一个问题,您是否将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 );
    }
}

答案 1 :(得分:1)

对问题#1的回答:如果你用另一个类扩展一个类,所有publicprotected方法都可以在子类中使用而无需重新定义它们。

对问题#2的回答是一个接一个地扩展类。

class Tools extends SinglePDO {}

class Manager extends Tools {}

BTW:很奇怪implementation of a singleton pattern in PHP