【问题标题】:How can I can get a child class's properties into the parent class's methods如何将子类的属性放入父类的方法中
【发布时间】: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) 作为一个全局类引入其他类,但我知道这不是好的做法。而且我不想使用单例,所以我尝试了这种方法,这显然行不通。我被这个难住了。我需要一种方法将连接调用到我的类或至少一个可以扩展的类中。

标签: php class extends


【解决方案1】:

您所做的似乎应该可行,只需确保构造一个用户对象而不是直接构造一个数据库对象。这是类继承的确切点(具有父运行函数和引用属性,您不必在每个子类中编写代码)。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您尝试在数据库类中访问dbFields,但它是在您的用户类中声明的。

      IMO,您应该在 Database 类中声明 dbFields,并且您可以在 User 构造函数中设置此属性。

      【讨论】:

      • 谢谢,我试试看。
      【解决方案4】:

      嘿,我也遇到了同样的问题,但我可以使用后期静态绑定来解决这个问题,这是我的示例,其中一些代码是我自己的额外代码,只关注 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();
      

      ?>

      【讨论】:

        猜你喜欢
        • 2023-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多