PHP魔术常量__FILE__
一、魔术常量__FILE__ 的用法
官网文档解释:
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
1. 集成环境xampp
2. 文件位置 D:\xampp\htdocs\text.php
3. __FILE__打印出的绝对路径 D:\xampp\htdocs\text.php
echo __FILE__; // D:\xampp\htdocs\text.php
dirname 是文件系统函数
https://www.php.net/manual/zh/function.dirname.php
语法: string dirname( string $path, int $levels = 1 );
作用:返回路径中的目录部分
echo dirname(__FILE__); // D:\xampp\htdocs
再用 str_replace() 函数,把路径中的反斜线'\' 替换为 斜线'/'
echo str_replace("\\", '/', dirname(__FILE__) ); // D:/xampp/htdocs
二、魔术常量在织梦CMS里面的应用
织梦CMS里使用的方法基本都在 include 文件夹里面,然后从 include 文件夹里引入文件,通过 include 文件夹里面的 common.inc.php 文件,这个文件里面是一些路径的配置信息。
下面是织梦 include/commoninc.php 文件最上面的部分代码
// 生产环境使用production define('DEDE_ENVIRONMENT', 'production'); if(DEDE_ENVIRONMENT == 'production') { error_reporting(E_ALL || ~E_NOTICE); }else{ error_reporting(E_ALL); } define('DEDEINC', str_replace("\\", '/', dirname(__FILE__) ) ); define('DEDEROOT', str_replace("\\", '/', substr(DEDEINC,0,-8) ) ); define('DEDEDATA', DEDEROOT.'/data'); define('DEDEMEMBER', DEDEROOT.'/member'); define('DEDETEMPLATE', DEDEROOT.'/templets');
最上面if判断的是报错级别的设置,可以看出在开发环境只有NOTICE提示不报,其它的都报。
报错设置下面就是配置了网站的根目录路径了,再通过根目录调用(引用)需要的文件。
下面是按照织梦CMS文件夹的结构,整理了一个小domo。
1. 文件目录结构
|-cms
|--data
| |--common.inc.php
|
|--dede
| |--config.php
|
|--include
| |--common.inc.php
| |--dedesql.class.php
|
|--m
| |--index_m.php
|
|--index_cms.php
include文件夹 放各种对象 与 function方法
include/common.inc.php 配置网站目录
data/common.inc.php 数据库配置的参数
m/index_m.php 无线端移动页面文件夹
dede文件夹 后台管理、登录(安全考虑,安装完后,要改这个文件夹的名字)
2、按照上面目录的结构,把下面这些文件放到相应的文件夹里面
cms/data/common.inc.php 数据库配置的参数
// 数据库连接信息 $cfg_dbhost = 'localhost'; $cfg_dbname = 'dede'; $cfg_dbuser = 'root'; $cfg_dbpwd = 'root'; $cfg_dbprefix = 'dede_'; $cfg_db_language = 'utf8';
cms/dede/config.php
define('DEDEADMIN', str_replace("\\", '/', dirname(__FILE__) ) ); require_once(DEDEADMIN.'/../include/common.inc.php');
cms/include/common.inc.php 文件里面配置网站目录路径,网站的其它文件夹都引入这个common.inc.php文件,所以这个文件加比较重要。
// 设置报错级别 error_reporting(E_ALL & ~ E_NOTICE); /*---------------------------------------------------------------------------------------------------------- define('DEDEINC', str_replace("\\", '/', dirname(__FILE__) ) ); define('DEDEROOT', str_replace("\\", '/', substr(DEDEINC,0,-8) ) ); 初始化当前的绝对路径,下面分解这两行语句 01/ define('DEDEINC', dirname(__FILE__)); 定义常量"DEDEINC"输出结果 // D:\xampp\htdocs\cms\include 02/ define('DEDEINC', str_replace("\\", '/', dirname(__FILE__) ) ); 换成正斜线是因为window/linux都支持正斜线,而linux不支持反斜线 常量DEDEINC输出结果 D:/xampp/htdocs/cms/include 03/ define('DEDEROOT', str_replace("\\", '/', substr(DEDEINC,0,-8))); 去掉路径后面8个字符(/include),输出的是网站系统的根目录了,因为网站系统放在cms文件夹,所以网站系统根目录就是cms文件夹 定义新的常量"DDEDEROOT"输出结果:D:/xampp/htdocs/cms/ ----------------------------------------------------------------------------------------------------------*/ define('DEDEINC', str_replace("\\", '/', dirname(__FILE__) ) ); define('DEDEROOT', str_replace("\\", '/', substr(DEDEINC,0,-8) ) ); // 通过DEDEROOT根目录路径,定义网站根目录层级其它文件夹路径的常量 define('DEDEDATA', DEDEROOT.'/data'); define('DEDEMEMBER', DEDEROOT.'/member'); define('DEDETEMPLATE', DEDEROOT.'/templets'); // 引入(包含)数据库配置,并打印配置文件中各种变量 include(DEDEDATA.'/common.inc.php'); echo $cfg_dbhost.'<br/>'; echo $cfg_dbname.'<br/>'; echo $cfg_dbuser.'<br/>'; echo $cfg_dbpwd.'<br/>'; echo $cfg_dbprefix.'<br/>'; echo $cfg_db_language.'<br/>'; // 引入mysql操作类 include(DEDEINC.'/dedesql.class.php'); echo $DedeSql->SetSource();
cms/include/dedesql.class.php
class DedeSql{ function SetSource() { return '这是cms/include/dedesql.class.php文件'; } } $DedeSql = new DedeSql();
cms/m/index_m.php
require_once(dirname(__FILE__)."/../include/common.inc.php"); /*---------------------------------------------------------------------------------------------------------- 这样也是可以的, require_once("./../include/common.inc.php"); 但是织梦源文件里是这样写的 require_once (dirname(__FILE__) . "/../include/common.inc.php"); echo dirname(__FILE__)."/../include/common.inc.php"; 打印输出 D:\xampp\htdocs\cms\m/../include/common.inc.php ----------------------------------------------------------------------------------------------------------*/
cms/index_cms.php 首页
require_once (dirname(__FILE__) . "/include/common.inc.php"); /*---------------------------------------------------------------------------------------------------------- echo dirname(__FILE__) . "/include/common.inc.php"; 打印输出 D:\xampp\htdocs\cms/include/common.inc.php ----------------------------------------------------------------------------------------------------------*/
可能是版本问题,有些文件夹跟织梦的文件对不上,
初学乍练,研究代码的原理,内容挺简单的,就是魔术常量 __FILE__ 的应用