我有自己编写的自定义数据库类,我还有一个用户类和一个站点类。
MySQL类有这样的方法:
connect
query
clean
fetch
用户类:
register
login
logout
resetPass
网站类:
updateTopics
addTopic
addPost
addReply
等
这些类需要与数据库连接,这就是我为MySQL编写的类。但是,我不知道如何在这些类中正确使用MySQL类。我是否将类定义为全局类,并在其他类中引用它?我可以这样做:
$db = new MySQL();
$user = new User($db);
然后像那样引用它?
感谢任何帮助,谢谢。 :)
答案 0 :(得分:3)
除了Daniel Vandersluis的回答: 在类中实例化对象会在这些类之间创建强依赖关系。您可能会对依赖注入和控制反转(+ ioc容器)感兴趣。
见:
http://en.wikipedia.org/wiki/Dependency_injection
http://martinfowler.com/articles/injection.html
btw:你真的需要你自己的MySQL类实现吗?已经有这么多的数据库访问和抽象层可用。例如。 http://docs.php.net/pdo
答案 1 :(得分:1)
您可能只对一次显示MySql类感兴趣。它可以防止在执行期间多次打开和关闭连接。我喜欢使用工厂概念。它是一个处理对象实例化的类,你可以按照Singleton概念编写它只允许一个实例。
像这样:class Factory {
private static $objects = array();
static function get_database() {
if( ! isset(self::$objects['database']))
self::$objects['database'] = new MySql();
return self::$objects['database'];
}
}
你可以这样使用:
$db = Factory::get_database();
请注意,它始终返回相同的MySql实例,而不是创建新的实例。
嗯,但这只是一个非常简单的工厂实现,只是为了理解。它可能会好很多=]
答案 2 :(得分:-1)
您可以在其他课程中实例化您的MySQL
课程,例如:
class User
{
private $db;
function __construct(...)
{
$this->db = new MySQL();
}
function accesses_database(...)
{
$this->db->query(...);
}
}
然后在您想要访问数据库时在类中引用$this->db
。
此外,如果您希望只有MySQL
的一个实例,则可以将其设为singleton。