Belirli bir işlevde arayan işlevinin adını bulmak için bir PHP işlevi var mı?
Belirli bir işlevde arayan işlevinin adını bulmak için bir PHP işlevi var mı?
Yanıtlar:
Bkz. Debug_backtrace - bu çağrı yığınınızı en tepeye kadar takip edebilir.
Arayan kişiyi şu şekilde alabilirsiniz:
$trace = debug_backtrace();
$caller = $trace[1];
echo "Called by {$caller['function']}";
if (isset($caller['class']))
echo " in {$caller['class']}";
list(, $caller) = debug_backtrace(false);, falseperformans için ;-) (php5.3)
echo 'called by '.$trace[0]['function']
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];daha iyi bir performans ile arayan adını almak için.
Xdebug bazı güzel işlevler sağlar.
<?php
Class MyClass
{
function __construct(){
$this->callee();
}
function callee() {
echo sprintf("callee() called @ %s: %s from %s::%s",
xdebug_call_file(),
xdebug_call_line(),
xdebug_call_class(),
xdebug_call_function()
);
}
}
$rollDebug = new MyClass();
?>
iz döndürecek
callee() called @ /var/www/xd.php: 16 from MyClass::__construct
Ubuntu'ya Xdebug kurmak için en iyi yol
sudo aptitude install php5-xdebug
İlk önce php5-dev kurmanız gerekebilir
sudo aptitude install php5-dev
Bu çok geç ama geçerli işlevin çağrıldığı işlevin adını verecek işlevi paylaşmak istiyorum.
public function getCallingFunctionName($completeTrace=false)
{
$trace=debug_backtrace();
if($completeTrace)
{
$str = '';
foreach($trace as $caller)
{
$str .= " -- Called by {$caller['function']}";
if (isset($caller['class']))
$str .= " From Class {$caller['class']}";
}
}
else
{
$caller=$trace[2];
$str = "Called by {$caller['function']}";
if (isset($caller['class']))
$str .= " From Class {$caller['class']}";
}
return $str;
}
Umarım faydalı olur.
debug_backtrace() parametrelerin ayrıntılarını, geçerli çağrı yığınındaki işlev / yöntem çağrılarını sağlar.
echo debug_backtrace()[1]['function'];
PHP 5.4'ten beri çalışır .
Veya optimize edilmiş (örneğin hata ayıklamayan kullanım durumları için):
echo debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];
İlk argüman kullanılmayan fonksiyon argümanlarını doldurmayı önler, ikincisi izlemeyi iki seviyeyle sınırlar (ikincisine ihtiyacımız var).
Bunu kendim yaptım ve kendim kullanıyorum
/**
* Gets the caller of the function where this function is called from
* @param string what to return? (Leave empty to get all, or specify: "class", "function", "line", "class", etc.) - options see: http://php.net/manual/en/function.debug-backtrace.php
*/
function getCaller($what = NULL)
{
$trace = debug_backtrace();
$previousCall = $trace[2]; // 0 is this call, 1 is call in previous function, 2 is caller of that function
if(isset($what))
{
return $previousCall[$what];
}
else
{
return $previousCall;
}
}
Sadece flori'nin yolunun bir işlev olarak çalışmadığını belirtmek istedim, çünkü her zaman arayan yerine çağrılan işlev adını döndürecek, ancak yorum yapmak için itibarım yok. Benim durumumda işe yarayan flori'nin cevabına dayanan çok basit bir işlev yaptım:
class basicFunctions{
public function getCallerFunction(){
return debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]['function'];
}
}
function a($authorisedFunctionsList = array("b")){
$ref = new basicFunctions;
$caller = $ref->getCallerFunction();
if(in_array($caller,$authorisedFunctionsList)):
echo "Welcome!";
return true;
else:
echo "Unauthorised caller!";
return false;
endif;
}
function b(){
$executionContinues = $this->a();
$executionContinues or exit;
//Do something else..
}
Bu bilgiyi debug_backtrace tarafından döndürülen diziden çıkarabilirsiniz
Bu benim için en iyi şekilde çalıştı: var_dump(debug_backtrace());
Aslında debug_print_backtrace () neye ihtiyacınız olduğunu düşünüyorum. http://php.net/manual/en/function.debug-print-backtrace.php
Bu güzel yapacak:
// Outputs an easy to read call trace
// Credit: https://www.php.net/manual/en/function.debug-backtrace.php#112238
// Gist: https://gist.github.com/UVLabs/692e542d3b53e079d36bc53b4ea20a4b
Class MyClass{
public function generateCallTrace()
{
$e = new Exception();
$trace = explode("\n", $e->getTraceAsString());
// reverse array to make steps line up chronologically
$trace = array_reverse($trace);
array_shift($trace); // remove {main}
array_pop($trace); // remove call to this method
$length = count($trace);
$result = array();
for ($i = 0; $i < $length; $i++)
{
$result[] = ($i + 1) . ')' . substr($trace[$i], strpos($trace[$i], ' ')); // replace '#someNum' with '$i)', set the right ordering
}
return "\t" . implode("\n\t", $result);
}
}
// call function where needed to output call trace
/**
Example output:
1) /var/www/test/test.php(15): SomeClass->__construct()
2) /var/www/test/SomeClass.class.php(36): SomeClass->callSomething()
**/```