2009-09-19 3 views

Répondre

0

réflexion ne vous aidera pas là, mais vous pourriez être en mesure de faire cuire quelque chose en utilisant debug_backtrace()

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

De toute évidence, ce qui est très hacky et ne devrait pas vraiment être invoqué, mais si vous essayez pour déboguer des choses alors il pourrait vous aider à atteindre cet objectif. Cette fonction vous donnera la ligne entière, maintenant vous devez l'analyser pour trouver quelle était l'expression utilisée pour appeler votre fonction whatever().

+0

J'ai pensé à cela juste après avoir posté. Je n'aime pas vraiment parce que si vous quelque chose où la fin paren de la fonction est sur une ligne séparée .. bien .. vous êtes foutu (sauf si vous aimez l'analyse php). En tout cas, je pense que c'est probablement aussi proche que possible de ce que je veux. –

0

Zed aurait dû répondre à son commentaire. Si c'est le cas, donnez-lui l'upvote.

La réponse est: non, vous ne pouvez pas faire cela.

Le paramètre de fonction (5 == 7) est évalué, et le résultat de cette évaluation est ce qui le place dans la portée de quelquechose().

Je dois dire que je suis très curieux de savoir pourquoi vous voudriez faire cela. Habituellement, quand je vois quelque chose de bizarre, je commence à penser «c'est probablement le résultat d'un mauvais design» - dans ce cas, cela ressemble plus à une sorte de folie séduisante ... dites-le.

+0

Alors ok, j'utilise simpletest et je trouve les tests unitaires à sois plutôt gentil. MAIS, je n'aime pas la façon la plus simple de gérer les choses (les avertissements et les notifications ont mystérieusement disparu, la classe entière d'UnitTestCase est utilisée comme un seul test, quand je veux que chaque fonction soit son propre cas de test, etc.). Donc, je roule mon propre truc de test unitaire beaucoup plus simple. Bref, je veux être capable de faire: affirmer (89> 90) et faire imprimer quelque chose comme "Vous craignez clairement la programmation parce que 89> 90 est faux". Ce ne serait pas gentil?Je vais utiliser l'idée de Josh Davis. –

0

Comme déjà répondu, tous les arguments sont évalués avant de passer à la fonction, donc il n'y a pas de 'code original' passé.

Maintenant que vous demandez « hacks fou », il y a, deux autres façons de passer « code » aléatoire en tant que paramètre:

  • comme une chaîne - qui pourrait être utilisé dans create_function() ou eval():

    somefunc ("echo 5 == 7;")

  • comme une fonction anonyme - à partir de PHP 5.3, nous avons des fermetures et des fonctions anonymes:

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

Comme tim dit, un peu plus « contexte » l'information serait vraiment utile que je l'avoue hacks fous ne sont pas exactement le résultat de la bonne conception :)

0

Juste pour vous le savez, c'est le fonction J'utilise maintenant:

// 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) 
     } 
    } 
} 
Questions connexes