Я пытаюсь создать простую конфигурационную систему в php, где вы можете просто расширить базу и поместить данные в дочерний класс, а родительский дескриптор все для вас. Я позволю коду говорить сам за себя. Однако, когда я пытаюсь это сделать, дочерний класс не изменит родительскую переменную.
Родительский класс
class ConfigBase { protected static $data = []; public static function Get($name) { if(!isset(self::$data[$name])) { return null; } return self::$data[$name]; } public static function Set($name, $value) { self::$data[$name] = $value; } }
Класс ребенка
class Database extends ConfigBase { protected static $data = [ 'host' => 'localhost', 'username' => 'root', 'password' => '', 'database' => '', 'port' => 3306 ]; }
Вывод:
// NULL echo Database::Get('host');
Есть ли способ / обходной путь / взломать это?
Измените self
на static
.
Когда вы используете self
, он всегда будет оценивать класс, в котором вы определили назначение. Для получения дополнительной информации см. http://php.net/manual/en/language.oop5.late-static-bindings.php
Или избавиться от статического свойства и использовать переменные и методы экземпляра. Тогда вы не ограничены одной конфигурацией определенного типа.