gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:06:36 25 4
gpt4 key购买 nike

我已经为我自己的框架编写了一个简单的配置类。

有一些简单的函数,如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__setArrayAccess 实现魔法方法,这通常有助于轻松存储和访问数据,因为用于配置。

或者,您可以将析构函数对象添加到静态类成员以实现您要查找的内容:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com