2014-08-30 22 views
7

Bir PHP kapatma nesnesinin kaynağını yansıtmak veya yansıtmak mümkün mü? Böyle buBir PHP Kapatma Kaynağını Görüntüleyin

$closure = function() 
{ 
    return 'Hi There'; 
}; 

ve sonra bir şey gibi bir şey yapmak

var_dump($closure); 

PHP çıkışları Yani, eğer

olduğunu
object(Closure)[14] 

, ben nesne kapatma olduğunu biliyorum, ama ben ne yaptığını bilmiyorum.

Anonim işlevin gerçek gövdesini boşaltmamı sağlayacak yansıtma yöntemi, işlev veya hata ayıklama uzantısı arıyorum.

cevap

10

PHP'den alabileceğiniz sınırlar sınırlıdır; yansımayı kullanarak, yalnızca işlevin imza imzasını ve kaynak kod dosyasının başlangıç ​​ve bitiş çizgisini elde edebilirsiniz. http://www.metashock.de/2013/05/dump-source-code-of-closure-in-php/ ...

Beni yansıma kullanarak, aşağıdaki koda sebep: Bir keresinde bu konuda bir blog makale yazdı ettik

function closure_dump(Closure $c) { 
    $str = 'function ('; 
    $r = new ReflectionFunction($c); 
    $params = array(); 
    foreach($r->getParameters() as $p) { 
     $s = ''; 
     if($p->isArray()) { 
      $s .= 'array '; 
     } else if($p->getClass()) { 
      $s .= $p->getClass()->name . ' '; 
     } 
     if($p->isPassedByReference()){ 
      $s .= '&'; 
     } 
     $s .= '$' . $p->name; 
     if($p->isOptional()) { 
      $s .= ' = ' . var_export($p->getDefaultValue(), TRUE); 
     } 
     $params []= $s; 
    } 
    $str .= implode(', ', $params); 
    $str .= '){' . PHP_EOL; 
    $lines = file($r->getFileName()); 
    for($l = $r->getStartLine(); $l < $r->getEndLine(); $l++) { 
     $str .= $lines[$l]; 
    } 
    return $str; 
} 

aşağıdaki kapanması varsa:

$f = function (Closure $a, &$b = -1, array $c = array()) 
    use ($foo) 
{ 
    echo $this->name; 
    echo 'test'; 
}; 
öyle Görüyorsunuz

function (Closure $a, &$b = -1, array $c = array (
)){ 
use ($foo) 
{ 
    echo $this->name; 
    echo 'test'; 
}; 

:

closure_dump() aşağıdaki sonuçlar verecektir kusurlu (dizi param). Ayrıca, bazı kenar durumlarını düzgün bir şekilde işlemez, özellikle de kapaklar yuvalanmışsa veya bir satırdaki bir işleve birden çok satır içi kapanış geçerse. İkincisi, benim için en sorunlu görünüyor. Çünkü, yansımadan sadece başlangıç ​​ve bitiş çizgisini aldığınız için, bu durumda her iki işlev de o satırda olacak ve hangisinin boşaltılacağına karar vermek için yararlı bir bilginiz yok. Şimdiye kadar bunun için bir çözüm bulamadım, ayrıca bir çözüm olup olmadığından emin değilim. Bununla birlikte, çoğu durumda, güvenmediğiniz sürece en azından hata ayıklama için yardımcı olması gerekir.

+0

Sonuç kodunu eval() kullanılmadan değiştirildikten sonra nasıl değerlendirebilirim? – Omranic

+0

Ne zaman modifikasyon * ile ne demek istiyorsun? – hek2mgl

+0

Bu eski olduğunu biliyorum, ama yine de benim için bir durumdur .. Peki, değişiklikten sonra yansıyan kapatma kodunu aldım, bazı satırları kaldırdım ve başkalarını ekledim demektir, ve şimdi sadece bir dize, değerlendirmek gerekir eval() – Omranic

İlgili konular