2011-09-24 13 views
6

Ho alcuni file php che include un linguaggio Costantilista tutte le costanti definite da un file in php

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

ora ho bisogno di leggere ogni file ed elencare tutte le costanti ed i loro valori

e da restituire un output come questo:

nome della costante: valore è:

quindi penso che ci dovrebbe essere la funzione alla lista delle costanti definite tutte di un determinato file php.

Sono a conoscenza di funzioni come token_get_all o get_defined_constants ma non ero in grado di farlo.

+0

Che cosa non funziona se si utilizza 'get_defined_constants()'? – Niko

+1

ho notato che ho letto quei manuali, sto riguardando qui per ottenere tutte le costanti definite di un (specifico file PHP) non tutte le costanti definite di un sistema –

+0

Ah ok, ora ho capito. C'è qualche altro codice/contenuto PHP in quei file? – Niko

risposta

2

Questo è lo script php è necessario:

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

Il risultato sarà qualcosa di simile a questo:

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

è un buon approccio, ma possiamo str_replace tutti i commenti come/* commenti */e cosa c'è dentro? –

+0

ho aggiunto alcune linee di codice per rimuovere tutti i commenti – jondinham

7

Se i file non contengono altro che define dichiarazioni, è possibile utilizzare 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); 

Che cosa è in pratica: get_defined_constants(true) ci fornisce una matrice di matrici con tutte le costanti disponibili, ordinate per sezioni (core, utente, ..) - la matrice sotto la chiave 'utente' ci fornisce tutte le costanti definite dall'utente che abbiamo definito nel nostro codice php usando define, su a quel punto. array_diff_assoc ci dà la differenza tra questo array prima e dopo che il file è stato incluso .. e questo è esattamente un elenco di tutte le costanti che sono state definite in quel file specifico (purché non ci sia nessuna delle dichiarazioni un duplicato, ovvero una costante con quel nome esatto è stato definito prima - ma questo comunque causerebbe un errore).

+1

ma come sapere che la costante prima e dopo di un file php è "utente". per favore spiega di più sull'uso di questo –

+0

sì sono d'accordo con Mac, supposto che stiamo lavorando con un framework e le costanti in un file già incluso, non possiamo 'escludere' il file e 're-includere' – jondinham

+0

Come questi file sono si suppone che siano file di linguaggio, dubito che vengano inclusi prima. Quindi nessun problema con quello. @MacTaylor Quel 'utente' non c'è il nome di una singola costante, è la sezione in cui le costanti appartengono (ovvero sono definite "utente" e non da php stesso). '$ constants ['user']' è una matrice di tutte le costanti definite nel codice tramite 'define()'. – Niko

0

Supponendo che si desideri eseguire questa operazione in runtime, è necessario dare un'occhiata a PHP Reflection, in particolare allo ReflectionClass::getConstants() che consente di eseguire esattamente ciò che si desidera.

+0

sta definendo le costanti usando 'define', non usando la parola chiave 'const'. e anche non in una classe – jondinham

1

In ritardo al gioco qui ma ho avuto un problema simile. È possibile utilizzare una funzione di sostituzione/inclusione di include() che registra le costanti in un array globale accessibile.

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

?> 

Questo si tradurrà in qualcosa di simile:

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

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

) 
-1

Anch'io ho avuto lo stesso problema. Sono andato da suggerimento di jondinham, ma preferisco usare regex, in quanto è un po 'più facile da controllare e flessibile. Ecco la mia versione della soluzione:

$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); 
Problemi correlati