Есть ли лучшие решения или мой шаблон дизайна в этом случае совершенно неверен?
Деструкторы вызываются только для объектов, но не для статических классов.
Вместо этого вы можете преобразовать свой класс из статического в обычный, чтобы создать его экземпляр. Тогда у него будет деструктор. Кроме того, он упрощает повторное использование и тестирование вашего кода.
Кроме того, вы можете реализовать магические методы для __get
и __set
или ArrayAccess
, что часто полезно для простого хранения данных и доступа к ним, как для конфигурации.
Кроме того, вы можете добавить объект-деструктор к члену статического класса, чтобы достичь того, что вы ищете:
class ConfigDestructor
{
public function __destruct()
{
Config::destruct();
}
}
class Config
{
static private $destructorInstance;
static private $autoSave;
static public function get() {} /* set(), save(), load(), etc. */
static public function init($autoSave)
{
if (null === self::$destructorInstance)
self::$destructorInstance = new ConfigDestructor();
self::$autoSave = $autoSave;
}
static public function destruct()
{
if (self::$autoSave)
self::save();
}
}
Только к вашему сведению: вы написали, что хотите добавить функцию автосохранения. Существует общий разрыв, который можно уменьшить как для __destruct()
, так и для register_shutdown_function
:
Примечание: Рабочий каталог скрипта может изменяться внутри функции выключения на некоторых веб-серверах, например Apache.
Вы должны указать абсолютный путь для доступа к файлу, в который вы хотите сохранить. Смотрите также: Создание / запись PHP-файла в деструкторе .