我怎样才能把子类的属性放到父类的方法中呢?


How can I can get a child class's properties into the parent class's methods

我有两个类:第一个类- 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();

?>