我倾向于经常在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
作为参数调用它们,则在多个文件中定义后,相同的函数名称将发生冲突。
我没有想法。有没有更好的方法将变量传递给包含的文件而不会污染全局命名空间?
答案 0 :(得分:2)
include
它的兄弟姐妹基本上只是复制粘贴助手,它们里面的代码与调用块共享范围 - 好像你要复制&将其粘贴到include
语句所在的位置。使用它们的理智方式是以与在C中使用#include
或在C#中使用using
或在Java中使用import
相同的方式来考虑它们:导入一些代码以便稍后引用。如果您在包含的文件中有需要参数的代码,则将其包装在函数中,将参数放在函数参数中,使用包含文件顶部的include_once
,并使用您想要的参数调用函数,无论你需要什么。不需要全局变量。根据经验,在常规操作中,最好避免将包含“执行”内容的任何代码(在全局范围内执行语句)放入包含的文件中。(/ p>
答案 1 :(得分:1)
不,没有。无论如何,你不是将变量传递给包含的文件。包含的代码就像写入include
语句的位置一样。因此,您不会将变量传递到包含的文件中,文件中的代码只需使用include
语句所在的范围内的变量。
在您的情况下,forum/routing.php
的内容实际上不是独立代码,它们是依赖于非常具体的设置范围才能正常运行的代码片段。那很糟。您应该以不将它们与包含代码耦合的方式编写可包含文件。例如,您可以将路由器设置为静态类,并在forum/routing.php
中静态调用它:
require_once 'virtual_file_system.class.php';
VirtualFileSystem::add('forum/topic/', 'topic.php');
只要您的应用中有一个类VirtualFileSystem
,这就行了,并且不会对命名空间产生任何污染。
答案 2 :(得分:1)
只需在功能中包含:
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'));
答案 3 :(得分:0)
您可以通过将Configuration类设置为单例并在需要时检索它来尝试OOP方式。
您可以为__get和__set定义魔术方法,将它们添加到私有数组var并使构造函数变为私有。
我通常将src项目的路径定义为常量,以便快速正确地加载类文件(并使用一些SPL)。
但我同意@tdammers关于这样一个事实:include保留环境变量,就像你在调用者文件(生成包含者)一样。