2010-05-13 90 views
1

抽象类数据库是数据库交互和这个类的任何孩子发(UserDatabase,ActionDatabase,EventDatabase)继承其定义为静态数据库连接继承数据库连接

abstract class Database { 
    public static $connection; 
    public function __construct() {  
     ... 
     $this->connection = mysql_connect($host, $username, $password);  
    } 
}  
class UserDatabase extends Database { 
    public function verify() { 
     if ($this->connection == parent::$connection) { 
      print "true"; 
     } else { 
      print "false"; 
      print "this:" . $this->connection . " parent:" . parent::$connection; 
     } 
    }  
} 
$instance = new UserDatabase(); 
$instance->verify(); 
// this prints false, as parent::$connection is empty 

意思,我的数据库连接仅设置和存储在内存中一次并传递到子类中作为参考而不被复制为每个实例?

这是你如何实现你的OOP正确的数据库接口?

回答

2

暂时忽略你的代码,只看你对这个方案应该如何工作的描述......是的,数据库连接只会为每个PHP脚本设置一次,并且不会为每个实例重复。

这是否是一个好主意取决于你的子类是什么。每个班级都应该有一个责任。只要子类唯一的责任是数据库交互,你可能没问题。 (请参阅存储库模式,了解如何实现这一点。)如果您的User类扩展了数据库以便它可以存储自己,那么您已经越过了一条线,正在编写将具有太多依赖性和责任的类。

至于你的代码...几乎你的代码的每一行都是错误的。您无法将类变量初始化为函数的结果。你的SQL错了。行$connection ? "connected" : "not connected";什么都不做。几乎没有一个应该在构造函数中完成。等等

+0

你是绝对正确的,我是想说明类尽可能短的目的,但我想我的PHP语法让我失望。 My ** User **实例是** UserDatabase **返回的内容。用户类只是系统在处理脚本时可能需要的值的setter/getter类。 当脚本完成时,它将User对象传递给当前的UserDatabase,因此它可以剥离User到值,然后将更新查询发送到数据库服务器。 因此,类的数据库继承链与它返回的类型是分开的。 ActionDatabase返回并接受Action的一个实例。 – sdkfasldf 2010-05-13 18:47:27

1

如果你对这些类别做数据库交互但没有做别的事情,那么这种模式是可以的。

否则,如果您每次都可以使用“getInstance()”创建一次数据库类,那么您可能会更好。单身设计模式。

http://www.tonymarston.net/php-mysql/singleton.html

+0

这是一篇非常好的文章,谢谢。 – sdkfasldf 2010-05-13 18:48:55