如何在不创建单例类的情况下处理全局信息

时间:2020-07-18 作者:Álvaro Franz

在为WordPress开发插件时,我试图摆脱单件模式。

Why?

因为我一直在读一些资料(here, here, here, here ...) 并得出结论,他们是一件坏事。或者至少,这不是人们应该使用的东西。

Why would I need a Singleton-like behavior?

因为我希望有一个具有属性的对象,其中多个类以及不同的插件可以写入和读取这些属性。

我真的不知道如何处理这个问题。

Can you please let me know how you would do it?

可能会有不同的情况和不同的解决方案,所以我将假设一个真实的例子。

Example:

一个名为“em”的插件;示例表格“在WordPress网站上创建自定义表单。

表单通过插件类添加到init钩子中的方法进行处理。

public static function setup_actions_and_filters(){
   $this_class = new self();
   add_action(\'init\', [$this_class, \'process_form\']);
....
在处理表单时,我可能希望向活动实例添加一些错误或成功消息,以便在主题中显示这些消息,例如:

$instance_of_PLUGINCLASS->show_errors();
但我无法访问;“原件”;实例,因为我在主插件文件中调用了satic setup方法。

PLUGINCLASS::setup_actions_and_filters();
这就是为什么一个常见的解决方案是让PLUGINCLASS使用Singleton模式,这是我想要避免的。

Did I come up with my own ideas?

我想:

使用数据库-可怕的想法-使用Cookie-可怕的想法-使用会话-不太好从一个请求转到另一个请求发送GET或POST信息-易受攻击和肮脏globals - 我已经读过很多遍了,使用它们不是一个好主意WP Object Cache (参见Singleton VS Object Caching)

1 个回复
最合适的回答,由SO网友:mozboz 整理而成

我认为从这里的评论中总结一些要点可能有用。(注意:“Singleton”是指将类的实例存储在类的静态属性中的模式,通常是相同的,因此这里“Singleton”和“static property”或多或少可以互换使用)

单例信条

注意关于单例的好建议和它们可能会让你养成的坏习惯的警告,但不要让它们阻止你使用单例或静态属性。比如使用全局变量,或者没有很好地将代码构造成函数和文件,或者没有很好地注释代码或命名变量;如果你没有意识到你正在使用的结构,没有注意到良好的编程习惯,那么你的生活(可能还有其他人的生活)会变得更加艰难。

只有两个选项

如果不超出PHP进程及其内存,您只需要两个选项就可以在作用域之间共享变量:

类的全局变量静态属性

使用适当的复杂性

Here 我对可用的基本选项有何想法。值得考虑的是,以下哪一项对你有意义。没有过早优化的良好开发建议您使用最简单的支持您所了解的需求的开发now, 如果需要,可以灵活地更改代码。

发挥创造力,用Wordpress的方式发挥创造力。配置类顶部的访问控制?是否使用数组或队列数据结构而不是单个变量?使用Wordpressfilters 传递值并将代码中的导入接口公开给其他用户?

一些简洁的小功能可能会让你省去很多心痛,以捕捉以下情况,例如:

您需要精确地设置一个值并读取它一次,您想允许从多个不同的位置设置任意数量的值,然后在一个位置读取所有值,您想通过查看谁以什么顺序设置/获取变量来进行调试,您想在PHP页面加载/会话之间添加缓存,您想让插件的内部可以访问其他想要扩展其功能/内容的人