Orijinal kod yansıma kullanarak parametre olarak bir PHP işlevi geçmiş olsun

4 Cevap php

Aşağıdaki yapmak için herhangi bir yolu olup olmadığını merak ediyorum:

function whatever($parameter)
{  
    echo funky_reflection_function();
}

whatever(5 == 7); // outputs "5 == 5" (not true or 1)

Ben iyimser değilim, ama bunu yapmak için yapabileceğiniz herhangi bir deli kesmek gidecekseniz herkes biliyor musun?

4 Cevap

Yansıma orada size yardımcı olmayacaktır, ancak kullanarak bir şeyler pişirmek mümkün olabilir debug_backtrace()

function funky_reflection_function()
{
    $trace = debug_backtrace();
    $file = file($trace[1]['file']);
    return $file[$trace[1]['line'] - 1];
}

Açıkçası, bu çok hacky ve gerçekten güvenerek olmamalı ama hata ayıklama şeyler için çalışıyorsanız o zaman bunu elde etmenize yardımcı olabilir. Bu işlev artık sizin whatever() işlevini çağırmak için kullanılan ifade ne bulmak için ayrıştırmak zorunda, size bütün çizgi verecektir.

Zed onun Açıklamanın üzerinden bir cevap yapılmış olmalıdır. Eğer bunu yaparsa, ona upvote ver.

Cevap: hayır, bunu yapamam.

Fonksiyonu parametresi (5 == 7) değerlendirilir ve bu değerlendirme sonucu ne olursa olsun () 'nin kapsamı içine ne yapar olduğunu.

Ben bunu yapmak isterdim neden çok merak olduğumu söylemeliyim. Bu durumda, daha baştan çıkarıcı bir cinnet bir tür gibi hissediyor ... anlarım - Garip bir şey gördüğünüzde Genellikle, ben "bu muhtemelen kötü tasarımın sonucudur" düşünmeye başlar.

Zaten yanıtladı, herhangi argümanlar işleve geçirmeden önce değerlendirilir, böylece geçti hayır 'orijinal kod' olduğunu vardır.

Şimdi 'çılgın kesmek için' sormak, parametre olarak rasgele "kod" geçmek için alternatif yollar bir çift vardır:

  • bir dize olarak - ki create_function () veya eval kullanılan olabilir ():

    somefunc ("5 == 7 echo;")

  • anonim bir fonksiyonu olarak - php 5.3 başlayan, biz kilitler ve anonim işlevleri vardır:

    somefunc (function () {5 == 7 return;});

Tim dediği gibi ben deli kesmek tam olarak iyi tasarımın sonucu değil itiraf gibi, biraz daha "bağlam" bilgi gerçekten yararlı olacaktır :)

Sadece bildirmek için, bu ben şimdi kullanıyorum fonksiyonudur:

// gets the line number, class, parent function, file name, and the actual lines of the call
// this isn't perfect (it'll break in certain cases if the string $functionName appears somewhere in the arguments of the function call)
public static function getFunctionCallLines($fileName, $functionName, $lineNumber)
{   $file = file($fileName);

    $lines = array();
    for($n=0; true; $n++)
    {	$lines[] = $file[$lineNumber - 1 - $n];
    	if(substr_count($file[$lineNumber - 1 - $n], $functionName) != 0)
    	{	return array_reverse($lines);
    	}
    	if($lineNumber - $n < 0)
    	{	return array();	// something went wrong if this is being returned (the functionName wasn't found above - means you didn't get the function name right)
    	}
    }
}