使用包含路径定义全局变量
Posted
技术标签:
【中文标题】使用包含路径定义全局变量【英文标题】:Define global variable with include-path 【发布时间】:2013-06-30 19:53:24 【问题描述】:在我的 php 项目中,我想确保代码保持可移植性和服务器独立性。
所以我添加了一个“config.php”,它包含在每个 php 文件中,其中配置了几个 config-var。
我把它包含在里面
include_once('config.php');
我的问题是,这个 config.php 中的第一个变量是:
global $path;
$path = $_SERVER['DOCUMENT_ROOT'];
要使所有包含/需要绝对和“便携”。
这当然适用于 include_once('config.php'); 之后的所有包含。 - 但是我怎样才能使这个具体包含绝对?
我现在的“解决方案”是这段代码:
//set global path if not yet set
if(!isset($path))
global $path;
$path = $_SERVER['DOCUMENT_ROOT'];
我会在每个 php 文件中添加。
有没有更优雅的解决方案?谢谢!
【问题讨论】:
【参考方案1】:全局变量确实是通往地狱的好方法。使用它们很可能是任何程序员所能做的最糟糕的事情。您如何在第一次看到并且需要分析的大型项目中找到它???根本不会。 Ctrl+f 好的,但是,您确定要 ctrl+f 您的项目吗?另外,您通常无法访问所有项目文件,或者您只是没有将它们全部保存在本地磁盘上。这就像每幅拼贴画的第一课:永远不要使用全局变量。听说过静态变量和 OOP 吗?这就是要走的路。太糟糕了,PHP 不允许您将任何变量分配给常量甚至静态变量(它非常适用于静态方法 - 我刚刚测试过 - 为什么不是静态变量然后作者?)但是伙计,你为什么要重命名变量.因为这就是你正在做的一切。您正在将名为 '$_SERVER['DOCUMENT_ROOT']' 的变量重命名为另一个名为 'PATH' 的变量,好吧它更短,但这样做有什么意义呢?更短!=更好。 $_SERVER 已经是超级全球性的了(这也很糟糕),但至少这几个超级全球性是众所周知的,我敢打赌 PHP 的作者不能取代它们,因为人们会生吃它们:D(以及与旧版本的兼容性问题)版本)
【讨论】:
【参考方案2】:另一种方法是,使用 $path 作为静态变量定义,如
define('PATH', $_SERVER['DOCUMENT_ROOT']);
那么你就可以像普通变量一样使用PATH了
echo 'directory: '.PATH;
变量区分大小写,使它们不区分大小写,以便您可以使用 PATH 或 path 或 Path .. 在末尾添加 true:
define('DOCROOT', $_SERVER['DOCUMENT_ROOT'], true);
一个常见的用例是我缩短 DIRECTORY_SEPARATOR:
define('DS', DIRECTORY_SEPARATOR, true);
问候,马克斯
【讨论】:
但这也必须在每个 PHP 文件中完成,对吧? 不,你定义一次。由于您的 config.inc.php 是强制性的,您应该使用 require_once('config.php')。另一方面 - 如果您使用 $path 并希望稍后在函数或类中使用该变量 - 您必须引用它们(如 global $path; 在每个函数中)。但是,如果将它们定义为静态变量,则可以在全球任何地方访问它们。 是的,但请再次阅读上面的内容-如果没有此特定文件的路径,我将如何做 require_once('config.php')? 哈哈,伙计,这是一个无限循环,你让自己陷入它就像说循环推理变老了,因为循环推理变老了,因为……你需要触发你的配置或类似的东西在索引页面上首先编写脚本或类似的脚本,这将为您提供配置的路径 当然,但我还需要不使用 index.php 直接引用一些文件...但您的解决方案是适合我的解决方案,因为它还允许我通过 CLI 调用一些特殊文件 【参考方案3】:另一种方法是,使用 $path 作为定义,例如
define('PATH',$_SERVER['DOCUMENT_ROOT']);
【讨论】:
谢谢。你觉得这有什么好处吗?你会在每个文件的顶部也这样做吗?【参考方案4】:那应该没问题!如果有更好的方法我不太确定。如果您的代码依赖于 config.php,我建议使用 require_once('config.php');好像没有找到或包含该文件,那么脚本将被终止,导致致命错误,并且在那之后不再继续!
【讨论】:
【参考方案5】:如果你不使用 php 框架.. 这是最好的解决方案.. 除非你想把它放在 $_SESSION var 但我不推荐它..
【讨论】:
以上是关于使用包含路径定义全局变量的主要内容,如果未能解决你的问题,请参考以下文章