我在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作为参数调用每个函数,则在多个文件中定义相同的函数名称后,会发生冲突。
我没主意了。有没有更好的方法将变量传递给包含的文件而不污染全局命名空间?
发布于 2010-12-17 21:21:07
include和它的兄弟基本上只是复制-粘贴帮助器,它们内部的代码与调用块共享作用域-就像您将其复制粘贴到include语句所在的位置一样。使用它们的合理方法是,像使用C中的#include或C#中的using或Java语言中的import一样考虑它们:导入一些代码,以便稍后引用。如果包含文件中的代码需要参数,则将其包装在函数中,将参数放在函数参数中,在包含文件的顶部使用include_once,并在需要的任何位置使用所需的参数调用函数。不需要全局变量。根据经验,在常规操作中,最好避免将任何“执行”某些操作(在全局范围内执行语句)的代码放在一个包含文件中。
发布于 2010-12-17 21:25:14
不,没有。您无论如何都不会将变量传递给包含的文件。所包含的代码的行为就像它是在编写include语句的地方编写的一样。因此,您没有将变量传递到包含的文件中,文件中的代码可以简单地使用作用域中的变量,无论include语句位于何处。
在您的例子中,forum/routing.php的内容并不是真正的独立代码,它们是依赖于特定设置的作用域才能正常工作的代码片段。那可不好。您应该以一种不将它们耦合到包含代码的方式来编写您的可包含文件。例如,您可以将路由器设置为静态类,然后在forum/routing.php中静态调用它
require_once 'virtual_file_system.class.php';
VirtualFileSystem::add('forum/topic/', 'topic.php');只要你的应用程序中有一个类VirtualFileSystem,它就会工作,并且不会污染命名空间。
发布于 2010-12-17 21:30:13
只需在函数中包含isolate:
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'));https://stackoverflow.com/questions/4470756
复制相似问题