Php在另一个班级中使用一个班级

时间:2010-11-24 18:42:29

标签: php mysqli

我有一个关于在我的网站上的其他类中使用我的数据库类的问题。我只需要我的数据库类的一个对象,这是我想要运行所有查询的实例。

我有一个名为MysqliExtension的类,它扩展并为mysqli类增加了一些额外的功能 我还有一个名为Users的类,它管理我的用户登录/注销,从数据库中提取他们的信息等。 最后,我有一个名为config.php的文件,其中包含这两个类并实例化MysqliExtension和User类的对象。

的config.php

require_once 'MysqliExtension.php';
require_once 'Users.php';

$database = new MysqliExtension(host,....);

我想就将数据库对象传递给User对象的最佳方法获得一些意见。

选项1

在我的config.php文件中

$user = new User($username,password);

在我的Users.php文件中

    class User{


function myfunction(){

global $database;
$database->callDatabaseFunction();
return $some_result;
}

}

}

选项2

在我的config.php文件中

$user = new User($username,password,$database);

在我的Users.php文件中

class User{

function __construct($username,$password,$database){    
$this->database = $database;
    }

function myfunction(){

$this->database->callDatabaseFunction();
return $some_result;
}

}

}

哪种方式最好,还是几乎相同?是否有一种不同的方式,我还没有想到?

2 个答案:

答案 0 :(得分:2)

如果您只需要一个班级的一个实例:http://en.wikipedia.org/wiki/Singleton_pattern

用法示例(使用引用链接中的PHP示例):

$instance = Singleton::getInstance();

// or

Singleton::getInstance()->somefunction();

请注意,此方法仅允许该对象的一个​​实例,因此如果您需要使用多个(假设有两个连接到不同的数据库),则最好不要使用它。

答案 1 :(得分:1)

我更喜欢第一种方式。使数据库逻辑与用户逻辑完全分离更有意义。但是,如果您将这些功能公之于众,您可以执行以下操作:

$user_results = database::callDatabaseFunction()

无需实例化对象。