【问题标题】:PHP Closure ObjectPHP 闭包对象
【发布时间】:2017-02-12 16:26:49
【问题描述】:

我正在尝试为大约 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()

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

这行得通吗?

【问题讨论】:

  • 好吧,如果你 print_r() 一个函数定义,那么一个闭包对象,你期望什么输出
  • 在循环外定义闭包,并在循环内调用它们。事实上,你并没有真正做任何事情。
  • 记住,闭包是一个函数——你需要调用它来获取一个值。如果您在上面的代码中所做的只是生成随机数,那么为什么还要为闭包而烦恼呢?
  • 你没有使用闭包,你只是定义了它们。试试:print_r($lat());,你应该会看到结果。正如其他人所提到的,为什么不只定义 2 个函数然后在循环中使用这些函数呢? (如果您看到其中的模式,甚至可能是 1 个函数)。

标签: php object closures


【解决方案1】:

您需要实际调用您定义的闭包函数: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);
}

【讨论】:

  • 它是一个对象,echo 只适用于字符串。我试过了。
  • 是的,$lat 是一个闭包,它是一个可调用的对象。因此,当您执行:$lat(); 时,它将返回一个随机浮点值。注意到我是如何将()添加到变量末尾的吗?
  • 我知道传统功能,我想知道这是否可以工作。
  • 它确实有效,打开你的代码,而不是 print_r($lat); 尝试:print_r($lat()); 再次注意添加的括号?
【解决方案2】:

closure 是一个可以像函数一样调用的对象。从输出可以看出,当你在print_r($lat);中使用$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);
}

【讨论】:

    猜你喜欢
    • 2011-05-03
    • 2015-01-15
    • 1970-01-01
    • 2012-07-23
    • 2010-10-04
    • 2014-03-20
    • 2019-07-03
    • 2011-08-16
    • 1970-01-01
    相关资源
    最近更新 更多