0

我在 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

4 回答 4

2

include它的兄弟姐妹基本上只是复制粘贴助手,其中的代码与调用块共享范围 - 就好像您将它复制并粘贴到include语句所在的位置一样。使用它们的明智方法是按照您#include在 C 或usingC# 或importJava 中使用的方式来考虑它们:导入一些代码以供稍后引用。如果包含文件中有需要参数的代码,则将其包装在一个函数中,将参数放入函数参数中,include_once在包含文件的顶部使用,并使用所需的参数调用函数,无论您需要什么. 不需要全局变量。根据经验,在常规操作中,最好避免将任何“做”某事(在全局范围内执行语句)的代码放在包含文件中。

于 2010-12-17T13:21:07.113 回答
1

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

在您的情况下,内容forum/routing.php并不是真正独立的代码,它们是代码片段,依赖于非常具体的设置范围才能正常运行。那很糟。您应该以不将它们与包含代码耦合的方式编写可包含文件。例如,您可以使您的路由器成为静态类并在以下位置静态调用它forum/routing.php

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

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

于 2010-12-17T13:25:13.550 回答
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'));
于 2010-12-17T13:30:13.000 回答
0

您可以通过将 Configuration 类设为单例并在需要时检索它来尝试 OOP 方式。

您可以为 __get 和 __set 定义魔术方法以将它们添加到私有数组 var 并使构造函数私有。

我通常只将我的 src 项目的路径定义为常量,以便快速正确地加载类文件(并且也使用一些 SPL)。

但我同意@tdammers 关于包含保留环境变量的事实,就像您在调用者文件(制作包含的人)中一样。

于 2010-12-17T13:27:58.740 回答