我有两个类:第一个类- Database -处理所有数据库操作,即插入,更新,删除。另一个为用户处理特定于类的操作。用户类扩展数据库类。用户类具有其中的所有属性,我试图从数据库类中获取方法,以从用户类中对属性执行操作。我在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
下面是用户类:
<?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;
}
在我尝试扩展类并将属性移动到子类之前,我的一切工作都很好。我如何克服这些错误并正确地实现这一点?
您所做的看起来应该可以工作,只是要确保直接构造一个User对象而不是一个Database对象。这正是类继承的要点(让父类运行函数和引用属性,而不必在每个子类中编写代码)。
也就是说,也许可以尝试将$dbFields定义为数据库类(以及其他子类属性)中的空数组。不确定它是否会修复它(我通常做后静态绑定的事情),但值得一试。
在父类中声明变量为静态,如果它们存在于子类中,它们将在父类中使用。查看延迟静态绑定(LSB)
您尝试访问数据库类中的dbFields
,但它是在用户类中声明的。
IMO,你应该声明dbFields
在你的数据库类&
嘿,我也遇到了同样的问题,但我可以通过使用晚期静态绑定来解决这个问题这是我的例子,其中一些代码是我自己编写的只关注show_fields()函数
<?php
class x {
protected static $table_name;
public static $fields = array();
public function __construct() {
self::set_table_name();
}
public function called_class() {
return __CLASS__;
}
public function set_table_name() {
self::$table_name = static::called_class();
}
public function test() {
echo self::$table_name;
}
public function show_fields() {
echo "<pre>";
print_r(static::$fields);
echo "</pre>";
echo "<br />";
foreach (static::$fields as $key => $value) {
if(property_exists(static::$table_name, $value)) {
echo static::$$value . "<br />";
}
}
}
}
class y extends x {
public static $fields = array('id','title');
public static $id = 'new id';
public static $title = 'new title';
public function called_class() {
return __CLASS__;
}
}
$xx = new x();
$yy = new y();
$yy->test();
$yy->show_fields();
?>