2011-09-24 4 views
6

que tienen algunos archivos php que incluye un lenguaje Constanteslista de todas las constantes definidas a partir de un archivo en php

define("_SEARCH","Search"); 
define("_LOGIN","Login"); 
define("_WRITES","writes"); 
define("_POSTEDON","Posted on"); 
define("_NICKNAME","Nickname"); 

ahora tengo que leer cada archivo y la lista de todas las constantes y sus valores

y para volver una salida como esta:

nombre de constante: valor es:

así que creo que debería ser la función a la lista constantes todos definidos de un archivo php dado.

Conozco funciones como token_get_all o get_defined_constants, pero no pude hacerlo.

+0

¿Qué no funciona si está utilizando 'get_defined_constants()'? – Niko

+1

noté que he leído esos manuales, estoy preocupado aquí en obtener todas las constantes definidas de un (archivo PHP específico) no todas las constantes definidas de un sistema –

+0

Ah ok, ahora lo entiendo. ¿Hay algún otro código/contenido PHP en esos archivos? – Niko

Respuesta

2

Este es el script php que necesita:

<?php 
//remove comments 
$Text = php_strip_whitespace("your_constants_file.php"); 
$Text = str_replace("<?php","",$Text); 
$Text = str_replace("<?","",$Text); 
$Text = str_replace("?>","",$Text); 
$Lines = explode(";",$Text); 
$Constants = array(); 

//extract constants from php code 
foreach ($Lines as $Line) {  

    //skip blank lines 
    if (strlen(trim($Line))==0) continue; 
    $Line = trim($Line); 

    //skip non-definition lines 
    if (strpos($Line,"define(")!==0) continue; 
    $Line = str_replace("define(\"","",$Line); 

    //get definition name & value 
    $Pos = strpos($Line,"\",\""); 
    $Left = substr($Line,0,$Pos); 
    $Right = substr($Line,$Pos+3); 
    $Right = str_replace("\")","",$Right); 

    $Constants[$Left] = $Right; 
} 

echo "<pre>"; 
var_dump($Constants); 
echo "</pre>"; 
?> 

El resultado será algo similar a esto:

array(5) { 
    ["_SEARCH"]=> 
    string(6) "Search" 
    ["_LOGIN"]=> 
    string(5) "Login" 
    ["_WRITES"]=> 
    string(6) "writes" 
    ["_POSTEDON"]=> 
    string(9) "Posted on" 
    ["_NICKNAME"]=> 
    string(8) "Nickname" 
} 
+1

es un enfoque agradable, pero ¿podemos cambiar todos los comentarios como/* comments */y qué hay dentro de eso? –

+0

he agregado algunas líneas de código para eliminar todos los comentarios – jondinham

7

Si los archivos no contienen nada más define declaraciones, puede utilizar get_defined_constants:

function getUserDefinedConstants() { 
    $constants = get_defined_constants(true); 
    return (isset($constants['user']) ? $constants['user'] : array()); 
} 

$constantsBeforeInclude = getUserDefinedConstants(); 
include('file.php'); 
$constantsAfterInclude = getUserDefinedConstants(); 

$newConstants = array_diff_assoc($constantsAfterInclude, $constantsBeforeInclude); 

Lo que hace es básicamente: get_defined_constants(true) nos proporciona una matriz de matrices con todas las constantes disponibles, ordenadas por secciones (núcleo, usuario, ...): la matriz bajo la clave 'usuario' nos proporciona todas las constantes definidas por el usuario que definimos en nuestro código php usando define, hasta hasta ese punto. array_diff_assoc nos da la diferencia entre esta matriz antes y después de que se haya incluido el archivo ... y esa es exactamente una lista de todas las constantes que se definieron en ese archivo específico (siempre que no haya ninguna declaración duplicada, lo que significa una constante con ese nombre exacto se ha definido antes, pero de todos modos se produciría un error).

+1

pero cómo saber que la constante antes y después de un archivo php es "usuario". por favor explique más sobre el uso de este –

+0

sí, estoy de acuerdo con Mac, supongo que estamos trabajando con un marco y las constantes en un archivo ya incluido, simplemente no podemos 'excluir' el archivo y 'reincorporar' – jondinham

+0

ya que estos archivos son se supone que son archivos de lenguaje, dudo que se incluyan antes. Entonces no hay problema con eso. @MacTaylor Ese 'usuario' no es el nombre de una sola constante, es la sección a la que pertenecen las constantes (lo que significa que están definidas por "usuario" y no por la propia php). '$ constants ['user']' es una matriz de todas las constantes que definió en su código a través de 'define()'. – Niko

0

Suponiendo que desea hacer esto en tiempo de ejecución, debe echar un vistazo a PHP Reflection, específicamente en el ReflectionClass::getConstants() que le permite hacer exactamente lo que parece querer.

+0

él está definiendo constantes usando 'definir', no usando la palabra clave 'const'. y tampoco en una clase – jondinham

1

Tarde en el juego aquí pero tuve un problema similar. Podría usar una función de sustitución/envoltura include() que registra constantes en una matriz global accesible.

<?php 

function include_build_page_constants($file) { 
    global $page_constants ; 
    $before = get_defined_constants(true); 
    include_once($file); 
    $after = get_defined_constants(true); 
    if (isset($after['user'])) { 
     if (isset($before['user'])) { 
      $current = array_diff_assoc($after['user'],$before['user']); 
     }else{ 
      $current = $after['user']; 
     } 
     $page_constants[basename($file)]=$current; 
    } 
} 

include_and_build_page_constants('page1.php'); 
include_and_build_page_constants('page2.php'); 

// test the array 
echo '<pre>'.print_r($page_constants,true).'</pre>'; 

?> 

Esto dará lugar a algo como:

 
Array 
(
    [page1.php] => Array 
     (
      [_SEARCH] => Search 
      [_LOGIN] => Login 
      [_WRITES] => writes 
      [_POSTEDON] => Posted on 
      [_NICKNAME] => Nickname 
     ) 

    [page2.php] => Array 
     (
      [_THIS] => Foo 
      [_THAT] => Bar 
     ) 

) 
-1

yo también tenía el mismo problema. Pasé de la sugerencia de jondinham, pero prefiero usar expresiones regulares, ya que es un poco más fácil de controlar y flexible. Aquí está mi versión de la solución:

$text = php_strip_whitespace($fileWithConstants); 
$text = str_replace(array('<?php', '<?', '?>'), '', $text); 
$lines = explode(";", $text); 
$constants = array(); 

//extract constants from php code 
foreach ($lines as $line) { 
    //skip blank lines 
    if (strlen(trim($line)) == 0) 
     continue; 

    preg_match('/^define\((\'.*\'|".*"),()?(.*)\)$/', trim($line), $matches, PREG_OFFSET_CAPTURE); 

    if ($matches) { 
     $constantName = substr($matches[1][0], 1, strlen($matches[1][0]) - 2); 
     $constantValue = $matches[3][0]; 
     $constants[$constantName] = $constantValue; 
    } 
} 
print_r($constants); 
Cuestiones relacionadas