PHP Closure对象

时间:2016-10-04 13:17:01

标签: php object closures

我正在尝试为大约1000多个地点生成长期和长期的坐标,我知道如何将它们放在一个范围内,但我想知道我是否可以做这样的事情。

for ($i = 0; $i < 10; $i++) {
            $lat = function () {
                $float = rand(0, 99999) / 99999;
                $lat = rand(30, 32);
                $lat = $lat + $float;
                return $lat;
            };
            $long = function () {
                $float = rand(0, 99999) / 99999;
                $long = rand(74, 76);
                $long = $long + $float;
                return $long;
            };
            print_r($lat);
}

代码没有抛出所需的结果,我正在

closureObject()

没有错误,但我似乎无法让它工作,任何帮助都会很精彩,我已经尝试阅读文档,但没有解释与此相关的任何内容。

这可以吗?

2 个答案:

答案 0 :(得分:1)

你需要实际调用你定义的Closure函数,如:echo $lat();如果你正在尝试这样做。

正如其他人所说,你可以用传统的php方式定义一个函数。类似的东西:

function getCoord($min, $max) {
    $float = rand(0, 99999) / 99999;
    $coord = rand($min, $max);
    $coord = $coord + $float;
    return $coord;
}

for ($i = 0; $i < 10; $i++) {
    echo "Lat: " . getCoord(30, 32) . " Long: " . getCoord(74, 76);
}

答案 1 :(得分:0)

closure是一个可以像函数一样调用的对象。正如您在输出中看到的那样,当您在$lat中使用print_r($lat);时,它不是调用闭包的结果,而是闭包对象本身。 (由$lat = function () {...定义 - 参见PHP documentation for anonymous functions中的示例2),.如果你想得到那个结果,你必须用()来调用它,就像任何正常的函数调用一样。

print_r($lat());

目前,关闭并不是必需的,但是对于如何定义和使用闭包的示例,您可以这样做以消除重复的代码:

// assign the anonymous function to $coord
$coord = function($a, $b) {
    $float = rand(0, 99999) / 99999;
    $coord = rand($a, $b);
    return $coord + $float;
};

for ($i = 0; $i < 10; $i++) {
    // use $coord to generate coordinates for a point
    $point = [$coord(30, 32), $coord(74, 76)];
    var_dump($point);
}