PHP arayan fonksiyonun adını almak?


135

Belirli bir işlevde arayan işlevinin adını bulmak için bir PHP işlevi var mı?


Xdebug kullanmalısınız. Cevabımı bu yazıda görün: stackoverflow.com/questions/1513069/…
svassr

13
Xdebug kategorik olarak sadece orijinal istek olan bir PHP işlevi değildir. Arayanın işlev adını daha sonra PHP mantığında kullanmak ve XDebug'u üretim sunucularına yüklemek istemiyorsanız, bir PHP işlevine ihtiyacınız vardır.
JP

Yanıtlar:


198

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']}";

59
Bana öyle geliyor ki bu callee işlev adını yazdırıyor. Aramak için kullanın list(, $caller) = debug_backtrace(false);, falseperformans için ;-) (php5.3)
Znarkus

Web'de görülen birçok çözüm, örnek arayanı almak için geri izleme dizisinin ikinci öğesini alır: Bundan emin olabilir miyiz? İkinci eleman her zaman aradığımız unsur mu? Ben ebeveyn :: __ construct () gibi başka bir çağrı içinde içeren bir __construct () gerçek arayan (henüz denemedim) başka bir konuma kayabilir düşündüm.
Emanuele Del Grande

1
Bir ReflectionClass kullanırken döndürülen arayanların sırasını kontrol etmeyi denedim ve açıkça kullanıcı arabiriminde görünür "gerçek" arayan yönteminin konumunu değiştirir, böylece geri izleme konumunda hiçbir varsayım yapılabilir.
Emanuele Del Grande

4
dizi kaydırma ilk elemanı kaldırır ve kaldırılan elemanı döndürür. Orijinal dizi değiştirilecek ve bu gerekli sonucu vermelidirecho 'called by '.$trace[0]['function']
GoodSp33d

21
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];daha iyi bir performans ile arayan adını almak için.
ahuigo

17

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

Daha fazla bilgi


15

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.


1
En hoş geldiniz David !!! Ben de
projemde

"Tam izleme" modu çok kullanışlıdır. Paylaşım için teşekkürler.
Leopoldo Sanczyk

15

debug_backtrace() parametrelerin ayrıntılarını, geçerli çağrı yığınındaki işlev / yöntem çağrılarını sağlar.


9
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).


7

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;
    }   
}

3

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'];
    }

}

MİSAL:

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..
}




1

Bu çalışmalı:

$caller = next(debug_backtrace())['function'];

0

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()
**/```
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.