#php
Вопрос:
Как я могу использовать стрелку или анонимную функцию, подобную этой, в php или что-то подобное синтаксису для достижения этой цели.
class calculator{
// $sum = fn(...$args) => array_sum($args);
public function hello(){
// $sum(5, 10)
}
}
or this way
$sum = fn(...$args) => array_sum($args);
class calculator{
public function hello(){
// $sum(5, 10)
}
}
Комментарии:
1. Как бы вы использовали глобальную переменную, например
$sum
, если бы она не была функцией?
Ответ №1:
Функция со стрелкой в PHP не является особым видом функции, просто удобный синтаксис для объявления «анонимной функции» или «закрытия» — то есть функции, которую вы можете передавать как обычную переменную.
Поэтому, как только вы создадите свою анонимную функцию $sum, она будет такой же, как и любая другая переменная — вы должны передать эту переменную туда, где она вам нужна. Обычно это делается для того, чтобы вы могли изменить, какая функция вызывается, передавая различные функции — например, подумайте о чем-то вроде регистрации обработчика ошибок.
Ваш первый пример не является законным PHP, потому что вы не можете объявить переменную, плавающую в подобном классе. Ваш второй пример является допустимым синтаксисом, но переменная $sum не была передана в функцию, поэтому там не существует. Рабочим (но не очень полезным) примером может быть такой:
$sum = fn(...$args) => array_sum($args);
class calculator{
public function hello(callable $functionToCall){
echo $functionToCall(5, 10);
}
}
$calc = new calculator();
$calc->hello($sum);
Если все, что вам нужно, — это добавить метод sum в класс, вам вообще не нужен синтаксис стрелок:
class calculator{
public function sum(...$args) {
return array_sum($args);
}
}
Аналогично, если все, что вам нужно, — это функция с именем sum, доступная везде, просто объявите ее обычной функцией, а не закрытием:
function sum(...$args) {
return array_sum($args);
}
class calculator {
public function hello() {
echo sum(5, 10);
}
}
Комментарии:
1. Я также обнаружил, что использование
global $sum;echo $sum(5, 10);
работает, так$sum
как это переменная, в конце концов, несущая с собой анонимную функцию. Тем не менее, ваш предложенный способ кажется мне лучше, так как это указывает на слабую связь.2. @nice_dev Да, я решил не упоминать глобальные переменные, так как у учащихся может возникнуть соблазн «обмануть» и сделать все глобальным, а не понимать область действия переменных, что приводит к проблемам по мере усложнения программ.
3. @KunalSharma Смотри sandbox.onlinephpfunctions.com/code/…
4. @KunalSharma Ну, это зависит от того, где вы объявили свою переменную. Но, как правило, вам лучше просто не использовать глобальные переменные.
5. @KunalSharma Ну, глобальные переменные противоположны слабой связи, они связывают все в сложное общее состояние. Если вы хотите ослабить сцепление, вам нужно где-то соединить детали. Обычно это делается путем передачи объектов в методы или конструкторы других объектов; замыкания на самом деле являются лишь частным случаем этого. Если ваша сумма в долларах является глобальной, это может быть просто обычная функция, как в последнем примере, который я добавил в свой ответ.