PHP require 绝对路径 autoload

在写PHP程序时,如果文件比较多,目录也比较多,有很多require_once的情况。

如果程序的入口不唯一,并且分布在不同的目录,必须require绝对路径,如果是相对路径,PHP会把入口文件的路径作为基本路径,require里的相对路径都是相对于入口文件的。

这样带来最大的问题就是自己部署的程序,给别人提供接口时,别人根本无法使用!

所以要用绝对路径。

做法就是选一个require的入口文件,大家都要包含这个文件,这个文件的开头加上这么一句:

这个时候PROJECT_BASE_PATH就是从根开始的绝对路径了。

后续的所有require文件,都用这个宏定义去拼接,例如:

就绝对保证不会再出错!

当然,如果你是PHP5的环境,推荐使用__autoload函数,把所有功能都封装到类中,然后在需要的时候自动调用,避免到处require。

4 comments

  1. “做法就是选一个require的入口文件,大家都要包含这个文件”—关键是这个文件怎么包含进来?

    请指教!

  2. 你的模块,有自己的一套目录树或文件存放规则,这个规则没必要让别人知道,别人关心的是如何方便地调用你程序中提供的接口。

    最好的方法是autoload:你做好一个php文件,里面有autoload的映射关系,并调用spl_autoload_register注册,然后你把这个文件的绝对路径公布给别人,别人只要require了这个php文件,就可以直接调用你模块中的任意public的接口。

    如果是function分类存放的情况,那别人调用你function时必须知道这个function在哪个文件里,还要知道这个文件在你的模块中的相对路径,一旦把这个结构信息发布给别人,你再做任何内部调整都会给外部调用方造成很多麻烦。因此这不是一个好方法。

    回答你的问题,require文件是要由你来写的,然后你要保证这个文件的存放地址稳定,不能随意更改,然后把文件的绝对路径公布给调用方。

  3. 回答得好快!多谢!
    这么说还是要给出一个入口文件的绝对路径,这个是没有办法避免的对吧?

  4. 对啊,别人要调用你的模块,关于你这个模块的信息他至少要知道一条吧。
    我觉得把模块间的耦合降低到 1,已经是极限了,变成 0 的话还有法儿调用么,呵呵……

Leave a Reply

Your email address will not be published.

*