我开始使用PHP类并查看OOP。
我通过创建一个看起来像这样的数据库类(片段)来玩游戏:
class Database
{
private $link;
private $result;
private $count;
function connect()
{
$this->link = mysql_connect(DB_HOST, DB_USER, DB_PW);
$return = $this->link ? 'Connected to database.' : 'Failed to connect.';
$this->open(); // I have another function in this class to select the db
echo $return;
}
function query($query)
{
$this->result = mysql_query($query);
}
function fetch()
{
return mysql_fetch_assoc($this->result);
}
function count()
{
$this->count = mysql_num_rows($this->result);
return $this->count;
}
}
为了测试,我创建了另一个名为Guestbook的类,如下所示:
class Guestbook
{
function fetch()
{
Database::query('SELECT * FROM guestbook LIMIT 2');
while($row = Database::fetch()){
$result_array[] = $row;
return $result_array;
}
}
现在我测试了调用函数:
$db = new Database();
$db->connect();
$db->query('SELECT * FROM test');
while($row = $db->fetch()) {
echo $row['id'].'<br />';
}
echo $db->count();
$db->close();
这可以按预期工作。所以我继续使用留言簿课程:
$db->connect();
$guestbook = new Guestbook();
$results = $guestbook->fetch();
foreach($results as $gb) {
echo $gb['id'];
}
echo $db->count(); // HERE'S MY PROBLEM !
$db->close();
一切都按照我的意愿运作,但第二次拨打$db->count()
回显先前的计数而不是2(因为我在留言簿提取功能中设置了LIMIT 2)。
如何正确地与这些类进行交互,以便全局使用$db->count()
之类的内容?
提前感谢任何提示或解决方案!
答案 0 :(得分:4)
首先,没有理由将mysql_*
实现包装在OOP中。如果您要进行OOP,那么只需使用可以扩展的OOP类的Mysqli
或PDO
。
其次,您希望在GuestBook类中保存数据库的实例,而不是使其成为Database类本身的扩展。
答案 1 :(得分:2)
很难就如何使用OOP包装数据库访问器并仍然全局访问count()提供明确的建议。
显然你的代码是错误的。
使用符号
Database::query
你指的是Database类上的某种静态方法,这似乎不是这里的意图。看起来你的代码没有崩溃,因为它与PHP4有一些向后兼容性。
你可以这样重写Guestbook:
class Guestbook
{
private $db;
function __construct(&$db) {
$this->db = $db;
}
function fetch($option)
{
$this->db->query('SELECT * FROM guestbook LIMIT 2');
while($row = $this->db->fetch()){
$result_array[] = $row;
return $result_array;
}
}
然后
$db = new Database();
$db->connect();
$guestbook = new Guestbook($db);
$results = $guestbook->fetch();
echo $db->count();
此技术使用称为“依赖注入”的模式
答案 2 :(得分:1)
为什么在获得来自guestbook-&gt; fetch()方法的结果时会使用db类中的count?
这完全是同样的伎俩:
echo count( $resutls );
答案 3 :(得分:0)
请参阅$db
是类Database的对象
永远不会访问留言簿的功能OR属性
您可以直接使用count( $resutls )
OR可能必须使用继承概念
由于
答案 4 :(得分:0)
您将静态与类的实例化版本混合在一起。如果您希望能够创建类的多个实例,则应该具有__construct函数。虽然不是必需的,但最好还是有一个。
您正在创建一个新实例并将其分配给$ db变量($ db = new Database();)。但是在您的GuestBook类中,您将静态引用数据库类(Database::)。该语法引用了所有实例中相同的“base”类。您要做的是引用您创建的数据库类的实例。通常,您会将数据库实例传递给构造函数中的GuestBook类,将其存储在类变量中,然后使用$ this引用它。
class Guestbook
private $db = null;
{
function __construct($db) {
$this->db = $db;
}
function fetch($option) {
$this->db->query('SELECT ...');
...
}
}
$db = new Database();
$guestbook = new Guestbook($db);