1

我做了一个php教程,教我做这样的事情:

defined('DS')?null:define('DS',DIRECTORY_SEPARATOR);
defined('PUBLIC_PATH')?null:define('PUBLIC_PATH','http://www.myurl.com/');
defined('SITE_ROOT')?null:define('SITE_ROOT',DS.'home'.DS.'public_html'.DS.'myhome');
defined('LIB_PATH')?null:define('LIB_PATH',DS.'home'.DS.'public_html'.DS.'includes');

然后我可以做类似的事情:

require_once (LIB_PATH. DS .'initialize.php');

我只是被告知我可以使用_DIR_而不是像上面那样手动拼出我的路径。

这是真的?每种方式的优点/缺点是什么?

4

1 回答 1

1

这里似乎有两个问题:

  • 如何生成路径(手动与发现)
  • 使用 / 与 DS 的成本/收益

生成路径

简短的回答是,发现的路径比手动路径更通用,就像任何硬编码的一样。如果移动应用程序,则必须重新访问每个手动路径并将其修改为新位置。

另一方面,如果您从已知文件位置引导应用程序,则可以__DIR__在该文件中使用来锚定您需要的所有已发现路径。如果您移动整个应用程序,它只会继续工作。

目录分隔符

这些天,您可以在 Windows 上使用正斜杠。但是有一些你可能不想要的边缘情况。特别是如果您稍后要匹配路径。realpath将始终在 windows 上返回反斜杠,在 *nix 上返回正斜杠。因此,您可以创建两个不匹配的字符串(由于斜杠),它们将在 Windows 上访问同一个文件,幸运的是您不能在 *nix 上真正做到这一点。

但是,无论您使用何种系统,您都可以使用正斜杠realpath并始终获得适当的分隔符。

最佳实践

尽可能使用发现,当发现相对路径时,将它们包装在一个realpath调用中:

SomeApplicationRootFile.php

/**
 * This makes our life easier when dealing with paths. Everything is relative
 * to the application root now.
 */
chdir(dirname(__DIR__));

defined('DS')?null:define('DS',DIRECTORY_SEPARATOR);
defined('SITE_ROOT')?null:define('SITE_ROOT', __DIR__);
defined('LIB_PATH')?null:define('LIB_PATH', 
    realpath(__DIR__ . '/../home/public_html/includes');
于 2013-09-12T18:07:55.503 回答