Использование переменной из анонимной функции

#php #return #anonymous-function

#php #Возврат #anonymous-функция

Вопрос:

Учитывая следующую функцию, мне нужно calculateProducts() вернуть $products массив.

 public function calculateProducts($params)  {

     SoapWrapper::service('calculateProducts', 
        function ($service) use ($data) {
          $listProducts = $service->call('calculateProducts');
          foreach ($listProducts->return->productList as $pdt) {
              $product = new ProductsResult;
              $product->valueA = "a";
              $product->valueB  = "b";
              $product->save();
              $products[] = $product;
          }
        }
    );
    return $products;
}
  

Это не работает: я предполагаю, что я путаюсь с анонимной функцией (функции, которые я сейчас с трудом читаю), поскольку $products в нее входит.

Как сделать $products «глобальный», чтобы calculateProducts() он мог его возвращать?

Я попытался вернуться $products в анонимную функцию, а затем вернуть значение объекта SoapWrapper, конечно, это не возвращает необходимый массив объектов ProductsResult, см. Ниже :

  public function calculateProducts($params)  {

         $pdts = SoapWrapper::service('calculateProducts', 
            function ($service) use ($data) {
              $listProducts = $service->call('calculateProducts');
              foreach ($listProducts->return->productList as $pdt) {
                  $product = new ProductsResult;
                  $product->valueA = "a";
                  $product->valueB  = "b";
                  $product->save();
                  $products[] = $product;
              }
            return $products;
           }
        );
        return $pdts;
    }
  

Ответ №1:

Я нашел ответ.

Следует использовать замыкание :

 public function calculateProducts($params)  {
     function ($service) use ($data, amp;$products) {
          $listProducts = $service->call('calculateProducts');
          foreach ($listProducts->return->productList as $pdt) {
              $product = new ProductsResult;
              $product->valueA = "a";
              $product->valueB  = "b";
              $product->save();
              $products[] = $product;
          }
        }
    return $products;
}
  

Ключ здесь function ($service) use ($data, amp;$products) {} .