我已经为我自己的框架编写了一个简单的配置类。
有一些简单的函数,如get()
、set()
或loadFile()
。
但是所有函数和变量都是静态的。
现在我想实现一个自动保存机制。我想创建一个实例(在我的 init() 函数中),其 __destruct()
将调用静态 destruct()
函数:
<?php
class Config
{
static private $autoSave;
static public function get() {} /* set(), save(), load(), etc. */
static public function init($autoSave)
{
self::$autoSave = $autoSave;
new Config();
}
static public function destruct()
{
if (self::$autoSave)
self::save();
}
public function __destruct()
{
Config::destruct();
}
}
?>
在这种情况下是否有更好的解决方案或者我的设计模式完全错误?
最佳答案
Are there any better solutions or is my design pattern completely wrong in this case?
析构函数仅针对对象调用,不适用于静态类。
相反,您可以将您的类从静态类转换为常规类,这样您就可以创建它的一个实例。然后它将具有析构函数。此外,它还使您的代码更易于重用和测试。
此外,您还可以为 __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
都有一个共同的差距。 :
Note: Working directory of the script can change inside the shutdown function under some web servers, e.g. Apache.
您应该指定一个绝对路径来访问要保存到的文件。另见:PHP file creation/write within destructor .
关于php - 如何在静态类中模拟 __destruct()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6984470/