Объект закрытия PHP

#php #object #closures

#php #объект #замыкания

Вопрос:

Я пытаюсь сгенерировать координаты широты и длины для более чем 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()
  

Ошибки нет, но, похоже, я не могу заставить его работать, любая помощь была бы замечательной, я пробовал читать документацию, но ничего не объясняет, что связано с этим.

Может ли это работать?

Комментарии:

1. Ну, какой результат вы ожидали, если вы print_r() определяете функцию, то есть объект закрытия?

2. Определите замыкания вне цикла и вызовите их внутри. Как бы то ни было, вы на самом деле ничего не делаете.

3. Помните, что закрытие — это функция — вам нужно вызвать ее, чтобы получить значение. И если все, что вы делаете в приведенном выше коде, это генерируете случайные числа, зачем вообще беспокоиться о закрытии?

4. Вы не используете замыкания, вы просто определили их. Попробуйте: print_r($lat()); и вы должны увидеть результат. Как упоминали другие, почему бы просто не определить 2 функции, а затем использовать эти функции в своем цикле? (Может быть даже 1 функция, если вы видите в них шаблон).

Ответ №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);
}
  

Комментарии:

1. Это объект, echo работает только со строками. Я пробовал это.

2. Да, $lat это замыкание, которое является объектом, который можно вызвать. Поэтому, когда вы выполняете: $lat(); он вернет случайное значение с плавающей запятой. Обратите внимание, как я добавил () в конец переменной?

3. Я знаю о функции tradition, мне было интересно, может ли это сработать.

4. Это работает, откройте свой код и вместо print_r($lat); того, чтобы попробовать: print_r($lat()); снова обратите внимание на добавленные круглые скобки ?

Ответ №2:

Замыкание — это объект, который может вызываться как функция. Как вы можете видеть из выходных данных, когда вы используете $lat in print_r($lat); , это не результат вызова закрытия, это сам объект закрытия. (Определяется $lat = function () {... — см. Пример 2 в документации PHP для анонимных функций), . Если вы хотите получить этот результат, вы должны вызвать его с () помощью , как и любой обычный вызов функции.

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