首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能在不使用全局变量的情况下将值传递给PHP中包含的文件吗?

你能在不使用全局变量的情况下将值传递给PHP中包含的文件吗?
EN

Stack Overflow用户
提问于 2010-12-17 21:12:36
回答 4查看 363关注 0票数 0

我在PHP中经常使用的一种模式是设置一些全局变量(如$page$user$db等),然后包含一个使用这些全局变量的文件。我从来不喜欢使用全局变量的想法,所以我在寻找一种更好的方法。

显而易见的解决方案是在子文件中定义一个类或函数,并在包含该文件后调用它。但在某些情况下,这是不能工作的,例如:

代码语言:javascript
复制
// 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作为参数调用每个函数,则在多个文件中定义相同的函数名称后,会发生冲突。

我没主意了。有没有更好的方法将变量传递给包含的文件而不污染全局命名空间?

EN

回答 4

Stack Overflow用户

发布于 2010-12-17 21:21:07

include和它的兄弟基本上只是复制-粘贴帮助器,它们内部的代码与调用块共享作用域-就像您将其复制粘贴到include语句所在的位置一样。使用它们的合理方法是,像使用C中的#include或C#中的using或Java语言中的import一样考虑它们:导入一些代码,以便稍后引用。如果包含文件中的代码需要参数,则将其包装在函数中,将参数放在函数参数中,在包含文件的顶部使用include_once,并在需要的任何位置使用所需的参数调用函数。不需要全局变量。根据经验,在常规操作中,最好避免将任何“执行”某些操作(在全局范围内执行语句)的代码放在一个包含文件中。

票数 2
EN

Stack Overflow用户

发布于 2010-12-17 21:25:14

不,没有。您无论如何都不会将变量传递给包含的文件。所包含的代码的行为就像它是在编写include语句的地方编写的一样。因此,您没有将变量传递到包含的文件中,文件中的代码可以简单地使用作用域中的变量,无论include语句位于何处。

在您的例子中,forum/routing.php的内容并不是真正的独立代码,它们是依赖于特定设置的作用域才能正常工作的代码片段。那可不好。您应该以一种不将它们耦合到包含代码的方式来编写您的可包含文件。例如,您可以将路由器设置为静态类,然后在forum/routing.php中静态调用它

代码语言:javascript
复制
require_once 'virtual_file_system.class.php';
VirtualFileSystem::add('forum/topic/', 'topic.php');

只要你的应用程序中有一个类VirtualFileSystem,它就会工作,并且不会污染命名空间。

票数 1
EN

Stack Overflow用户

发布于 2010-12-17 21:30:13

只需在函数中包含isolate:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4470756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档