[英]PHP5.3 : How to use PDO singleton class (indirectly) from the main source code
使用 PHP5.3.3,我有 2 个类,称为SinglePDO和Manager ,它们都可以工作,但我当然需要你的建议来优化那些低效的代码脚本。 因此,我有 2 个问题,但我想彼此之间严格相关:
1) 从主代码中的Manager object 访问SinglePDO方法
从主要代码:
$test=new Manager('mydbname', $some_parameters);
$dbfields = $test->getFieldsSummary(false);
在管理器class 中,重新定义 function,前提是它在SinglePDO class 中定义:
public function getFieldsSummary($param)
{
return $this->_dbh->getFieldsSummary($param);
}
问题:
如何摆脱在Manager class 中重新定义所有SinglePDO方法的必要性? (我试过: class Manager 扩展 SinglePDO并使用:__call ()但没有成功)
2)将 SinglePDO拆分为 2 类
SinglePDO class 嵌入了很多方法。 我想解压这些方法并将它们放入另一个 class,例如使用方法 1、method_2 等重载SinglePDO class 的工具...
问题:
如何在前面的上下文中实现这一点(仍然有 Manager 类)
这是SinglePDO class,一个典型的,但有额外的方法。
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 中,我发现了这个非常有趣的链接
对于第一个问题,您是否将 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 的回答:如果您使用另一个扩展 class,则所有public
和protected
的方法都将在子类中可用,而无需重新定义它们。
问题 #2 的答案是一个接一个地扩展类。
class Tools extends SinglePDO {}
class Manager extends Tools {}
顺便说一句:在 PHP 中奇怪地实现了 singleton 模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.