PHP bir atıfta işlevin adını almak için herhangi bir yolu var mı?

3 Cevap php

Ben genellikle diğer fonksiyonların içinde denir bir işlevi var, ve ben atıfta fonksiyonu (varsa) adı neydi otomatik olarak bulmak mümkün olmak istiyorum.

Böyle bir şey:

function do_something()
{
    do_something_else();
}

function do_something_else()
{
    echo referring_function(); // prints 'do_something'
}

Bunu yapmanın kolay bir yolu var mı? Ben bunu bir parametre olarak adı geçen tarafından elle yapılabilir, ama ben bu kadar basit bir yaklaşım olup olmadığını bilmek istiyorum biliyorum unutmayın. O denir hangi işlevin adını verir gibi Ayrıca, ben, __FUNCTION__ sabit aramıyorum. Ben geçerli işlevi çağıran işlevin adını istiyorum.

3 Cevap

Bunu yapmak için korkunç debug_backtrace() kötüye olabilir. Daha iyi bir yolu olması gerektiğini gibi görünüyor ... ama bunu düşünmüyor değilim.

O bunu yapmak isterdim ki biraz garip görünüyor. Bunu kimin aradığını bilmek bir fonksiyon için gerçek bir ihtiyaç varsa, muhtemelen bir tasarım sorunu var.

Eğer bunu yapmak istediğinizden emin iseniz Ancak, sadece bu gibi küçük bir küresel bir fonksiyon tanımlayabiliriz:

function callerId(){
    $trace = debug_backtrace();
    return $trace[2]['function'];
}

Bu her zaman denilen işlevi çağıran işlevin adını döndürür. Tabii, çağıran fonksiyon callerId() üst düzey script denirdi, sürece.

Yani, bir kullanım örneği:

function callerId(){
    $trace = debug_backtrace();
    return $trace[2]['function'];
}

function do_something(){
    do_something_else();
}

function do_something_else(){
    $who_called = callerId();
}

Belki fonksiyon argümanları birine adının atmak arama işlevi zorlamak. Gibi bir şey:

function do_something()
{
    do_something_else(__FUNCTION__);
}

function do_something_else($calling)
{
    echo $calling; // prints 'do_something'
}

Olsa denenmemiş.

function callerId(){
  $trace = debug_backtrace();
  return $trace[2]['function'];
}

Bu herhangi bir sınıf içinde kullanılsa bile, düzgün çalışıyor - ama orada sınıfı tarafından limitated edilir. Bu sınıfın dışına gitmeyecek - Bir seviye daha ileri (örneğin, bir istisna çağrı hazırlayan bir işlev içinde, onu denir tek işlevi çağırır kullanmak eğer).

Sıfır ya da on olurdu (ancak bu inşaat yaratacak Öte yandan, üzerinde, böylece pek çok düzeyde olurdu) - Ve burada otomatik olarak üst düzeyde alır işlevi için geliştirmek azdır.

protected function Get_CallerFunctionName()
{
    $Function = debug_backtrace();
    $Level = count($Function)-1;
    return $Function[$Level]['function'];
}