php - 在 PHP 中让对象随处可用的首选方式是什么?

标签 php oop state stateless stateful

我正在从事的项目要求我拥有一些对象,包括事件管理器、(只读)配置管理器和插件管理器,这些对象在系统中随处可用。

我一直在使用全局变量,直到有人(具有 C++ 背景)善意地指出“如果您需要全局变量,您可能做错了什么”。
他建议使用传递给所有需要它的函数的状态对象。
所以我这样做了:

$state = new State();
$state->register('eventManager' , new EventManager());
$state->register('configManager', new ConfigManager());
$state->register('cacheManager' , new CacheManager());
$state->register('pluginManager', new PluginManager());

$state->get('pluginManager')->initialize($state);

虽然我可以在更有状态的语言中看到这种方法的好处,但在(大部分?)像 PHP 这样的无状态语言中,它对我来说似乎毫无意义,因为页面加载完成后状态就会丢失。

用(大部分)无状态语言(如 PHP)传递状态对象有什么好处吗?它比其他方法(即基于全局的系统)有什么好处吗?有没有更好的方法来处理这个问题?

最佳答案

您建议的注册表仍然是一个全局变量。而如果你想访问一个全局变量(即使它是一个对象,尽管是一个全局变量),你就做错了。

正确的应用程序仅在全局状态发挥作用的阶段:引导它时。启动脚本的请求是全局的,随其发送的任何请求数据都是全局的,影响应用程序并存储在文件或其他适当存储中的任何配置也是全局的。

第一阶段应该初始化一些依赖注入(inject),将组成应用程序的所有部分组合在一起。当请求的处理决定应该调用代码的哪一部分来响应请求时,将按需创建该对象图。

通常这个决定是在处理请求的框架内完成的,并且依赖项注入(inject)也可能通过框架完成。您自己的代码将仅接受操作所需的值或所需的其他对象。

例如,如果您的代码需要数据库,那么您需要配置数据库对象以接受数据库的 URL 和凭据,然后配置读取器对象以接受该数据库对象。

依赖注入(inject)的任务是创建一个或多个数据库对象。您不必使用过时的“单例反模式”,因为它有很多缺点。

因此,在这种情况下,依赖注入(inject)部分中存在一些对象,这些对象仅创建一次并在需要时注入(inject)。这些对象不强制只创建一次,并且它们不存储在全局可访问的变量中。然而,某些东西必须存在于全局变量中,但这只是主框架对象,也可能是依赖注入(inject)容器,它们永远不会作为全局变量共享到其余代码中 - 所以这根本没有害处。

关于php - 在 PHP 中让对象随处可用的首选方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41966453/

相关文章:

php - 在 WordPress 中向编辑器显示仅限管理员的子菜单链接。结果出错

php - 我可以在准备好的语句中参数化表名吗?

java - 更好地设计构造函数中的初始化

java - 来自重写方法的 OOP java 堆栈溢出

javascript - React-router - 组件在父组件状态更改时重新加载?

java - 我的 JFrame 没有绘制选项字符串

javascript - 如何管理状态?

php - 检查数据库中的值并递增字母

java - Java中的Set、Get方法

php - JOIN 和 ON 子句(NULL 值)