【问题标题】:PHP passing in or'd parameters (bitmask) into a functionPHP将参数(位掩码)传入函数
【发布时间】:2014-04-02 22:44:34
【问题描述】:

我在php中有一个函数:

function renden(array $additional_css_files = array(), $load_js = true, $load_keen = false, $allow_robots = false, $generate_csrf = true) {

}

每次都指定所有可选参数变得非常讨厌。我想使用or'd 标志(位掩码)作为单个函数参数来执行以下技巧。

define("LOAD_JS", 1);
define("NO_LOAD_JS", 0);
define("LOAD_KEEN", 1);
define("NO_LOAD_KEEN", 0);
define("ALLOW_ROBOTS", 1);
define("NO_ALLOW_ROBOTS, 0);
define("GENERATE_CSRF", 1);
define("NO_GENERATE_CSRF", 0);


function render(array("foo"), LOAD_JS | NO_LOAD_KEEN | NO_ALLOW_ROBOTS | GENERATE_CSRF) {

}

请参阅 (http://www.php.net/manual/en/function.json-encode.php) 和参数 options。如何在函数内部编写此逻辑?

【问题讨论】:

  • 为什么不传递一个数组呢? array('load_js' => true, ...)?
  • 位掩码是表示一堆布尔值的一种很好的密集便捷方式,并不是说(膨胀的)数组的性能影响在大多数设置中真的很重要。一个问题是为什么传递所有可选参数会很痛苦,如果它们是可选的?如果您经常只需要设置列表中较晚的其中一个,那么我可以看到。无论如何,提取值很容易..答案来了。

标签: php function logical-operators bitmask


【解决方案1】:

将您的定义更改为位掩码:

// using binary literal notation requires PHP 5.4
define("LOAD_JS", 0b00000001);
define("LOAD_KEEN", 0b00000010);
define("ALLOW_ROBOTS", 0b00000100);
define("GENERATE_CSRF", 0b00001000);

如下调用你的函数:

$flags = LOAD_JS | LOAD_KEEN | ALLOW_ROBOTS | GENERATE_CSRF;
render(array("foo"), $flags);

在您的函数中,提取标志如下:

function renden(array $additional_css_files = array(), $flags = 0b00001001);
$load_js = $flags & LOAD_JS;
$load_keen = $flags & LOADKEEN;
// ...etc

【讨论】:

  • 非常棒的回应。如果我不想加载,即假设默认是true,我想通过false,我需要NO_LOAD_JS还是只使用^LOAD_JS | LOAD_KEEN | ALLOW_ROBOTS | GENERATE_CSRF
  • 如果你调用 render(array("foo"), LOAD_JS | LOAD_KEEN),例如,你传递二进制 0b00000011 这意味着 ALLOW_ROBOTS 和 GENERATE_CSRF 将被关闭。例如,您可以定义("DEFAULT", 0b00001001) 然后传递 (DEFAULT | LOAD_KEEN) & ~LOADJS。
  • 对不起,我的意思是如果我在参数前面加上~ 会否定它吗?
  • 所以 ~ 反转参数的位,然后你必须在逻辑上与它关闭你不想要的位。因此 ($someParams & ~LOAD_KEEN) 会关闭 LOAD_KEEN 位。
猜你喜欢
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 2019-01-23
  • 2021-05-13
  • 2012-07-16
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
相关资源
最近更新 更多