首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何才能将子类的属性放入父类的方法中

问如何才能将子类的属性放入父类的方法中
EN

Stack Overflow用户
提问于 2011-12-05 02:52:33
回答 4查看 1.4K关注 0票数 1

我有两个类:第一个类- Database -处理所有数据库操作,即插入、更新、删除。另一个为用户处理特定于类的操作。user类扩展了数据库类。User类包含所有属性,并且正在尝试从Database类中获取方法,以对User类中的属性执行操作。所以我在test.php中实例化User:

代码语言:javascript
复制
<?php 
require_once("user.php");
$user = new User();

$user->auth("Scott", "rascal");
echo $user->username;
?>
<html>
<head>
    <title>test</title>
</head>
<body>

</body>
</html>

我得到了这些错误:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
<?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;
    
    }
}
?>

下面是数据库类中给我带来麻烦的部分:

代码语言:javascript
复制
<?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;
}

在我尝试扩展类并将属性移动到子类之前,我一直都工作得很好。我如何克服这些错误并正确地做到这一点?

EN

回答 4

Stack Overflow用户

发布于 2011-12-05 03:55:49

您所做的看起来应该是可行的,只是要确保构造一个用户对象,而不是直接构造一个数据库对象。这正是类继承的要点(让父类运行函数并引用您不必在每个子类中编写的属性)。

也就是说,也许可以尝试在数据库类(以及其他子类属性)中将$dbFields定义为一个空数组。不确定它是否能修复它(我通常做后期静态绑定的事情),但值得一试。

票数 3
EN

Stack Overflow用户

发布于 2011-12-05 03:51:25

在父类中将变量声明为静态变量,如果它们存在于子类中,则将在父类中使用它们。查看延迟静态绑定(LSB)

票数 2
EN

Stack Overflow用户

发布于 2011-12-05 02:57:12

您试图在数据库类中访问dbFields,但它是在User类中声明的。

您应该在自己的数据库类中声明dbFields &您可以在用户构造函数中设置此属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8377727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档