2010-02-04 6 views

Antwort

9

in einer PHP-Datei deklariert sind, können Sie die get_defined_functions() Funktion verwenden, um alle definierten Funktion in Ihrem aktuellen Skript zu erhalten.

See: http://www.php.net/manual/en/function.get-defined-functions.php

Wenn Sie die Funktionen in einer anderen Datei definiert erhalten möchten, können Sie http://www.php.net/token_get_all wie diese versuchen, mit:

$arr = token_get_all(file_get_contents('anotherfile.php')); 

Dann können Sie Loop-Through-Funktion Token mit den Symbolen zu finden definiert. Die Liste der Token können http://www.php.net/manual/en/tokens.php

+0

get_defined_functions() bekommt alle meine deklarierten Funktionen von allen Dateien, nicht aus exacly einer Datei zu erhalten! – zumrasha

+0

aktualisiert. Sie könnten 'token_get_all()' verwenden. Wenn Sie Includes und Requests verwenden, werden die in den anderen Dateien definierten Funktionen ebenfalls in dieser Datei definiert. – mauris

14

finden Sie eine Liste der aktuell definierten Funktion unter Verwendung get_defined_functions() bekommen kann:

$arr = get_defined_functions(); 
var_dump($arr['user']); 

Interne Funktionen sind im Index internal während benutzerdefinierte Funktion sind im Index user.

Beachten Sie, dass dies alle Funktionen ausgibt, die vor diesem Aufruf deklariert wurden. Was bedeutet, dass wenn Sie include() Dateien mit Funktionen, diese auch in der Liste sein werden. Es gibt keine Möglichkeit, Funktionen pro Datei zu trennen, außer sicherzustellen, dass Sie keine Datei vor dem Aufruf an include()get_defined_functions().


Wenn Sie die eine Liste von Funktionen pro Datei haben muss, wird die folgende versuchen, eine Liste von Funktionen abzurufen, indem die Quelle Parsen.

function get_defined_functions_in_file($file) { 
    $source = file_get_contents($file); 
    $tokens = token_get_all($source); 

    $functions = array(); 
    $nextStringIsFunc = false; 
    $inClass = false; 
    $bracesCount = 0; 

    foreach($tokens as $token) { 
     switch($token[0]) { 
      case T_CLASS: 
       $inClass = true; 
       break; 
      case T_FUNCTION: 
       if(!$inClass) $nextStringIsFunc = true; 
       break; 

      case T_STRING: 
       if($nextStringIsFunc) { 
        $nextStringIsFunc = false; 
        $functions[] = $token[1]; 
       } 
       break; 

      // Anonymous functions 
      case '(': 
      case ';': 
       $nextStringIsFunc = false; 
       break; 

      // Exclude Classes 
      case '{': 
       if($inClass) $bracesCount++; 
       break; 

      case '}': 
       if($inClass) { 
        $bracesCount--; 
        if($bracesCount === 0) $inClass = false; 
       } 
       break; 
     } 
    } 

    return $functions; 
} 

Verwendung auf eigene Gefahr.

+0

get_defined_functions() holt alle meine deklarierten Funktionen aus allen Dateien, nicht aus genau einer Datei! – zumrasha

+0

@zumrasha: Siehe meine aktualisierte Antwort, die Ihnen eine Liste der verfügbaren Funktionen pro Datei gibt. –

+0

Jeder, der dies verwendet, möchte vielleicht 'T_CURLY_OPEN' zum Schalter hinzufügen, um Zeichenfolgen wie' 'Hallo {$ name} '' – Twifty

-1

Sie in der Datei enthalten und versuchen Sie dies:

$functions = get_defined_functions(); 
print_r($functions['user']); 
8

Sie get_defined_functions verwenden können() vor und nach der Datei enthalten, und schauen, was das zweite Mal zu dem Array hinzugefügt wird. Da sie in der Reihenfolge der Definition zu sein scheinen, können Sie einfach den Index wie folgt verwenden:

$functions = get_defined_functions(); 
    $last_index = array_pop(array_keys($functions['user'])); 
    // Include your file here. 
    $functions = get_defined_functions(); 
    $new_functions = array_slice($functions['user'], $last_index); 
+0

zu finden. Smart ist das! – pie6k

+0

hast du meine stunden joachim gerettet – tatskie

1

Gut für welchen Gründen auch immer, wenn Sie dies tun müssen, das ich dir zeigen:

Beispieldatei: Funktionen.php (Ich schrieb nur einige zufällige Scheiße nicht Mather es mit alles funktioniert)

