2015-07-01 14 views
6

Nesne katmanları ve kapanışları için bir sınıf oluşturdum ancak sunucum php 5.6 üzerinde çalışmıyor. VeAşağı sürüm sınıfı php 5.6 - 5.5

class Stack 
{ 
    /** 
    * Method to call on the decoracted class. 
    * 
    * @var string 
    */ 

    protected $method; 

    /** 
    * Container. 
    */ 

    protected $container; 

    /** 
    * Middleware layers. 
    * 
    * @var array 
    */ 

    protected $layers = []; 

    public function __construct(Container $container = null, $method = null) 
    { 
     $this->container = $container ?: new Container; 
     $this->method = $method ?: 'handle'; 
    } 

    public function addLayer($class, $inner = true) 
    { 
     return $inner ? array_unshift($this->layers, $class) : array_push($this->layers, $class); 
    } 

    public function addInnerLayer($class) 
    { 
     return $this->addLayer($class); 
    } 

    public function addOuterLayer($class) 
    { 
     return $this->addLayer($class, false); 
    } 

    protected function buildCoreClosure($object) 
    { 
     return function(...$arguments) use ($object) 
     { 
      $callable = $object instanceof Closure ? $object : [$object, $this->method]; 

      return $callable(...$arguments); 
     }; 
    } 

    protected function buildLayerClosure($layer, Closure $next) 
    { 
     return function(...$arguments) use ($layer, $next) 
     { 
      return $layer->execute(...array_merge($arguments, [$next])); 
     }; 
    } 


    public function peel($object, array $parameters = []) 
    { 
     $next = $this->buildCoreClosure($object); 

     foreach($this->layers as $layer) 
     { 
      $layer = $this->container->get($layer); 

      $next = $this->buildLayerClosure($layer, $next); 
     } 

     return $next(...$parameters); 
    } 
} 
+1

Serin soruya tarafından ...$arguments değiştirmektir. Daha önce bunları listelemekten kaçınmak için bu durumda parametre dizileri kullandım. –

cevap

4

kaldırarak ... i kapatma dizisi isnt çünkü o buildCoreClosure() yöntem örneğin hata verir call_user_func_array() herşeyi değiştirerek bunu düzeltmek olamaz çünkü ben ...$parameters dönüştürebilirsiniz merak ediyorum
...$arguments 
her işlev argümanları listesinde

ile değiştirerek

$arguments = func_get_args(); 

(erken işlev içinde) aşağıdaki Aynı argüman değerini elde edebilirsiniz. Argümanlar yine de işlevin argüman listesinde tanımlanmadığında dahi func_get_args() öğesine aktarılacaktır.

+0

Tamam, bunu deneyeceğim! –

0

düzeltme func_get_args()