2010-02-04 21 views

Respuesta

9

Puede utilizar la función get_defined_functions() para obtener toda función definida en el script actual.

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

Si desea obtener las funciones definidas en otro archivo, puede probar a usar http://www.php.net/token_get_all así:

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

Entonces puede recorrer para encontrar fichas de función con los símbolos definido. La lista de fichas se puede encontrar http://www.php.net/manual/en/tokens.php

+0

get_defined_functions() obtiene todas mis funciones declaradas de todos los archivos, no desde un archivo exacly! – zumrasha

+0

actualizado. es posible que desee utilizar 'token_get_all()'. Si usa includes y requires, las funciones definidas en los otros archivos también se definirán en este archivo. – mauris

14

Puede obtener una lista de la función definida actualmente mediante el uso de get_defined_functions():

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

funciones internas son en el índice internal mientras que la función definida por el usuario en el índice son user.

Tenga en cuenta que esto generará todas las funciones que se declararon antes de esa llamada. Lo que significa que si tiene include() archivos con funciones, esos también estarán en la lista. No hay forma de separar funciones por archivo que no sea asegurarse de que no include() ningún archivo antes de la llamada al get_defined_functions().


Si debe tener la lista de funciones por archivo, el siguiente intentará para recuperar una lista de funciones mediante el análisis de la fuente.

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

Utilice bajo su responsabilidad.

+0

get_defined_functions() obtiene todas mis funciones declaradas de todos los archivos, ¡no de un solo archivo! – zumrasha

+0

@zumrasha: consulte mi respuesta actualizada, que le proporcionará una lista de funciones disponibles por archivo. –

+0

Cualquiera que use esto puede querer agregar 'T_CURLY_OPEN' al interruptor para capturar cadenas como' "hola {$ nombre}" ' – Twifty

-1

sí incluyen al archivo y probar esto:

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

Puede utilizar get_defined_functions() antes y después de incluir el archivo, y mirar a lo que se añade a la matriz del segundo tiempo. Ya que parecen estar en orden de definición, sólo puede utilizar el índice de la siguiente manera:

$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

¡Esto es inteligente! – pie6k

+0

salvaste mis horas joachim – tatskie

1

bien por cualquier razón, si usted necesita para hacer esto os muestro: archivo

Ejemplo: Funciones.php (que acabo de escribir algunas cosas al azar no lo hace Mather funciona con todo)

<?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"; 

    } 

?> 

Tenemos 3 funciones en el interior aquí:

  1. Johannes
  2. randomding
  3. watdoetjho

Pero también llamamos a estas funciones:

  1. recuento
  2. rand

Si utilizamos get_defined_functions obtendremos todas las funciones dentro de alcance de secuencia de comandos. Sí, las funciones PHP están separadas de las declaradas por el usuario, pero aún queremos de un archivo específico.

Si usamos token_get_all, recibiremos una gran cantidad de datos que necesitamos separar primero.

Encontré este número que necesitamos hacer algunas conexiones dentro de la matriz para que coincida con las funciones del usuario. De lo contrario, tendremos una lista que incluye todas las funciones de php a las que se recurre.

Los números son:

  • 334 (lista de todos los usuarios funciones declaradas)
  • 307 (Lista de todos los nombres de función)

Si filtramos la matriz de tomar todos los 334 elementos que tienen esta:

334 - | - función - | - 5

Pero necesitamos el nombre de la función y todos los elementos de la matriz están en relación con el 3er valor. Así que ahora tenemos que filtrar toda la bruja elementos de la matriz coincide con el valor 3rth (5) y el número constante 307.

Esto nos dará algo como esto:

307 - | - Johannes - | - 5

Ahora en PHP que se verá así:

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

el resultado en este caso es:

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

Escribí esta pequeña función para devolver las funciones en un archivo.

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

devuelve una simple matriz de todos los nombres de las funciones.Si llama en el archivo particular que desea escanear, sólo puede utilizar el siguiente:

$functions = get_functions_in_file(__FILE__);

1

Si no está preocupado por la captura de algunos comentadas, esta podría ser la forma más sencilla :

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

he resuelto este problema con array_diff

$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"] 

actualización

Para obtener el nombre de funciones "reales" Prueba este

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