选项 1:全球访问
global
实际上会正常工作:
<?php
$nr = 2;
$a = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$a = array_filter($a, create_function('$e', '
global $nr;
return $e % $nr == 0;
'));
var_dump($a);
这有效地为我们提供了“JavaScript 风格”的访问权限,其中只有一个变量副本,对该变量的任何写入都将在其他任何地方看到:
<script> // javascript code:
var a = 1;
(function(){
a = 2;
})();
console.log(a); // javascript shows 2
</script>
但是,请注意,“JavaScript 样式”访问提供的功能与 不同,use
因为use
在定义函数时会复制值。这意味着 viause
有多个变量副本,修改一个不会影响另一个:
<?php
$a = 1;
call_user_func(function()use($a){
$a = 2;
});
var_dump($a); // php shows 1
为了实现这个功能(这样我们可以做一个“完美的垫片”),你必须确保你没有给全局变量分配新的值。如果您需要为变量分配新值,
如果您需要修改原始值,您可能需要先创建它的副本,然后将该副本全球化。这样,您的原始值不受限制并且可以修改:
<?php
$nr = 2;
$nr_copy = 2;
$a = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$nr = 3; // you can freely modify $nr because the function below is using $nr_copy
$a = array_filter($a, create_function('$e', '
global $nr_copy;
return $e % $nr_copy == 0;
'));
var_dump($a);
请注意,global
如果您需要引用的变量在函数的范围内,则选项 1 ( ) 不起作用:
<?php
some_function();
function some_function(){
$nr = 2;
$a = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$a = array_filter($a, create_function('$e', '
global $nr; // this will not work because $nr is undefined
return $e % $nr == 0;
'));
var_dump($a);
}
对于这种情况,您别无选择,只能使用选项 2。
选项 2:串联
您可以将值直接叠加到函数的定义中:
<?php
some_function();
function some_function(){
$nr = 2;
$a = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$a = array_filter($a, create_function('$e', '
return $e % '.$nr.' == 0;
'));
var_dump($a);
}
在简单连接不起作用的情况下(例如对于数组和对象),唯一的选择是序列化:
<?php
some_function();
function some_function(){
$nr = 2;
$a = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$a = array_filter($a, create_function('$e', '
return $e % unserialize(\''.str_replace("'", "\'", serialize($nr)).'\') == 0;
'));
var_dump($a);
}
这个想法只是将变量转换为可以插入到函数体中的字符串。