2009-10-03 7 views
1

Possible en double:
Caller function in PHP 5?Comment puis-je obtenir l'appelé en PHP?

Je voudrais savoir d'où une fonction globale ou méthode publique est appelé. Je suppose que je pourrais le faire en inspectant debug_backtrace mais je préférerais utiliser un mécanisme plus léger s'il en existe un. Aucune suggestion?

Par exemple quelque chose comme cela, si vous imaginez la get_callee() fonction et constante existante:

function doSomething() { 
    if(get_callee() == 'PHP_GLOBAL') { throw new IllegalAccessException(); } 
    ... 
} 
+0

Non, je ne pense pas qu'il existe une façon de le faire. – Marius

+1

@Marius: Réflexion? 'debug_backtrace()'? Il y a des moyens. –

Répondre

3

Edit: Désolé, vu votre note sur debug_backtrace() maintenant.

Kinda moche mais bon, si vous avez besoin de faire quelque chose ne va pas.

La magie est dans la fonction get_callee() et debug_backtrace(). Et oui, ajoutez une vérification d'erreur si vous devez l'utiliser.

<?php 

init(); 

function foo() 
{ 
echo 'bar called from ' . get_callee() . '<br />'; 
bar(); 
} 

function bar() 
{ 
echo 'foo called from ' . get_callee() . '<br />'; 
} 

function init() 
{ 
echo 'init.. <br />'; 
foo(); 
} 

function get_callee() 
{ 
$backtrace = debug_backtrace(); 
return $backtrace[1]['function']; 
} 

Sorties:

.. initialisation

bar appelé foo

foo bar appelé de

+0

Merci, c'est aussi ce que j'ai eu ... mais je ne veux pas cette surcharge pour chaque appel de méthode. Ce que j'essaie de réaliser s'apparente au concept des amis - un moyen pour les composites de s'assurer que leurs membres publics ne sont accessibles que dans le composite, donc il y aurait un contrôle sur chaque appel. Peu importe cependant - si quelqu'un sort de la ligne, je vais les battre à mort avec une pelle. –

+0

@Chocky oui, c'est une solution beaucoup préféré, au lieu de faire ce gâchis :) –

2

Pourquoi ne pas utiliser simplement OO et déclariez votre méthode/fonction privée?

Si vous commencez à saupoudrer ces get_callee() partout dans votre code, vous créez un horrible kludge.

+0

@Anti Veeranna parce que j'aurais besoin d'un ancêtre commun pour les classes non apparentées.Dire que j'ai un utilisateur avec une sorte de UserHelper - ils ne devraient pas avoir une super-classe commune, mais j'en aurais besoin d'un pour utiliser l'accès des membres pour accomplir ceci. –

+0

Ok, je vois. Et vous n'êtes pas le premier à désirer cette fonctionnalité .. Malheureusement, il n'y a pas de façon propre de le faire en PHP :(Cette chose debug_backtrace est un hack maléfique Tout ce que j'ai trouvé à ce sujet est la recommandation à la fin de http : //bugs.php.net/bug.php? id = 37814 –

1

Xdebug fournit de jolies fonctions.

<?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(); 
?> 

retournera trace

callee() called @ /var/www/xd.php: 16 from MyClass::__construct 

Pour installer Xdebug sur ubuntu la meilleure façon est

sudo aptitude install php5-xdebug 

Vous pourriez avoir besoin d'installer php5-dev premier

sudo aptitude install php5-dev 

more info

Questions connexes