<?php 

    // gewoon een ander php script. door het gebruiken van meerdere includes kun je gemakkelijk samen aan één app werken 

    function johannes($fnaam, $mode, $array){ 

     switch ($mode) { 
      case 0: 
       echo " 
         <center> 
         <br><br><br><br><br> 
          he johannes!<br><br> 

          klik hier voor random text:<br> 
          <input type='submit' value='superknop' id='btn' action='randomding' level='0' loadloc='randomshit' /> 
          <p id='randomshit'></p> 
         </center> 
        "; 
       break; 
      case 1: 
       echo "bouw formulier"; 
       break; 
      case 2: 
       echo "verwerk formulier"; 
       break; 
      default: 
       echo "[Error: geen mode gedefinieerd voor functie '$fnaam'!]"; 
     } 
    } 

    function randomding($fnaam, $mode, $array){ 

     $randomar = array('He pipo wat mot je!','bhebhehehehe bheeeee. rara wie ben ik?','poep meloen!','He johannes, wat doeeeeee je? <input type="text" name="doen" class="deze" placeholder="Wat doe je?" /> <input type="button" value="vertellen!" id="btn" action="watdoetjho" level="0" loadloc="hierzo" kinderen="deze"> <p id="hierzo"></p>','knopje de popje opje mopje','abcdefghijklmnopqrstuvwxyz, doe ook nog mee','Appien is een **p!!!!!! hahhahah<br><br><br><br> hahaha','Ik weet eiegelijk niks meer te verzinnen','echt ik weet nu niks meer','nou oke dan[[][(!*([email protected]#&*$*^éäåðßð','he kijk een microboat: <br> <img src="https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcS_n8FH6xzf24kEc31liZF6ULHCn2IINFurlFZ_G0f0_F4sLTi74w" alt="microboat" />'); 

     $tellen = count($randomar); 
     $tellen--; 

     $rand = rand(0, $tellen); 

     echo $randomar[$rand]; 
    } 

    function watdoetjho($fnaam, $mode, $array){ 

     $dit = $array['doen']; 
     echo "Johannes is: $dit"; 

    } 

?> 

Wir haben 3 Funktionen innerhalb hier:

  1. johannes
  2. randomding
  3. watdoetjho

Aber wir nennen diese Funktionen auch:

  1. Zählung
  2. rand

Wenn wir get_defined_functions verwenden wir alle Funktionen innerhalb Umfang Skript erhalten. Ja, die PHP-Funktionen sind getrennt von den vom Benutzer deklarierten, aber wir wollen immer noch von einer bestimmten Datei.

Wenn wir token_get_all verwenden, erhalten wir eine große Menge an Daten, die wir zuerst trennen müssen.

Ich fand diese Nummer, die wir brauchen, um einige Verbindungen innerhalb des Arrays zu machen, um die Benutzerfunktionen zu entsprechen. Ansonsten haben wir eine Liste mit allen php-Funktionen, die aufgerufen werden.

Die Zahlen sind:

  • 334 (Liste aller Anwender deklarierten Funktionen)
  • 307 (Liste aller Funktionsnamen)

Wenn wir das Array filtern alle nehmen die 334 Elemente haben wir diese:

334 - | - Funktion - | - 5

Aber wir brauchen den Funktionsnamen und alle Array-Elemente stehen in Relation zum 3. Wert. So, jetzt wir alle Array-Elemente Hexe den 3rth Wert entsprechen filtern müssen (5) und die konstante Zahl 307.

Dies wird uns so etwas wie dieses:

307 - | - johannes - | - 5

nun in PHP wird es wie folgt aussehen:

<?php 
    error_reporting(E_ALL^E_NOTICE); // Or we get these undefined index errors otherwise use other method to search array 

    // Get the file and get all PHP language tokens out of it 
    $arr = token_get_all(file_get_contents('Functions.php')); 

    //var_dump($arr); // Take a look if you want 

    //The array where we will store our functions 
    $functions = array(); 

    // loop trough 
    foreach($arr as $key => $value){ 

      //filter all user declared functions 
     if($value[0] == 334){ 
        //Take a look for debug sake 
      //echo $value[0] .' -|- '. $value[1] . ' -|- ' . $value[2] . '<br>'; 

        //store third value to get relation 
        $chekid = $value[2]; 
     } 

      //now list functions user declared (note: The last chek is to ensure we only get the first peace of information about the function witch is the function name, else we also list other function header information like preset values) 
     if($value[2] == $chekid && $value[0] == 307 && $value[2] != $old){ 

        // just to see what happens 
        echo $value[0] .' -|- '. $value[1] . ' -|- ' . $value[2] . '<br>'; 
        $functions[] = $value[1]; 
        $old = $chekid; 
     } 
    } 
?> 

Ergebnis in diesem Fall:

307 -|- johannes -|- 5 
307 -|- randomding -|- 31 
307 -|- watdoetjho -|- 43 
0

Ich schrieb diese kleine Funktion, um die Funktionen in einer Datei zurückzugeben.

https://gist.github.com/tonylegrone/8742453

Es gibt eine einfache Anordnung aller Funktionsnamen.Wenn Sie es in der jeweiligen Datei sind rufen Sie scannen möchten, können Sie einfach die folgenden Befehle verwenden:

$functions = get_functions_in_file(__FILE__);

1

Wenn Sie nicht besorgt sind über einige Kommentar gesetzt diejenigen zu kontrollieren, könnte dies der einfachste Weg sein :

preg_match_all('/function (\w+)/', file_get_contents(__FILE__), $m); 
var_dump($m[1]); 
0

ich dieses Problem mit array_diff gelöst

$funcs = get_defined_functions()["user"]; 

require_once 'myFileWithNewFunctions.php'; // define function testFunc() {} here 

var_dump(array_values(array_diff(get_defined_functions()["user"], $funcs))) 
// output: array[ 0 => "test_func"] 

aktualisieren

Um die „echte“ Funktionen Name versuchen, diese

foreach($funcsDiff AS $newFunc) { 
    $func = new \ReflectionFunction($newFunc); 
    echo $func->getName(); // testFunc 
} 
Verwandte Themen