PHP 是什么
PHP(PHP: Hypertext Preprocessor,即「PHP:超文本预处理器」)是一种被广泛应用的开源通用脚本语言,尤其适用于 Web 开发,并可嵌入 HTML 中使用。PHP 自 1995 年诞生以来,经历了多次重大迭代,如今已发展为功能强大、生态成熟的服务端编程语言。截至本教程编写时,PHP 的最新稳定版本为 8.3 系列,推荐在生产环境中使用 PHP 8.1 及以上版本。
前置知识
阅读本节前,你需要具备以下基础知识:
- 了解基本的 HTML/CSS 知识
- 知道什么是客户端与服务器之间的请求-响应模型
- 对编程的基本概念(变量、函数、控制结构)有初步了解
基础概念
PHP 的全称
PHP 的全称是一个递归缩写——PHP: Hypertext Preprocessor。这个递归缩写反映了 PHP 的核心定位:在服务器端对超文本(HTML)进行预处理,然后将结果发送给客户端浏览器。
PHP 最初由 Rasmus Lerdorf 于 1995 年创建,当时只是他用来跟踪个人简历访问者的一组 Perl CGI 脚本。随着不断发展和社区贡献,PHP 逐渐演变为一个功能完备的编程语言。
PHP 的核心特点
PHP 作为一门服务端脚本语言,具有以下核心特点:
- 服务端执行:PHP 代码在服务器上运行,执行结果以 HTML 形式发送到客户端。用户无法看到 PHP 源代码,只能看到输出结果。
- 跨平台:PHP 可以运行在 Windows、Linux、macOS、BSD 等多种操作系统上,配合 Apache、Nginx、IIS 等多种 Web 服务器使用。
- 嵌入 HTML:PHP 可以直接嵌入到 HTML 文件中,也可以与模板引擎配合使用,实现业务逻辑与视图的分离。
- 开源免费:PHP 使用 PHP License 发布,这是一个开源许可证,允许自由使用、修改和分发。
- 弱类型但支持严格模式:PHP 是弱类型语言,但自 PHP 7.0 起支持严格类型声明,自 PHP 8.0 起联合类型(Union Types)进一步增强了类型安全。
PHP 的语法特点
PHP 标签
PHP 代码需要使用特殊的标签来与 HTML 内容区分。最常用的标准标签是 <?php 和 ?>。
<?php
declare(strict_types=1);
// 标准的 PHP 开始标签
// 这是单行注释
/*
* 这是多行注释
* 可以跨越多行
*/
echo "Hello, PHP!";PHP 还支持短标签 <? 和短回显标签 <?= ?>,但短标签需要在 php.ini 中启用 short_open_tag,不推荐在生产环境中使用。短回显标签 <?= ?> 自 PHP 5.4 起始终可用,推荐使用:
<?php
declare(strict_types=1);
$name = 'World';
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>PHP 示例</title>
</head>
<body>
<!-- 使用短回显标签直接输出变量 -->
<h1>Hello, <?= htmlspecialchars($name, ENT_QUOTES, 'UTF-8') ?>!</h1>
<?php
// 标准标签用于复杂逻辑
$currentTime = date('Y-m-d H:i:s');
echo "<p>当前时间:{$currentTime}</p>";
?>
</body>
</html>文件扩展名
PHP 文件通常使用 .php 作为扩展名。常见的命名约定包括:
| 扩展名 | 用途说明 |
|---|---|
.php | 通用 PHP 文件 |
.phtml | PHP 模板文件(常用于视图层) |
.php8 | 指定 PHP 8 版本的文件(少数项目使用) |
.inc | PHP 包含文件(不推荐,有安全风险) |
详细说明
PHP 作为服务端脚本语言
PHP 最经典的运行模式是作为服务端脚本。在这种模式下,PHP 代码由 Web 服务器(如 Apache 或 Nginx)通过 SAPI(Server Application Programming Interface)调用执行。以下是两种最常见的运行方式:
CGI/FastCGI 模式(推荐用于 Nginx):
<?php
declare(strict_types=1);
// info.php — 用于测试 PHP 是否正常运行
phpinfo();将此文件保存为 info.php,通过浏览器访问即可看到 PHP 的完整配置信息。
安全提示
在生产环境中,phpinfo() 会暴露服务器配置信息,务必确保不会在生产环境中留下调用 phpinfo() 的文件。
Apache 模块模式(mod_php):
在 Apache 中,PHP 可以作为模块直接运行在 Apache 进程中,这是最传统的部署方式。但现代项目更推荐使用 PHP-FPM(FastCGI Process Manager)以获得更好的性能和进程管理能力。
PHP 的跨平台特性
PHP 的跨平台能力是其被广泛采用的重要原因之一。以下是不同平台上安装 PHP 的示例:
<?php
declare(strict_types=1);
// 检测当前运行环境信息
$osFamily = PHP_OS_FAMILY; // 如 'Darwin', 'Linux', 'Windows'
$phpVersion = PHP_VERSION; // 如 '8.3.0'
$sapiName = PHP_SAPI; // 如 'cli', 'fpm-fcgi', 'apache2handler'
echo "操作系统家族:{$osFamily}\n";
echo "PHP 版本:{$phpVersion}\n";
echo "SAPI 类型:{$sapiName}\n";
// 检测是否在命令行运行
if (PHP_SAPI === 'cli') {
echo "当前运行在命令行模式\n";
} else {
echo "当前运行在 Web 服务器模式\n";
}PHP 支持的主要操作系统和 Web 服务器组合:
| 操作系统 | Web 服务器 | PHP 运行方式 |
|---|---|---|
| Linux (Ubuntu/CentOS) | Nginx | PHP-FPM |
| Linux (Ubuntu/CentOS) | Apache | mod_php / PHP-FPM |
| macOS | Nginx / Apache | PHP-FPM / Homebrew PHP |
| Windows | IIS | FastCGI |
| Windows | XAMPP/WAMP | Apache (集成环境) |
PHP 嵌入 HTML 的方式
PHP 可以灵活地嵌入到 HTML 中,这种方式使其特别适合 Web 开发:
<?php
declare(strict_types=1);
// 处理业务逻辑
$pageTitle = '用户列表';
$users = [
['id' => 1, 'name' => '张三', 'email' => 'zhangsan@example.com'],
['id' => 2, 'name' => '李四', 'email' => 'lisi@example.com'],
['id' => 3, 'name' => '王五', 'email' => 'wangwu@example.com'],
];
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title><?= htmlspecialchars($pageTitle, ENT_QUOTES, 'UTF-8') ?></title>
<style>
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f4f4f4; }
</style>
</head>
<body>
<h1><?= htmlspecialchars($pageTitle, ENT_QUOTES, 'UTF-8') ?></h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>邮箱</th>
</tr>
</thead>
<tbody>
<?php foreach ($users as $user): ?>
<tr>
<td><?= $user['id'] ?></td>
<td><?= htmlspecialchars($user['name'], ENT_QUOTES, 'UTF-8') ?></td>
<td><?= htmlspecialchars($user['email'], ENT_QUOTES, 'UTF-8') ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</body>
</html>模板引擎
虽然 PHP 可以直接嵌入 HTML,但在现代项目中,推荐使用模板引擎(如 Twig、Blade)或前端框架来实现更清晰的关注点分离。不过,了解 PHP 原生的嵌入方式是理解 PHP 模板引擎工作原理的基础。
PHP 与其他语言的对比
PHP 在 Web 开发领域有着独特的优势,但也面临来自其他语言的竞争。以下是简要对比:
| 特性 | PHP | Python | Node.js (JavaScript) | Java | Go |
|---|---|---|---|---|---|
| 主要领域 | Web 开发 | 通用 / AI / Web | Web / 全栈 | 企业级应用 | 云服务 / 微服务 |
| 学习曲线 | 低~中 | 低 | 中 | 高 | 中 |
| 执行速度 | 快(PHP 8+ JIT) | 中 | 快(V8) | 快 | 非常快 |
| 并发能力 | 中(Swoole/Octane) | 中 | 好(异步事件循环) | 好 | 非常好(Goroutine) |
| Web 生态 | 非常丰富 | 丰富(Django/Flask) | 非常丰富 | 丰富(Spring) | 成长中 |
| 包管理 | Composer | pip | npm | Maven/Gradle | Go Modules |
| 主机支持 | 几乎所有虚拟主机 | 需 VPS | 需 VPS | 需 VPS | 需 VPS |
| 嵌入 HTML | 原生支持 | 需模板引擎 | 需模板引擎 | 需模板引擎 | 需模板引擎 |
<?php
declare(strict_types=1);
// PHP 8+ 的性能优势示例
// JIT(Just-In-Time)编译器自 PHP 8.0 起可用
// 传统的 PHP 代码执行流程:源代码 → 编译为操作码 → 执行操作码
// PHP 8.0+ JIT 流程:源代码 → 编译为操作码 → JIT 编译为机器码 → 执行机器码
// 以下是利用 JIT 优势的 CPU 密集型计算示例
function fibonacci(int $n): int
{
if ($n <= 1) {
return $n;
}
return fibonacci($n - 1) + fibonacci($n - 2);
}
$startTime = hrtime(true);
$result = fibonacci(30);
$elapsed = (hrtime(true) - $startTime) / 1_000_000;
echo "斐波那契数列第 30 项:{$result}\n";
echo "耗时:{$elapsed} 毫秒\n";
// 注意:在 CLI 模式下使用 JIT,需要在 php.ini 中配置 opcache.jit=1255PHP 的生态系统
Composer — PHP 的包管理器
Composer 是 PHP 生态系统中最重要的工具之一,类似于 Node.js 的 npm 或 Python 的 pip。它允许你声明项目所依赖的库,并自动管理这些依赖的安装和更新。
<?php
declare(strict_types=1);
// composer.json 示例(这不是 PHP 代码,而是 JSON 配置文件)
// 以下展示如何在 PHP 代码中使用 Composer 自动加载的类
// 假设已通过 Composer 安装了某个库
// require __DIR__ . '/vendor/autoload.php';
// $httpClient = new \GuzzleHttp\Client();
// $response = $httpClient->get('https://api.example.com/data');Composer 安装
如果你还没有安装 Composer,可以访问 getcomposer.org 下载安装。安装后在项目根目录运行 composer init 即可初始化一个新的 composer.json 文件。
PHP 框架
PHP 拥有众多成熟的 Web 框架,满足不同规模和类型的项目需求:
| 框架 | 类型 | 特点 |
|---|---|---|
| Laravel | 全栈框架 | 优雅的语法、强大的生态系统、学习资源丰富 |
| Symfony | 组件式框架 | 企业级、灵活、可复用组件 |
| ThinkPHP | 全栈框架 | 中国社区活跃、中文文档完善 |
| CodeIgniter | 轻量框架 | 简单快速、低资源消耗 |
| Slim | 微框架 | 适合构建 API 和小型应用 |
| Laminas | 企业框架 | Zend Framework 的继任者 |
| Hyperf | 协程框架 | 基于 Swoole,高性能异步 |
| CakePHP | 全栈框架 | 快速开发、约定优于配置 |
PHP 社区与资源
PHP 拥有庞大的全球开发者社区:
- PHP.net:PHP 官方网站,提供完整的文档手册
- PHP-FIG:PHP Framework Interop Group,制定 PHP 标准推荐(PSR 系列)
- Packagist:PHP 包仓库,包含超过 30 万个包
- PHP.Watch:跟踪 PHP 各版本的变更和新特性
- PHP 内核开发者:全球数百名核心贡献者维护 PHP 引擎
<?php
declare(strict_types=1);
// 展示 PSR-4 自动加载约定
// PSR-4 是 PHP 标准推荐之一,定义了从命名空间到文件路径的映射规则
//
// 例如:
// 命名空间 App\Controllers\UserController
// 对应文件 src/Controllers/UserController.php
//
// 在 composer.json 中配置:
// {
// "autoload": {
// "psr-4": {
// "App\\": "src/"
// }
// }
// }
// 遵循 PSR-12 编码规范的类示例
namespace App\Services;
class GreetingService
{
public function __construct(
private readonly string $defaultName = 'World'
) {
}
public function greet(string $name = null): string
{
$targetName = $name ?? $this->defaultName;
return "Hello, {$targetName}!";
}
}
// 使用 Composer 自动加载后,直接使用类即可
// $service = new \App\Services\GreetingService();
// echo $service->greet('PHP Developer');PHP 的应用场景
Web 开发(最核心的领域)
PHP 最初就是为 Web 开发而设计的,至今依然是 Web 开发领域最受欢迎的语言之一。全球超过 77% 的网站使用 PHP 作为服务端语言(数据来源:W3Techs),其中包括 WordPress、Drupal、Joomla 等知名 CMS 系统。
API 开发
PHP 非常适合构建 RESTful API 和 GraphQL API。借助 Laravel、Symfony 等框架,开发者可以快速构建结构清晰、功能完备的 API 服务。
CLI 脚本
PHP 也可以用作命令行脚本语言,用于定时任务、数据处理、系统管理等场景。
<?php
declare(strict_types=1);
// PHP CLI 脚本示例
if (PHP_SAPI !== 'cli') {
echo "此脚本只能在命令行中运行\n";
exit(1);
}
// 使用 getopt 解析命令行参数
$options = getopt('n:v::', ['name:', 'verbose']);
$name = $options['name'] ?? $options['n'] ?? 'Guest';
$verbose = isset($options['v']) || isset($options['verbose']);
if ($verbose) {
echo "[INFO] 开始处理...\n";
}
echo "你好, {$name}!\n";
if ($verbose) {
echo "[INFO] 处理完成\n";
}实战示例
完整的 PHP 信息检测脚本
<?php
declare(strict_types=1);
/**
* PHP 环境信息检测脚本
* 用于检查当前 PHP 运行环境的各项配置
*/
class PhpEnvironmentChecker
{
public function check(): array
{
return [
'php_version' => $this->getPhpVersion(),
'sapi' => PHP_SAPI,
'os' => PHP_OS,
'os_family' => PHP_OS_FAMILY,
'max_execution_time' => ini_get('max_execution_time'),
'memory_limit' => ini_get('memory_limit'),
'error_reporting' => $this->getErrorReportingLevel(),
'loaded_extensions' => $this->getImportantExtensions(),
'zend_extensions' => $this->getZendExtensions(),
];
}
private function getPhpVersion(): array
{
return [
'version' => PHP_VERSION,
'major' => PHP_MAJOR_VERSION,
'minor' => PHP_MINOR_VERSION,
'release' => PHP_RELEASE_VERSION,
'version_id' => PHP_VERSION_ID,
];
}
private function getErrorReportingLevel(): string
{
$level = error_reporting();
$levels = [];
$map = [
E_ERROR => 'E_ERROR',
E_WARNING => 'E_WARNING',
E_PARSE => 'E_PARSE',
E_NOTICE => 'E_NOTICE',
E_DEPRECATED => 'E_DEPRECATED',
E_ALL => 'E_ALL',
];
foreach ($map as $bit => $label) {
if ($level & $bit) {
$levels[] = $label;
}
}
return implode(' | ', $levels);
}
private function getImportantExtensions(): array
{
$important = ['pdo', 'pdo_mysql', 'curl', 'json', 'mbstring', 'openssl', 'zip'];
$result = [];
foreach ($important as $ext) {
$result[$ext] = extension_loaded($ext);
}
return $result;
}
private function getZendExtensions(): array
{
$extensions = get_loaded_extensions(true);
return $extensions;
}
public function displayAsText(): void
{
$info = $this->check();
echo "=== PHP 环境信息 ===\n";
echo "PHP 版本: {$info['php_version']['version']}\n";
echo "SAPI 类型: {$info['sapi']}\n";
echo "操作系统: {$info['os']} ({$info['os_family']})\n";
echo "最大执行时间: {$info['max_execution_time']} 秒\n";
echo "内存限制: {$info['memory_limit']}\n";
echo "错误报告级别: {$info['error_reporting']}\n";
echo "\n=== 重要扩展 ===\n";
foreach ($info['loaded_extensions'] as $ext => $loaded) {
$status = $loaded ? '[OK]' : '[MISSING]';
echo "{$status} {$ext}\n";
}
echo "\n=== Zend 扩展 ===\n";
foreach ($info['zend_extensions'] as $ext) {
echo "- {$ext}\n";
}
}
}
// 如果在命令行运行
if (PHP_SAPI === 'cli') {
$checker = new PhpEnvironmentChecker();
$checker->displayAsText();
}注意事项
- PHP 标签:始终使用
<?php标签,不要使用短标签<?。短回显标签<?= ?>是安全的,可以放心使用。 - 文件编码:PHP 文件推荐使用 UTF-8(无 BOM)编码保存,这是现代 Web 开发的标准。
- 严格类型:本教程中所有代码都使用
declare(strict_types=1);,建议你在实际项目中也养成这个习惯。 - 安全意识:PHP 的灵活性是一把双刃剑,开发者需要时刻注意安全性,特别是在处理用户输入时。
- 版本选择:PHP 7.x 已于 2022 年底停止安全更新,生产环境应使用 PHP 8.1 或更高版本。
- 虚拟主机限制:大多数虚拟主机支持 PHP,但可能限制了版本和配置。如果需要更高版本的 PHP 或特殊扩展,建议使用 VPS。
最佳实践
- 使用 Composer 管理项目依赖,不要手动管理第三方库。
- 遵循 PSR-12 编码规范,保持代码风格一致。
- 启用严格类型声明
declare(strict_types=1);,提高代码的类型安全性。 - 使用
.php作为文件扩展名,保持一致性。 - 为 PHP 文件添加
<?php开头标签,文件末尾不要添加闭合标签?>(防止意外的空白输出)。 - 定期更新 PHP 版本,以获得性能提升和安全修复。
- 使用 PHP 8.1+ 的新特性(如枚举、只读属性、纤程等)来编写更现代的代码。
- 在项目中使用 PHP-CS-Fixer 或 PHP_CodeSniffer 来自动化代码风格检查。
下一节
了解了 PHP 是什么之后,接下来我们来看看 PHP 能做什么,了解 PHP 在实际开发中的各种应用场景。