Go to comments

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__ 的应用



Leave a comment 0 Comments.

Leave a Reply

换一张