从匿名函数中使用变量

Using a variable out of an anonymous function

鉴于以下功能,我需要 calculateProducts() 到 return $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"global"让calculateProducts()可以return呢?

我试过 return $products 进入匿名函数然后 returning SoapWrapper 对象的值,当然这不会 return s 所需的 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;
    }

我找到了答案。

应该使用闭包:

public function calculateProducts($params)  {
     function ($service) use ($data, &$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, &$products) {}