Как я могу получить атрибуты дочернего класса в методы родительского класса - PullRequest
1 голос
/ 04 декабря 2011

У меня есть два класса: Первый класс - База данных - обрабатывает все действия базы данных, то есть вставка, обновление, удаление.Другой обрабатывает специфичные для класса действия для пользователя.Пользовательский класс расширяет класс базы данных.В классе 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;

    }
}
?>

И вот раздел класса базы данных, который доставляет мне неприятности:

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;
}

У меня все работало нормально, пока я не попытался расширить класс и перенести атрибуты в дочерний класс.Как мне пройти через ошибки и добиться этого правильно?

Ответы [ 4 ]

3 голосов
/ 04 декабря 2011

То, что вы сделали, похоже, должно работать, просто убедитесь, что вы создали объект User, а не объект Database напрямую. Это точная точка наследования классов (с родительскими функциями запуска и ссылочными свойствами, которые вам не нужно кодировать в каждом подклассе).

Тем не менее, возможно, попробуйте определить $ dbFields как пустой массив в вашем классе Database (и других ваших свойствах подкласса в этом отношении). Не уверен, исправит ли это (обычно я делаю привязку с поздним статическим связыванием), но стоит попробовать.

2 голосов
/ 04 декабря 2011

В вашем родительском классе объявите переменные как статические, и если они существуют в дочернем классе, они будут использоваться в родительском классе. Проверьте Позднее статическое связывание (LSB)

1 голос
/ 07 марта 2014

Эй, у меня просто была такая же проблема, но я мог понять это с помощью позднего статического связывания. Вот мой пример, некоторые из кодов являются дополнительными из моего собственного, просто сосредоточиться на функции show_fields ()

<code><?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 "
"; echo""; foreach (static :: $ fields as $ key => $ value) {if (property_exists (static :: $ table_name, $ value)) {echo static :: $$ value."";}}}} класс y расширяет x {public static $ fields = array ('id', 'title'); public static $ id = 'new id'; общедоступная static $ title = 'new title'; публичная функция named_class() {return __CLASS__;}} $ xx = new x (); $ yy = new y (); $ yy-> test (); $ yy-> show_fields ();

?>

1 голос
/ 04 декабря 2011

Вы пытаетесь получить доступ к dbFields в своем классе базы данных, но он объявлен в вашем пользовательском классе.

IMO, вы должны объявить dbFields в вашем классе Database, и вы можете установить это свойство в конструкторе User.

...