织梦模板require_once为何失效?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 织梦建站 正文

require_once 是什么?

require_once 是 PHP 的一个语言结构,它的作用是:

  1. 包含并执行一个文件:它会读取指定文件中的所有 PHP 代码,并像直接把这些代码写在这里一样执行。
  2. _once 的关键作用:这是它与 require 的最大区别。require_once检查这个文件是否已经被包含过,如果已经包含过,它就不会再包含第二次,直接跳过。

为什么需要 _once 为了防止重复定义导致的致命错误,如果一个文件里定义了一个函数 myFunction(),如果同一个文件被 require 两次,第二次执行时会报错:“Fatal error: Cannot redeclare myFunction()”,而 require_once 可以完美避免这个问题。


在织梦模板中的主要作用和应用场景

在织梦模板中,require_once 主要用于将一些通用的、非模板化的逻辑或功能代码引入到你的 PHP 文件中,以下是几个最常见的场景:

加载核心系统文件(最常见)

这是最基础也是最重要的用法,织梦的每一个 PHP 文件(无论是前台还是后台)都需要加载其核心的初始化文件,以获取必要的全局变量、函数和数据库连接。

示例:index.php 文件中,你几乎总能看到这行代码:

// 引入织梦核心文件
require_once (dirname(__FILE__) . '/include/common.inc.php');
  • dirname(__FILE__):获取当前文件所在的目录路径。
  • /include/common.inc.php:这是织梦的“心脏”文件,它负责:
    • 定义全局变量(如 $cfg_cmspath, $cfg_dbhost 等)。
    • 连接数据库。
    • 加载系统常用的函数库。
    • 执行一些全局的安全检查和初始化操作。

如果没有这行代码,你的页面将无法访问数据库,也无法使用织梦提供的任何核心功能,页面会直接报错或一片空白。

加载自定义函数库或类文件

当你的网站功能变得复杂,你可能会有一些自定义的函数或者类,为了保持代码的整洁和可复用性,你会把这些函数/类单独放在一个文件里,然后在需要的地方用 require_once 引入。

示例: 假设你创建了一个 my_functions.php 文件来存放自定义函数。

my_functions.php 文件内容:

<?php
// 自定义函数:获取热门文章
function getHotArticles($limit = 10) {
    // ... 连接数据库,查询逻辑 ...
    return $articles;
}

在模板文件(如 index.php)中使用:

<?php
require_once (dirname(__FILE__) . '/include/my_functions.php'); // 引入自定义函数库
// 现在就可以调用这个函数了
$hotArticles = getHotArticles(5);
?>

加载模型文件(Model - MVC思想)

在织梦的早期版本和很多二次开发中,为了实现数据与视图的分离,开发者会创建模型文件来处理与数据库相关的逻辑,然后在控制器文件(通常是 .php 文件)中引入模型文件。

示例: model/article_model.php 文件内容:

<?php
class ArticleModel {
    public function getArticleById($id) {
        // ... 通过 ID 查询文章并返回 ...
    }
}

article.php 文件中使用:

<?php
require_once (dirname(__FILE__) . '/model/article_model.php'); // 引入模型文件
$model = new ArticleModel();
$article = $model->getArticleById($_GET['id']);
?>

在模板引擎文件(.htm)中(不推荐,但可能遇到)

在织梦的模板文件(.htm)里,你不能直接使用 <?php ?> 标签来写 PHP 代码,除非你开启了特定的解析模式,织梦提供了一个专门的标签 {dede:include file='xxx.php'} 来引入 PHP 文件。

.htm 模板文件中:

<!DOCTYPE html>
<html>
<head>{dede:global.cfg_webname/}</title>
</head>
<body>
    <h1>网站头部</h1>
    <!-- 使用织梦标签引入一个PHP文件 -->
    {dede:include file='head.php'/}
    <div class="content">
        <!-- 这里是列表内容 -->
        {dede:arclist titlelen='30'}
        <li><a href="[field:arcurl/]">[field:title/]</a></li>
        {/dede:arclist}
    </div>
    <h1>网站底部</h1>
    {dede:include file='footer.php'/}
</body>
</html>

被引入的 head.php 文件内容:

<?php
// head.php 文件内部,如果需要加载其他文件,仍然使用 require_once
// 加载一个通用的导航逻辑
require_once (dirname(__FILE__) . '/include/nav_helper.php');
?>
<nav>
    <!-- 导航HTML -->
</nav>

require_once vs. require vs. include vs. include_once

关键字 描述 失败时 推荐使用场景
require 包含文件,如果失败,产生一个 E_COMPILE_ERROR 级别的错误,并停止脚本 致命错误,脚本终止。 加载必需的核心文件,如 common.inc.php,如果这个文件不存在,程序就无法运行。
include 包含文件,如果失败,产生一个 Warning 级别的错误,但会继续执行脚本 警告,脚本继续。 加载非必需的文件,如可选的配置、广告位等,即使加载失败,主页面还能显示。
require_once require,但只包含一次。 致命错误,脚本终止。 强烈推荐用于加载可能被多次引用的文件,如函数库、类文件、核心文件,避免重复定义错误。
include_once include,但只包含一次。 警告,脚本继续。 用于加载非必需的、但可能被多次引用的文件。

在织梦二次开发中,加载核心文件和自定义函数库时,优先使用 require_once


最佳实践和注意事项

  1. 使用绝对路径:为了避免路径错误,强烈推荐使用 dirname(__FILE__) 来构建被引入文件的绝对路径。

    • require_once (dirname(__FILE__) . '/include/common.inc.php');
    • 不好require_once ('../include/common.inc.php'); (相对路径在文件被移动时容易出错)
  2. 文件扩展名:被引入的文件通常是 .php 文件,因为它可能包含 PHP 代码,如果只包含 HTML,也可以是 .html.htm,但为了统一和清晰,推荐使用 .php

  3. 不要滥用 require_once:虽然 require_once 很安全,但它会进行额外的文件检查,性能上比 require 略低(差异微乎其微),但对于加载核心文件,这个小小的性能代价换来代码的健壮性是完全值得的。

  4. 保持代码整洁:将通用的逻辑、函数、类分离到不同的文件中,然后通过 require_once 引入,这是良好的编程习惯,能让你的项目更容易维护和扩展。

在织梦模板中,require_once 是一个基础且至关重要的工具,它主要用于:

  • 加载系统核心文件common.inc.php),这是所有页面运行的基石。
  • 引入自定义的功能模块(函数库、模型类等),实现代码复用和逻辑分离。
  • 确保文件只被加载一次,避免因重复定义函数或变量而导致的致命错误。

掌握 require_once 的正确用法,是进行织梦二次开发和模板定制的基础。

-- 展开阅读全文 --
头像
strlen与sizeof在C语言中究竟有何区别?
« 上一篇 2025-12-12
2025年9月计算机二级C语言真题考什么?
下一篇 » 2025-12-12

相关文章

取消
微信二维码
支付宝二维码

目录[+]