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