如何在静态类中模拟__destruct()?

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文件.


Tim*_*per 6

在您的init方法内,添加一个调用register_shutdown_function:

register_shutdown_function(array('Config', 'destruct'));
Run Code Online (Sandbox Code Playgroud)