require_once 是什么?
require_once 是 PHP 的一个语言结构,它的作用是:
- 包含并执行一个文件:它会读取指定文件中的所有 PHP 代码,并像直接把这些代码写在这里一样执行。
_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。
最佳实践和注意事项
-
使用绝对路径:为了避免路径错误,强烈推荐使用
dirname(__FILE__)来构建被引入文件的绝对路径。- 好:
require_once (dirname(__FILE__) . '/include/common.inc.php'); - 不好:
require_once ('../include/common.inc.php');(相对路径在文件被移动时容易出错)
- 好:
-
文件扩展名:被引入的文件通常是
.php文件,因为它可能包含 PHP 代码,如果只包含 HTML,也可以是.html或.htm,但为了统一和清晰,推荐使用.php。 -
不要滥用
require_once:虽然require_once很安全,但它会进行额外的文件检查,性能上比require略低(差异微乎其微),但对于加载核心文件,这个小小的性能代价换来代码的健壮性是完全值得的。 -
保持代码整洁:将通用的逻辑、函数、类分离到不同的文件中,然后通过
require_once引入,这是良好的编程习惯,能让你的项目更容易维护和扩展。
在织梦模板中,require_once 是一个基础且至关重要的工具,它主要用于:
- 加载系统核心文件(
common.inc.php),这是所有页面运行的基石。 - 引入自定义的功能模块(函数库、模型类等),实现代码复用和逻辑分离。
- 确保文件只被加载一次,避免因重复定义函数或变量而导致的致命错误。
掌握 require_once 的正确用法,是进行织梦二次开发和模板定制的基础。
