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.
Sonuç kodunu eval() kullanılmadan değiştirildikten sonra nasıl değerlendirebilirim? – Omranic
Ne zaman modifikasyon * ile ne demek istiyorsun? – hek2mgl
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