Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用DIR_vs手动详细说明路径_Php_File_Path - Fatal编程技术网

在PHP中使用DIR_vs手动详细说明路径

在PHP中使用DIR_vs手动详细说明路径,php,file,path,Php,File,Path,我做了一个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_PAT

我做了一个
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');
我刚刚被告知我可以使用
\u DIR\u
而不是像上面那样手动拼写路径


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

这里似乎有两个问题:

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

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

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

目录分隔符

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

但是,您可以将前斜杠与
realpath
一起使用,并且无论您在哪个系统上,都可以使用适当的分隔符

最佳实践

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

SomeApplicationRootFile.php


这里似乎有两个问题:

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

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

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

目录分隔符

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

但是,您可以将前斜杠与
realpath
一起使用,并且无论您在哪个系统上,都可以使用适当的分隔符

最佳实践

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

SomeApplicationRootFile.php


你不必再担心目录分隔符了。您也可以在windows机器上使用
/
正斜杠作为
目录\u分隔符
。@bansi很高兴知道。但是向后兼容性更安全?@kicking莴苣只有在您计划开发一个可能在旧版本的PHP上使用的解决方案时才使用。请看,我更喜欢使用
dirname(\uuuu文件\uuuu)
\uuuu DIR\uuuuu
用于
站点根目录
,对于
公共路径
只需一个简单的
//code>,而不是硬编码位置。当您将脚本部署到生产服务器或作为子域时,它会变得更容易。您不必再担心
目录分隔符
。您也可以在windows机器上使用
/
正斜杠作为
目录\u分隔符
。@bansi很高兴知道。但是向后兼容性更安全?@kicking莴苣只有在您计划开发一个可能在旧版本的PHP上使用的解决方案时才使用。请看,我更喜欢使用
dirname(\uuuu文件\uuuu)
\uuuu DIR\uuuuu
用于
站点根目录
,对于
公共路径
只需一个简单的
//code>,而不是硬编码位置。当您将脚本部署到生产服务器或作为子域时,它会变得更容易。感谢您的详细回答。我喜欢你发布的最终结果。这条线有必要吗<代码>chdir(dirname(_DIR__))我很确定我有一种感觉,你为什么这么做,但你可以详细说明一下吗?如果包含此文件的“end”文件位于另一个目录中,则似乎只是将您设置为本地目录。这就是原因吗?是的,它也允许您从已知路径执行命令行脚本。因此,如果你为任何事情付出代价,你也知道你在哪里付出代价。谢谢你的详尽回答。我喜欢你发布的最终结果。这条线有必要吗<代码>chdir(dirname(_DIR__))我很确定我有一种感觉,你为什么这么做,但你可以详细说明一下吗?如果包含此文件的“end”文件位于另一个目录中,则似乎只是将您设置为本地目录。这就是原因吗?是的,它也允许您从已知路径执行命令行脚本。所以,如果你为任何事情掏钱,你也知道你在哪里掏钱。
/**
 * 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');