使用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
答案 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的回答:如果你用另一个类扩展一个类,所有public
和protected
方法都可以在子类中使用而无需重新定义它们。
对问题#2的回答是一个接一个地扩展类。
class Tools extends SinglePDO {}
class Manager extends Tools {}