2009-12-13 1 views
1

У меня была эта проблема до before без реального разрешения. Это происходит снова, поэтому я надеюсь, что вам помогут эксперты.Почему я не могу передать переменные во включенный файл в PHP?

Я установил переменную на свой index.php на основе массива $ _GET. Поэтому я использую этот код:

$admin = isset($_GET['admin']) ? $_GET['admin'] : "dashboard"; 

Ниже, что я использую функцию, чтобы включить мой макет:

include_layout("admin_header.php"); 

, который вызывает эту функцию:

function include_layout($template="") { 
    include(SITE_ROOT.DS.'layouts'.DS.$template); 
} 

До сих пор так хорошо, все работает. Но если я попытаюсь повторить переменную $ admin из файла admin_header.php, я ничего не получаю. Это похоже на то, что он не установлен. Я даже тестирую его, используя echo $admin; прямо перед тем, как включить заголовочный файл, и он выводит его, но он не задан с точки зрения файла admin_header.php.

Зачем это произошло? Это как-то связано с использованием функции для включения, а не для ее непосредственного включения? И если так, ПОЧЕМУ это имеет значение?

ответ

9

Невозможно получить доступ к глобальным переменным, если вы не указали это явно. Вы должны поставить global $admin в функцию, чтобы иметь доступ к переменной.

Причина заключается в том, что вы включаете файл внутри функции, поэтому переменная $ admin живет в глобальной области видимости, а включенный файл находится в области функций.

function include_layout($template="") { 
    global $admin; 
    include(SITE_ROOT.DS.'layouts'.DS.$template); 
} 

Другая возможность - использовать метод извлечения.

function include_layout($template="", $variables) { 
    extract($variables, EXTR_SKIP); 
    include(SITE_ROOT.DS.'layouts'.DS.$template); 
} 

include_layout("test.php", array('admin' => $admin)); 
+2

Вы могли бы объяснить, почему он не работает должным образом, а именно, что файл включен в контекст функции. – gnud

+0

Вот и все. Благодаря! – rhodesjason

12

Его потому, что эта переменная выходит за пределы области видимости, потому что вы включаете файл, используя функцию. Вам необходимо либо передать переменную в функцию в другом параметре или объявить переменную как global в функции

либо:

function include_layout($template="") { 
    global $admin; 
    include(SITE_ROOT.DS.'layouts'.DS.$template); 
} 

или:

function include_layout($template="",$admin="") { 
    include(SITE_ROOT.DS.'layouts'.DS.$template); 
} 
include_layout("admin_header.php",$admin); 
3

Это может важно, потому что PHP Безразлично 't дает функции доступа к глобальным переменным, если вы явно не попросите об этом. Санитарная обработка вашего ввода также будет хорошей идеей.

+0

Что вы подразумеваете под «дезинфекцией вашего входа»? Если вы говорите о переменной $ _GET, спасибо - я просто пытаюсь заставить включенные работы работать прямо сейчас. – rhodesjason

4

Это переменная проблема. $ admin не определен внутри функции, include_layout(). Вы можете настроить свой код несколькими способами. Один из них - «глобальный админ»; внутри include_layout(). Другой - установить переменную $ admin внутри «admin_header.php», если, например, переменная нужна только в этом контексте компоновки.