使用 PHP5.3.3,我有 2 个类,分别称为 SinglePDO 和 Manager,它们都可以工作,但我当然需要您的建议来优化那些低效的代码脚本。因此我有 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/