在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');