利用__FILE__魔术常量来组织PHP项目文件

PHP中并没有明确的Application(或者与此类似)的概念,因此文件分类如果较多又有许多代码共用,在不使用框架的情况下,就比较难以组织,不得不说这是PHP的一个缺陷。最近在项目中就碰到了这个问题。有前台的页面和后台的页面,后台页面放在admin目录。前后台都有一定量的公用的代码,并且其中也包含了可以复用的函数,比如说输出出错信息,验证登录等等等的。我最初的方法是折中的在应用的根目录下面放一个includes目录,然后再在admin里面也放置一个同样的includes,两边的内容基本上是大同小异的。可以说实在谈不上优雅的解决方案。
后来想到了wordpress也是类似的结构,稍微看了一下代码,发现它有一个全局的wp-config.php文件,里面有如下行:

define('ABSPATH', dirname(__FILE__).'/');
require_once(ABSPATH.'wp-settings.php');

查了一下手册,发现__FILE__是PHP提供的一个魔术常量,永远返回PHP解析到它时的文件的绝对路径(似乎从这个角度来看应该是变量?),利用它可以很好的定位项目的绝对路径,也为进一步的项目中的其它目录提供一个基准,例如我目前的config.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
/*
 * 配置文件
 */
 
//常量PATH_INC - /includes绝对路径
define("PATH_INC", dirname(__FILE__) . '/');
 
//常量PATH_APP - /路径
define("PATH_APP", PATH_INC . "../");
 
//常量PATH_LIB - /lib路径
define("PATH_LIB", PATH_INC . "../lib");
 
//常量PATH_ADMIN - /admin路径
define("PATH_ADMIN", PATH_INC . "../admin");
 
//数据库设置
define("DB_HOST", "YOUR_DATABASE_HOST");
define("DB_USER", "YOUR_DATABASE_USER");
define("DB_PASSWORD", "YOUR_DATABASE_PASSWORD");
define("DB_DBNAME", "YOUR_DATABASE_NAME");
 
?>

如此一来只要在任何这个项目的php文件中用相对路径包含这个config.php,再用如下方法include所需要的文件即可:

//载入配置文件
require_once 'includes/config.php';
 
//建立数据库连接
require_once PATH_INC . "conn.php";

3 Responses

  • biy4ucbn says:

    星星你好强……

    两边同时放includes的方法我一直用着TvT

    现在终于有了好方法……

  • Mac says:

    嘛,应该是多亏了WordPress……其实最初有多看看PHP手册的基础部分想来就不会碰到这种问题了吧(大概…… orz)

  • FLYING says:

    如果要作为脚本(在非 web root 中)则使用需要多加上 realpath 函数获取实际路径,否则 PHP 会 include 当前路径下的文件而不是脚本相对路径下的文件=v=b

    貌似只要 OO 化然后采用 spl_autoload 即可省略一切 include =v=?

    最近发现 spl 越来越有趣=v=b

Leave a Comment

(Necessary)

(Necessary, will not be published)

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.