【问题标题】:bitwise operators位运算符
【发布时间】:2012-08-20 17:11:45
【问题描述】:

我想从 Zenphoto 的插件中理解以下代码:

$plugin_is_filter = 5|ADMIN_PLUGIN|THEME_PLUGIN;

sn-p 与上下文脱节。这只是它背后的想法。

5|ADMIN_PLUGIN|THEME_PLUGIN 权限是按位使用的吗?

什么时候有用?

感谢任何提示,链接。

【问题讨论】:

    标签: php operators bit-manipulation


    【解决方案1】:

    当您需要在一个变量中提供一组布尔选项时,位域非常有用。例如,PHP 允许您像这样设置错误报告:

    error_reporting(E_ERROR | E_WARNING | E_PARSE);
    

    在二进制中,这些常量具有以下值:

    E_ERROR   0001
    E_WARNING 0010
    E_PARSE   0100
    

    如果您将一组这样的选项组合在一起,您将能够在一个字段中表达设置:

    E_ERROR | E_WARNING | E_PARSE 0111
    

    然后,您可以检查使用 AND 设置的选项:

    if ($option & E_ERROR === E_ERROR) {
        // E_ERROR is set, do something
    }
    

    【讨论】:

      【解决方案2】:

      是的,这是bitwise OR 的示例。

      当您有兴趣将多个布尔标志打包成一个整数时,通常会使用按位运算。位运算符允许您操作字节的各个位,这意味着一个 8 位字节可用于存储 8 个不同的布尔值。当使用整个 8 位字节存储单个二进制“是”或“否”被认为是浪费时,这是一种非常有用的技术

      今天,几乎没有理由更喜欢在 PHP 中使用这种位打包(尤其是像 5 这样的 magic number)而不是简单的配置数组。这种技术几乎没有为 PHP 代码增加任何价值,增加了复杂性并降低了可维护性而没有真正的收益。我会非常怀疑任何以这种方式使用位标志的新 PHP 代码。

      【讨论】:

      • 你知道上一段说的更好的方法吗?
      • 这取决于上下文。如果要将值存储在数据库中,请使用单独的 boolean 列。如果您将它们传递给函数,请使用具有默认值的单独参数,或使用键/值对的单个配置数组。
      • @meagar 强词夺理地说没有理由使用它们。在执行方面,它们的效率更高(以多种方式)。另外,我更喜欢使用$filter = PLUGIN_1 | PLUGIN_6; 而不是$filter = ($congig['plugin_1'] && $config['plugin_6']) ? $config['plugin_1_6_filter'] : $config['no_filter']; 之类的东西。但总的来说,我认为它比任何东西都更受程序员的青睐。
      • @newfurniturey 执行方面,它们无关紧要。差异将无法衡量。你不应该用这种微优化来编写 PHP 代码,它是令人难以置信的弄巧成拙。使您的代码具有可读性、可维护性和安全性。你也不需要做任何类似怪物的事情;使用$filter = array('plugin_1', 'plugin_2');。干净,可读,语义上有意义。您要存储多个值,因此存储多个值。当数组在语言中如此地道地根深蒂固时,没有充分的理由将它们打包成一个值。
      • @newfurniturey 如果一个插件曾经需要这种废话$filter = ($congig['plugin_1'] && $config['plugin_6']) ? $config['plugin_1_6_filter'] : $config['no_filter'];,那么它是一个非常、非常设计不佳的插件。这些都没有任何意义。
      【解决方案3】:

      变量 $plugin_is_filter 用于标记要加载的插件。本质上,它被视为对应于枚举集插件的数组位。有关详细信息,请参阅下面的链接。

      这解释了ADMIN_PLUGIN and THEME_PLUGIN are 的含义。

      在页面上搜索“$plugin_is_filter”以获取有关如何使用此变量的简要说明。

      http://www.zenphoto.org/news/zenphoto-plugin-architecture

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 2021-11-04
        • 2020-12-13
        相关资源
        最近更新 更多