微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP <5.3,create_function和use变量

我正在尝试将一些PHP 5.3代码转换PHP 5.2(不支持匿名函数).这是PHP 5.3代码

$nr = 2;
$a = array(1,2,3,4,5,6,7,8,9,10);
$a = array_filter($a,function($e) use($nr) {
    return $e % $nr == 0;
});

我的转换是这样的:

array_filter($a,create_function('$e','return $e % $nr == 0;'));

应该在哪里使用($nr)?

解决方法:

选项1:全球访问

全球将实际工作正常:

code link

<?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 copies the values when the function is defined.这意味着通过使用,有多个变量副本,修改一个不会影响另一个

<?PHP
$a = 1;
call_user_func(function()use($a){
    $a = 2;
});
var_dump($a); // PHP shows 1

要实现此功能(以便我们可以执行“完美填充”),您必须确保不为全局化变量分配新值.如果需要为变量分配新值,

如果需要修改原始值,可能需要先创建它的副本,然后全局化该副本.这样,您的原始值不受限制且可以修改

code link

<?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);

请注意,如果您需要引用的变量位于函数范围内,则选项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:连接

您可以将值直接叠加到函数的定义中:

code link

<?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);
}

在简单连接不起作用的情况下(例如对于数组和对象),唯一的选择是序列化:

code link

<?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);
}

这个想法只是将变量转换为可以在函数体中插入的字符串.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