我有两个类:第一个类- Database -处理所有数据库操作,即插入、更新、删除。另一个为用户处理特定于类的操作。user类扩展了数据库类。User类包含所有属性,并且正在尝试从Database类中获取方法,以对User类中的属性执行操作。所以我在test.php中实例化User:
<?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下面是user类:
<?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;
}在我尝试扩展类并将属性移动到子类之前,我一直都工作得很好。我如何克服这些错误并正确地做到这一点?
发布于 2011-12-05 03:55:49
您所做的看起来应该是可行的,只是要确保构造一个用户对象,而不是直接构造一个数据库对象。这正是类继承的要点(让父类运行函数并引用您不必在每个子类中编写的属性)。
也就是说,也许可以尝试在数据库类(以及其他子类属性)中将$dbFields定义为一个空数组。不确定它是否能修复它(我通常做后期静态绑定的事情),但值得一试。
发布于 2011-12-05 03:51:25
在父类中将变量声明为静态变量,如果它们存在于子类中,则将在父类中使用它们。查看延迟静态绑定(LSB)
发布于 2011-12-05 02:57:12
您试图在数据库类中访问dbFields,但它是在User类中声明的。
您应该在自己的数据库类中声明dbFields &您可以在用户构造函数中设置此属性。
https://stackoverflow.com/questions/8377727
复制相似问题