【发布时间】: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
我想从 Zenphoto 的插件中理解以下代码:
$plugin_is_filter = 5|ADMIN_PLUGIN|THEME_PLUGIN;
sn-p 与上下文脱节。这只是它背后的想法。
5|ADMIN_PLUGIN|THEME_PLUGIN 权限是按位使用的吗?
什么时候有用?
感谢任何提示,链接。
【问题讨论】:
标签: php operators bit-manipulation
当您需要在一个变量中提供一组布尔选项时,位域非常有用。例如,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
}
【讨论】:
是的,这是bitwise OR 的示例。
当您有兴趣将多个布尔标志打包成一个整数时,通常会使用按位运算。位运算符允许您操作字节的各个位,这意味着一个 8 位字节可用于存储 8 个不同的布尔值。当使用整个 8 位字节存储单个二进制“是”或“否”被认为是浪费时,这是一种非常有用的技术。
今天,几乎没有理由更喜欢在 PHP 中使用这种位打包(尤其是像 5 这样的 magic number)而不是简单的配置数组。这种技术几乎没有为 PHP 代码增加任何价值,增加了复杂性并降低了可维护性而没有真正的收益。我会非常怀疑任何以这种方式使用位标志的新 PHP 代码。
【讨论】:
boolean 列。如果您将它们传递给函数,请使用具有默认值的单独参数,或使用键/值对的单个配置数组。
$filter = PLUGIN_1 | PLUGIN_6; 而不是$filter = ($congig['plugin_1'] && $config['plugin_6']) ? $config['plugin_1_6_filter'] : $config['no_filter']; 之类的东西。但总的来说,我认为它比任何东西都更受程序员的青睐。
$filter = array('plugin_1', 'plugin_2');。干净,可读,语义上有意义。您要存储多个值,因此存储多个值。当数组在语言中如此地道地根深蒂固时,没有充分的理由将它们打包成一个值。
$filter = ($congig['plugin_1'] && $config['plugin_6']) ? $config['plugin_1_6_filter'] : $config['no_filter'];,那么它是一个非常、非常设计不佳的插件。这些都没有任何意义。
变量 $plugin_is_filter 用于标记要加载的插件。本质上,它被视为对应于枚举集插件的数组位。有关详细信息,请参阅下面的链接。
这解释了ADMIN_PLUGIN and THEME_PLUGIN are 的含义。
在页面上搜索“$plugin_is_filter”以获取有关如何使用此变量的简要说明。
http://www.zenphoto.org/news/zenphoto-plugin-architecture
我希望这会有所帮助。
【讨论】: