为什么PHP的主流框架和CMS采用绝对路径而不是相对路径?


按理说,相对路径遍历的目录比绝对路径要少呀。 比如../admin/明显要比c:/wamp/www/cms/templates/admin/遍历的目录少。

情境:使用include(_once),require(_once)时。

注: 此处所指的绝对路径是指服务器使用的是文件的物理路径(也称为根相对路径),无论是使用"__DIR__"还是一个变量。 此处所指的相对路径是目录相对路径(./xxx.php),不是文件名的相对路径(xxx.php)。

可能性1:使用相对路径会解析成绝对路径再执行。

结果:手册上表示相对路径不会被解析成绝对路径@jackeychen

可能性2:include_path()对效率会有影响。

结果:手册上说明除了类似于xxx.php的文件名之外,只要是路径,就不会再使用include path()(但是@zhaoyi指出php5.2之前相对路径还是会受inc... path影响,Laruence在10年的一片文章也提到相对路径受到include_path的影响(其实他指的是文件名的相对目录))

附1:PHP手册 include函数: 被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include path 指定的目录寻找。如果在 include path 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则 include 结构会发出一条警告;这一点和 require 不同,后者会发出一个致命错误。 如果定义了路径 ——不管是绝对路径(在 Windows 下以盘符或者 \ 开头,在 Unix/Linux 下以 / 开头)还是当前目录的相对路径(以 . 或者 .. 开头)——include_path 都会被完全忽略。例如一个文件以 ../ 开头,则解析器会在当前目录的父目录下寻找该文件。

附2:参考文章 《深入理解PHP之require/include顺序》 from Laruence.

cms 框架 php

yugilin 10 years, 6 months ago

其实主要的问题是程序设计的问题:
dirA/a1.php, a2.php
其中a1.php包含了a2.php,代码如下:include 'a2.php';
dirB/b.php
b.php里面要包含dirA/a1.php
,然后a1.php被载入,然后他包含a2.php的代码就出错了。

所以这些框架就只能用绝对路径来了。

LazYeah answered 10 years, 6 months ago

Your Answer