Как вызвать функцию стрелки внутри другой функции в php

#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 Ну, глобальные переменные противоположны слабой связи, они связывают все в сложное общее состояние. Если вы хотите ослабить сцепление, вам нужно где-то соединить детали. Обычно это делается путем передачи объектов в методы или конструкторы других объектов; замыкания на самом деле являются лишь частным случаем этого. Если ваша сумма в долларах является глобальной, это может быть просто обычная функция, как в последнем примере, который я добавил в свой ответ.