在 PHP 项目中,包含文件是模块化、复用代码和提高开发效率的核心操作,DedeCMS 也不例外,它本身大量使用了文件包含机制来组织其庞大的代码库。

DedeCMS 中包含文件的几种方式
PHP 提供了四种主要的包含/引入函数,它们在 DedeCMS 中都有应用:
include(): 包含并运行指定文件,如果文件不存在,PHP 会发出一个警告 (E_WARNING),但脚本会继续执行。include_once(): 功能同include(),但会先检查该文件是否已经被包含过,如果包含过,则不会再次包含,可以防止重复定义函数或类的问题。require(): 包含并运行指定文件,如果文件不存在,PHP 会发出一个致命错误 (E_COMPILE_ERROR),并停止脚本的执行。require_once(): 功能同require(),但同样会检查文件是否已被包含过,防止重复定义。
在 DedeCMS 模板中包含文件
这是最常见的情况,尤其是在制作网站模板时,DedeCMS 使用自己的模板引擎,所以语法与原生 PHP 不同。
使用 DedeCMS 模板标签 {dede:include}
这是 DedeCMS 官方推荐且最标准的模板包含方式,它会在模板解析时,将指定文件的内容“嵌入”到当前位置。
语法:

{dede:include file='文件路径' ismake='是否为目录'}
file='文件路径': 指定要包含的文件路径,这个路径是相对于 DedeCMS 安装根目录的。ismake='是否为目录': (可选) 如果值为yes,则file参数被视为一个目录,DedeCMS 会自动包含该目录下的index.html文件,这对于包含公共的头部或尾部非常方便。
示例:
假设你的网站结构如下:
/wwwroot/your_dede_site/
├── templets/
│ └── default/
│ ├── index.htm
│ ├── head.htm
│ └── foot.htm
├── dede/
└── ...
在 index.htm 中,你想要包含 head.htm 和 foot.htm:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">{dede:global.cfg_webname/}</title>
</head>
<body>
<!-- 使用 {dede:include} 包含头部文件 -->
{dede:include file='templets/default/head.htm'/}
<main>
<!-- 这里是首页的主要内容 -->
<h1>欢迎来到我的网站</h1>
{dede:arclist titlelen='30' row='5'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
</main>
<!-- 使用 {dede:include} 包含底部文件 -->
{dede:include file='templets/default/foot.htm'/}
</body>
</html>
使用 ismake 属性的示例:
如果你的 templets/default/ 目录下有 head.htm,你可以这样写:
{dede:include file='templets/default/' ismake='yes'/}
DedeCMS 会自动找到并包含 templets/default/index.htm,如果你的头部文件是 head.htm,这种方式就不适用了,需要明确写出文件名。
使用原生 PHP 语句
在某些情况下,你可能需要在 DedeCMS 的模板文件(.htm)中直接执行 PHP 代码,这通常用于非常特殊的逻辑,不推荐在模板中过多使用,因为它会破坏模板与逻辑分离的原则。
开启 PHP 支持:
默认情况下,.htm 文件中的 <?php ... ?> 代码可能不会被执行,你需要确保你的模板文件被正确解析,一个简单的方法是,将需要包含 PHP 代码的模板文件后缀名改为 .php。
示例:
假设你有一个 helper.php 文件,里面定义了一个函数:
// /wwwroot/your_dede_site/include/helper.php
function getGreeting() {
return "你好,这是一个动态问候!";
}
在你的模板文件 index.php 中,你可以这样包含和使用它:
<!DOCTYPE html>
<html>
<head>原生 PHP 包含示例</title>
</head>
<body>
<h1>首页</h1>
<?php
// 包含 helper.php 文件
include_once '/wwwroot/your_dede_site/include/helper.php';
// 调用函数并输出结果
echo getGreeting();
?>
</body>
</html>
注意: 使用这种方式时,路径必须是服务器上的绝对路径,或者相对于当前执行脚本的路径,使用绝对路径 ($_SERVER['DOCUMENT_ROOT'] 是一个好方法) 更安全。
在 DedeCMS PHP 源码文件中包含文件
这是指修改 DedeCMS 后台程序、插件或核心功能文件(通常是 .php 文件)时的包含方式,这里直接使用原生 PHP 语句。
场景:
- 在一个自定义的插件文件中,需要用到 DedeCMS 的核心类库(如
dedeapi.class.php)。 - 在一个栏目页文件中,需要引入一个公共的功能模块。
示例:
假设你在 plus/my_api.php 文件中工作,需要使用 DedeCMS 的数据库操作类。
<?php
/**
* 自定义API文件
*/
// 1. 定义 DedeCMS 的根目录路径
// define('DEDEROOT', dirname(__FILE__) . '/..'); // 根据实际情况调整
define('DEDEROOT', dirname(__FILE__)); // my_api.php 在 dede 目录下
// 2. 引入核心配置文件,获取数据库连接信息等
require_once DEDEROOT . '/include/common.inc.php';
// 3. 引入需要的类文件
// 要使用数据库操作类
require_once DEDEROOT . '/dede/archives.class.php';
// ... 你的业务逻辑代码 ...
// 使用引入的类
$archives = new Archives($dsql);
// ... 进行操作 ...
?>
最佳实践:
- 使用绝对路径:通过
dirname(__FILE__)来获取当前文件所在的目录,然后拼接出目标文件的绝对路径,这是最可靠的方式。 - 优先使用
require_once:在引入类库、函数库时,使用require_once可以有效防止因重复引入而导致的“函数已定义”或“类已声明”的致命错误。 - 引入核心文件:在开发 DedeCMS 扩展时,几乎总是需要先引入
include/common.inc.php,这个文件负责初始化环境、连接数据库、加载常用函数等。
总结与最佳实践
| 场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
模板文件 (.htm) |
{dede:include} |
官方支持,符合模板引擎逻辑,安全,易于维护。 | 功能相对固定,灵活性不如原生 PHP。 |
| 模板文件中少量 PHP | 原生 PHP (include/require) |
灵活性高,可以执行任意 PHP 代码。 | 破坏模板与逻辑分离,可能带来安全隐患,需要将文件改为 .php。 |
PHP 源码文件 (.php) |
原生 PHP (require_once) |
功能强大,性能高,是 PHP 开发的标准做法。 | 需要手动管理路径,路径错误会导致致命错误。 |
核心建议:
- 模板与逻辑分离:尽量保持模板文件(
.htm)的纯粹性,只负责展示,复杂的逻辑处理放在 PHP 文件中。 - 模板优先用
{dede:include}:在模板中复用头部、底部、侧边栏等组件时,首选{dede:include}- 源码优先用
require_once:在修改 DedeCMS 的 PHP 源码时,使用require_once引入依赖文件,并务必使用绝对路径。- 路径是关键:无论使用哪种方式,确保文件路径的正确性是避免错误的首要任务,在 PHP 源码中,
dirname(__FILE__)是你的好朋友。 - 源码优先用
通过合理运用这些包含文件的方法,你可以构建出结构清晰、易于维护和扩展的 DedeCMS 网站。
