2011-02-08 3 views
0

Я хочу знать все переменные, которые были объявлены в файле include.Как получить переменные, определенные в конкретном файле include в php?

Пример кода:

  1. Включить файл:

    <?php 
    $a = 1; 
    $b = 2; 
    $c = 3; 
    $myArr = array(5,6,7); 
    ?> 
    
  2. Главный файл:

    <?php 
    
    $first = get_defined_vars(); 
    include_once("include_vars.php"); 
    $second = get_defined_vars(); 
    
    $diff = array_diff($second ,$first); 
    var_dump($diff); 
    
    $x = 12; 
    $y = 13; 
    ?> 
    

Моя попытка использовать разность get_defined_vars() не как представляется, дают точную информацию на. Это дает:

array(2) { 
    ["b"]=> 
    int(2) 
    ["c"]=> 
    int(3) 
} 

$ а и $ myArr, кажется, не хватает. Какие другие методы я могу использовать?

+3

не используйте глобальные переменные. Позвольте мне повторить это. Не используйте глобальные переменные. Передавайте переменные, обернутые в контейнеры, такие как объект. Заметьте, что я сказал, что пройдите, а не позвоните по всему миру. Читайте о [Injection Dependency] (http://www.phparch.com/2010/03/static-methods-vs-singletons-choose-neither/) ... – ircmaxell

ответ

2

Это действительно нехорошо сделать это, надеясь, что это необходимо только для отладки. Тогда вы должны найти разницу между ключами массивов, которые get_defined_vars возвращают, а не между их значениями:

$diff = array_diff(array_keys($second),array_keys($first)); 

Если вы не хотите включать в свой файл, более сложный способ будет использовать Tokenizer:

$tokens = token_get_all(file_get_contents("include_vars.php")); 

foreach($tokens as $token) { 
    if ($token[0] == T_VARIABLE) 
     echo $token[1] . ', '; 
} 

Это будет возвращать все переменные, даже без глобал те, и те, которые были сняты с охраной в этом скрипте (!)

+0

Да, это необходимо только для цели отладки. Не является частью основной реализации. – DhruvPathak

+0

Я также был бы признателен, если вы также предложите другие методы. – DhruvPathak

+0

Наилучший способ найти разницу между этими массивами. Добавлено о Tokenizer, но я бы не использовал его – meze

Смежные вопросы