【发布时间】:2012-01-12 17:53:36
【问题描述】:
我有两个类:第一个类 - 数据库 - 处理所有数据库操作,即插入、更新、删除。另一个为用户处理类特定的操作。用户类扩展了数据库类。 User 类中包含所有属性,并试图从 Database 类中获取方法以对 User 类中的属性执行操作。所以我在 test.php 中实例化用户:
<?php
require_once("user.php");
$user = new User();
$user->auth("Scott", "rascal");
echo $user->username;
?>
<html>
<head>
<title>test</title>
</head>
<body>
</body>
</html>
我收到以下错误:
Notice: Undefined property: Database::$dbFields in /Users/scottmcpherson/Sites/phpsites/projectx/application/models/db.php on line 24
Warning: Invalid argument supplied for foreach() in /Users/scottmcpherson/Sites/phpsites/projectx/application/models/db.php on line 24
Notice: Undefined property: Database::$tableName in /Users/scottmcpherson/Sites/phpsites/projectx/application/models/db.php on line 83
Notice: Undefined property: Database::$id in /Users/scottmcpherson/Sites/phpsites/projectx/application/models/db.php on line 85
Notice: Undefined property: Database::$dbFields in /Users/scottmcpherson/Sites/phpsites/projectx/application/models/db.php on line 24
Warning: Invalid argument supplied for foreach() in /Users/scottmcpherson/Sites/phpsites/projectx/application/models/db.php on line 24
这是用户类:
<?php
require_once("db.php");
class User extends Database{
public $dbFields = array('username', 'password');
public $tableName = "users";
public $id;
public $username;
public $password;
public function auth($user, $pass){
$this->username = $user;
$this->password = $pass;
}
}
?>
这是给我带来麻烦的数据库类部分:
<?php
require_once("../config/main.php");
class Database{
public $db;
public function __construct() {
$this->connect();
}
public function connect(){
try {
$this->db = new PDO("mysql:host=".DB_SERVER."; dbname=".DB_NAME, DB_USER, DB_PASS);
$this->db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
}
public function properties() {
$properties = array();
foreach ($this->dbFields as $field) {
if (isset($this->field) || property_exists($this, $field)) {
$properties[$field] = $this->$field;
}
}
return $properties;
}
在我尝试扩展类并将属性移动到子类之前,我一切正常。如何克服错误并正确实现这一目标?
【问题讨论】:
-
你应该重新考虑你的设计。阅读扩展关系实际上是什么:我认为在这种情况下不合适。您有一个可能使用数据库类的用户类,但它“不是”数据库。对于问题本身:由于每个用户都是数据库,并且每个用户都有
dbFields,因此每个用户都可以使用dbFields成员并调用connect。但不是每个数据库都是用户:每个数据库都可以使用connect()函数,但不能使用dbField,因为它本身没有。 -
@Nanne 这是有道理的。首先,我尝试单独使用 connect 作为一个类,并将 $db(The connection) 作为一个全局类引入其他类,但我知道这不是好的做法。而且我不想使用单例,所以我尝试了这种方法,这显然行不通。我被这个难住了。我需要一种方法将连接调用到我的类或至少一个可以扩展的类中。