【问题标题】:What is the best way to replace static sets of values in PHP在 PHP 中替换静态值集的最佳方法是什么
【发布时间】:2014-01-24 20:30:06
【问题描述】:

Statics、consts 和 singletons 被认为是一种不好的做法,因为它们阻碍了测试,并且由于在不同地方的引用而产生了维护问题。在网站的迷你框架中,我遇到了这些问题并想替换静态,但不知道在一个用例中的最佳替代方案。

此用例由基于组的权限系统说明:对于客户端 C 有权访问数据项 X,C 的授权组名称数组中的组名称必须与 X 的“必需”名称数组中的一个匹配。

比较(“客户端是否有此身份验证?”)可以很容易地抽象为动态调用。但是,当为客户端分配组名,或在数据项上分配“必需”组名时,我如何单独引用它们并确保每个组都来自一个集中定义的集合,没有静态?

当前代码如下:

$client->appendAuzGroupName( Tokens::AUZ_GRP_PUBLIC );

-- 每次缓存刷新时,令牌都会从配置文件中加载值。

在这里和网络上搜索发现了很多反对静态/常量/单例的建议,但我发现替换它们的唯一想法是“使用 IoC / DI”。但是,通过参数获取这些值只会将问题转移到代码中的不同位置。

我愿意更改为另一种身份验证系统设计,但它必须具有这种粒度级别,并且列出用户名(ACL 设计)似乎不太可能大规模实用。

【问题讨论】:

  • 也许我理解错了,但是您不想将所有这些值都存储在数据库中吗?
  • 我猜你的令牌是只读的并且从配置中读取一次?似乎您当前使用静态的设置绝对没问题。为什么要采用简单、可行、可维护的解决方案并通过 IoC 增加复杂性?
  • @grebneke,这是一个很小且很少更改的集合,不是最好不要在每个请求上引发 I/O 吗?
  • @Steve,当前的设计阻止了单元测试,如果值列表发生变化,则需要查找多个类中的所有引用。
  • @neochipmonk:这取决于您的应用程序和配置需求。如果它很少更改并且您的用户不介意编辑配置文件 - 只需选择有效的方法并忽略数据库 + IoC/DI 流行语。你必须自己判断什么是合理的。

标签: php


【解决方案1】:

好吧,我可能已经解决了我自己的问题。

  1. Tokens 类将有一个公共构造函数、用于 XML 值的私有静态数组(由管理接口编写)、用于检索它们的公共方法;如果它们尚未加载,它会在实例化时加载值。

  2. 一些从 Token 中收集值子集的小工具,例如授权组名称列表,并提供包含它们的对象(属于 TokenSet 等)

  3. 这些“值集”在函数调用中传递,例如为管理界面提供一组选项,以应用于每个新页面的“必需”权限级别。

因此,需要使用它们的对象将获得一个包含相关集合的对象作为参数,而不是直接访问存储在内存中的值。这将是可测试的,并且避免了会产生依赖关系和维护问题的硬编码引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2022-10-07
    相关资源
    最近更新 更多