Com*_*eek 6 php static design-patterns class-design
我为自己的框架编写了一个简单的配置类.
有简单的功能,如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();
}
}
?>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,有没有更好的解决方案或我的设计模式完全错误?
hak*_*kre 10
在这种情况下,有没有更好的解决方案或我的设计模式完全错误?
仅在对象上调用析构函数,而不是对静态类调用.
相反,您可以将您的类从静态转换为常规,以便您可以创建它的实例.然后它将有析构函数.此外,它使您的代码更容易重用和测试.
此外,您还可以为配置实现魔术方法__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();
}
}
Run Code Online (Sandbox Code Playgroud)
仅供参考:您写道,您想要添加自动保存功能.常见的有差距翻倒两个__destruct()和register_shutdown_function:
注意:脚本的工作目录可以在某些Web服务器(例如Apache)下的shutdown函数内部进行更改.
您应指定一个绝对路径来访问要保存的文件.另请参阅:在析构函数中创建/编写PHP文件.
在您的init方法内,添加一个调用register_shutdown_function:
register_shutdown_function(array('Config', 'destruct'));
Run Code Online (Sandbox Code Playgroud)