Можете ли вы передавать значения во включаемые файлы в PHP без использования глобальных переменных? - PullRequest
0 голосов
/ 17 декабря 2010

Шаблон, который я часто использую в PHP, устанавливает несколько глобальных переменных (например, $page, $user, $db и т. Д.), А затем включает файл, который использует эти глобальные переменные. Мне никогда не нравилась идея использовать глобальные переменные для этого, поэтому я ищу лучший способ.

Очевидным решением является определение класса или функции в подфайле и вызов его после включения файла. Есть случаи, когда это не может работать, например, это:

// Add entries to a URI table from each section of the site
global $router;
$router = new VirtualFileSystem();
$sections = array('store', 'forum', 'blog');
foreach($sections as $section)
    include dirname(__FILE__) . $section . '/routing.php';

// Example contents of 'forum/routing.php'
// implicitly receive $router from caller
$router->add('fourm/topic/', 'topic.php');
$router->add('forum/topic/new/', 'new_topic.php');
// etc

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

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

Ответы [ 4 ]

2 голосов
/ 17 декабря 2010

include и его братья и сестры в основном являются просто помощниками копирования и вставки, и код внутри них разделяет область действия с вызывающим блоком - как если бы вы копировали и вставляли его именно там, где находится оператор include.Разумный способ их использования - думать о них так же, как если бы вы использовали #include в C или using в C # или import в Java: импортируйте некоторый код, на который будет ссылаться позже.Если у вас есть код во включаемом файле, который нуждается в параметрах, затем оберните его в функцию, поместите параметры в аргументы функции, используйте include_once в верхней части включаемого файла и вызовите функцию с параметрами, которые вы хотите, где угодновам нужно.Глобалы не требуются.Как правило, в обычной работе лучше всего избегать помещения в код любого кода, который что-то «делает» (выполняет операторы в глобальной области видимости) во включенном файле.

1 голос
/ 17 декабря 2010

просто изолировать включает в функцию:

function add_entries_to_router($router, $sections) {
    foreach($sections as $section)
        include dirname(__FILE__) . $section . '/routing.php';
}

$router = new VirtualFileSystem();
add_entries_to_router($router, array('store', 'forum', 'blog'));
1 голос
/ 17 декабря 2010

Нет, нет. В любом случае вы не передаете переменные во включаемые файлы. Включенный код ведет себя так, как если бы он был написан там, где написано выражение include. Таким образом, вы не передаете переменные во включаемый файл, код в файле может просто использовать переменные, которые находятся в области видимости, где бы ни находился оператор include.

В вашем случае содержимое forum/routing.php на самом деле не является автономным кодом, это фрагменты кода, которые зависят от специально настроенной области действия для правильного функционирования. Это плохо. Вы должны записывать свои включаемые файлы так, чтобы они не связывались с включаемым кодом. Например, вы можете сделать свой маршрутизатор статическим классом и вызывать его статически в forum/routing.php:

require_once 'virtual_file_system.class.php';
VirtualFileSystem::add('forum/topic/', 'topic.php');

Пока в вашем приложении есть класс VirtualFileSystem, это будет работать и не будет загрязнять пространство имен больше, чем оно уже есть.

0 голосов
/ 17 декабря 2010

Вы можете попробовать путь ООП, создав класс Configuration как одиночный и извлекая его, когда вам это нужно.

Вы можете определить магические методы для __get и __set, чтобы добавить их в закрытый массив var и makeконструктор private.

Обычно я определяю как константу только путь к моему проекту src, чтобы быстро и правильно загружать файлы классов (и также использовать некоторые SPL).

Но я согласен с @tdammers о том, что include сохраняет переменные окружения, как если бы вы были в файле вызывающего (тот, кто делает include).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...