PHP < 5.3,create_function 和使用变量

标签 php

我正在尝试将一些 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;'));

use($nr) 应该放在哪里?

最佳答案

选项 1:全局访问

global 实际上可以正常工作: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 .这意味着通过 use,变量有多个副本并且修改一个不会影响另一个:

<?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 (global) 不起作用:

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

这个想法只是将变量转换为可以插入到函数体内的字符串。

关于PHP < 5.3,create_function 和使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16173236/

相关文章:

php - MongoDB:集合中的重复文档

php - 删除或更新时再次填充 NULL 值

javascript - JSON 数组与 MySql 之间的传入和传出。保存和循环

php - 将 MySQL 结果保存在二维数组中 - php

php - 我将 Goodreads API 结果从 XML 转换为 JSON 的方法出了什么问题?

php - 使用 currancy 格式的字段将 CSV 导入 MYSQL

php - OAuth - 开源应用程序中的消费者 secret

PHP 什么都不显示,没有错误

php - 更新 MySQL 表中的值而不是添加新值

PHP - 按另一个数组对多维数组进行排序