Fri, Aug 1st, 2008
利用__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";
星星你好强……
两边同时放includes的方法我一直用着TvT
现在终于有了好方法……
嘛,应该是多亏了WordPress……其实最初有多看看PHP手册的基础部分想来就不会碰到这种问题了吧(大概…… orz)
如果要作为脚本(在非 web root 中)则使用需要多加上 realpath 函数获取实际路径,否则 PHP 会 include 当前路径下的文件而不是脚本相对路径下的文件=v=b
貌似只要 OO 化然后采用 spl_autoload 即可省略一切 include =v=?
最近发现 spl 越来越有趣=v=b