Kodokon kodokon.com

组织你的代码:include、结构、常量

用 include 和 require 把你的网站拆分成可复用的文件,搭配清晰的项目结构和集中管理的常量。

7 分钟 · 3 题

在 Kodokon 中打开本课

一旦你的网站超过两个页面,把页头、页脚和各个函数复制到每个文件里就会变得难以管理。PHP 提供了四种包含语句:includerequire,以及它们的 include_once / require_once 变体。它们都会在调用处插入某个文件的内容;区别在于错误处理和重复包含。_once 变体会记录已经加载过的文件并只包含它们一次 - 这对于不能被重复声明的函数文件来说至关重要。

PHP
<?php

declare(strict_types=1);

function e(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES);
}

function formatPrice(float $amount): string
{
    return number_format($amount, 2, '.', ',') . ' €';
}
src/functions.php:可在整个网站中复用的辅助函数。

清晰的项目结构胜过千行注释。一种常见的约定:public/ 存放提供给浏览器的页面(它是唯一对外暴露的文件夹),src/ 汇集配置和函数,templates/ 包含页面片段(header.phpfooter.php)。PHP 内置的开发服务器通过把它指向 public/ 来启动。

BASH
mkdir -p my-site/public my-site/src
mkdir -p my-site/templates
cd my-site
php -S localhost:8000 -t public
先创建目录结构,再启动开发服务器。

项目中固定不变的值(网站名称、路径、各种设置)值得用常量而不是变量来保存:它们不会被意外覆盖。const 在编译期被解析,define() 在运行期被解析;在实践中,在你的配置文件里优先使用 const。对于路径,始终用 __DIR__ 作为前缀,也就是当前文件所在的文件夹:这样无论脚本从哪里启动,你的包含都能正常工作。

PHP
<?php

declare(strict_types=1);

const SITE_NAME = 'La Bonne Pizza';
const ITEMS_PER_PAGE = 12;
const UPLOAD_DIR = __DIR__ . '/../public/uploads';

define('BASE_URL', 'http://localhost:8000');
src/config.php:把所有配置集中在一处。

这样一来,每个页面都变成了一段简短的组装:先用 require 加载配置和函数,然后在具体内容的前后包含模板。

HTML
<?php
require __DIR__ . '/../src/config.php';
require_once __DIR__ . '/../src/functions.php';

$pageTitle = SITE_NAME . ' - Home';
include __DIR__ . '/../templates/header.php';
?>
<main>
  <h1><?= e($pageTitle) ?></h1>
  <p>Pizza of the day: <?= formatPrice(9.5) ?></p>
</main>
<?php include __DIR__ . '/../templates/footer.php'; ?>
public/index.php:现在页面只是一段组装代码。

知识检测

确认你已牢记本课的重点内容。

  1. include 和 require 之间有什么区别?
    • include 比 require 快
    • require 只对绝对路径有效
    • 如果文件缺失,require 会以致命错误停止脚本,而 include 只发出一个警告并继续运行
    • 没有区别,它们是两个别名
  2. require_once 有什么用?
    • 确保一个文件只被包含一次,即使有多个文件请求它
    • 只在生产环境中包含一个文件
    • 在不执行文件中 PHP 代码的情况下包含它
  3. 为什么要给包含路径加上 __DIR__ 前缀?
    • 自 PHP 8 起这是强制要求
    • 路径会变成相对于当前文件,不再取决于脚本从哪个文件夹启动
    • 它会启用已包含文件的缓存