【问题标题】:The best way to ensure staticness in PHP?在 PHP 中确保静态性的最佳方法是什么?
【发布时间】:2011-08-25 16:03:45
【问题描述】:

我有这个Config-class,我在我的 PHP5 应用程序中使用它来加载和解析我的静态配置。到目前为止,我已经设法使该类不再是单例/注册表,而是在依赖注入的帮助下将Config 类的实例传递到需要它的任何地方。

但是现在,由于我需要在运行时在一个地方设置/更改我的 Config,我的更改并没有在全球范围内反映出来,并且在 PHP 中使用 static 修饰符与专家相去甚远,我需要问:

确保在我的Config-class 中的属性更改反映在我的整个应用程序中而不使该类成为单例的最佳方法是什么?我可以让变量保存配置数据static吗?

【问题讨论】:

    标签: php oop static


    【解决方案1】:

    到目前为止,我已经设法使该类不再是单例/注册表,而是在依赖注入的帮助下将 Config 类的实例传递到需要它的任何地方。

    如果您将 Config 类的相同实例传递给应用程序的每个部分,并且您更改了设置,它应该会在其他任何地方反映出来。

    如果您正在创建该类的多个对象(并且每次都解析该配置文件?!)您可能希望停止这样做。这可能很浪费,我会说这很混乱。

    所以,如果你 create only one 并传递它,一切都应该没问题。


    假设您创建了只应该存在一次的对象的多个实例:

    如果您能够“修复”您的架构以允许您这样做:这样做。

    如果你不能这样做......那么......创建一个静态属性来将你的值保存在一个你可以关闭多个实例的类中,至少在我的书中,一个主要的 wtf 因素。如果您无法修复(意味着这样做很麻烦),只需以预期的方式“破坏”它,这样其他人就不会绊倒它。

    我宁愿有一个单例,也不愿使用单例产生所有问题的东西,在于成为全局变量的包装器。

    【讨论】:

    • 我认为他的重点是首先要避免单身;在开始重新发明轮子之前重新发明树木会更有趣,而不仅仅是成为社会的有生产力的一员我猜......
    • @Blindy 并且“只创建一个”是如何避免单例对象只需要在应用程序上下文中存在一次。单例的问题通常是它是全局状态且不可测试(等等,yada yada yada),OP 似乎想避免这种情况。
    • 哦,我明白了,有趣的模式。有点约定俗成,但我可以看到它的工作原理。
    • @Blindy 是的,这绝对是强制执行的惯例。正如开发人员可以使用反射来创建单例的第二个实例一样,我们可以创建数据库连接的另一个实例。这只是将“强制”放入“框架”并排除在该类之外,因此您可以很好地分离关注点。整洁的东西可以是“现在我们需要在一次请求中使用不同的配置运行两次代码的和平,但配置是一个单例,现在怎么办”。
    • 该死的!我刚刚经历了今年最大的 WTF 时刻。发生的事情是我将包含我的配置参数的变量设置为private 并完全忽略了它。现在一切都按预期工作。感谢您的支持!
    【解决方案2】:

    盲目地避免设计模式,因为您在 Internet 论坛上听说它们很糟糕,这与一般的单例模式一样是一种反模式。如果工具适合某项工作,那么它就是正确的。

    看看你的问题,看在上帝的份上,你正试图通过复杂的多更新系统来模拟单例......而且你知道,让一个类成为静态本质上就是把它变成一个单例,尽管它不安全,可以随时被覆盖。

    TL;DR:独立思考并使用正确的工具;使您的配置类成为单例。

    【讨论】:

    • 虽然答案很直白,但单例是正确的答案。
    • @Blindy 我尝试避免使用单例以确保模块化,从而更容易保持高可测试性,而不是因为它被称为可怕的反模式。
    • 如何使配置变量static 有帮助?
    • 很遗憾,我没有经验回答这个问题
    • 将类设为静态会损害模块化和可测试性。创建 Config 类的实例并将其传递给需要它的所有对象,这样您的方法实际上是模块化和可测试的。
    猜你喜欢
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2019-02-24
    • 1970-01-01
    相关资源
    最近更新 更多