PHP传入或';将参数(位掩码)转换为函数

PHP传入或';将参数(位掩码)转换为函数,php,function,logical-operators,bitmask,Php,Function,Logical Operators,Bitmask,我在php中有一个函数: function renden(array $additional_css_files = array(), $load_js = true, $load_keen = false, $allow_robots = false, $generate_csrf = true) { } 每次指定所有可选参数都变得非常讨厌。我想使用或'd标志(位掩码)作为单个函数参数执行以下技巧 define("LOAD_JS", 1); define("NO_LOAD_JS", 0);

我在php中有一个函数:

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

}
每次指定所有可选参数都变得非常讨厌。我想使用
或'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) {

}

请参阅()和参数
选项
。如何在函数中编写此逻辑?

将定义更改为位掩码:

// 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
在函数内部,按如下方式提取标志:

$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

为什么不传递一个数组呢<代码>数组('load_js'=>true,…)?位掩码是表示一组布尔值的一种非常方便的方法,而不是说(臃肿的)数组的性能影响在大多数设置中都很重要。一个问题是,如果所有可选参数都是可选的,为什么传递这些参数会很痛苦?如果你经常只需要设置其中一个在列表中较晚的,那么我可以看到。无论如何,提取值很容易。。回答来了,回答得真棒。如果我不想加载,也就是说默认值是
true
,我想传递
false
,我需要
不加载JS
,还是简单地使用
^load\u JS | load | KEEN | ALLOW | ROBOTS | GENERATE | CSRF
,例如,如果调用render(数组(“foo”)、load\u JS | load | KEEN,您正在传递二进制文件0b00000011,这意味着将关闭ALLOW_ROBOTS和GENERATE_CSRF。例如,您可以定义(“DEFAULT”,0b00001001),然后传递(DEFAULT | LOAD_KEEN)和~LOADJS。对不起,我的意思是,如果我在参数前面加上
~
,它会否定它吗?因此~反转参数的位,那么您必须在逻辑上用它关闭不需要的位。因此($someParams&~LOAD_KEEN)关闭LOAD_KEEN位。