Skip to content

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 作为一门服务端脚本语言,具有以下核心特点:

  1. 服务端执行:PHP 代码在服务器上运行,执行结果以 HTML 形式发送到客户端。用户无法看到 PHP 源代码,只能看到输出结果。
  2. 跨平台:PHP 可以运行在 Windows、Linux、macOS、BSD 等多种操作系统上,配合 Apache、Nginx、IIS 等多种 Web 服务器使用。
  3. 嵌入 HTML:PHP 可以直接嵌入到 HTML 文件中,也可以与模板引擎配合使用,实现业务逻辑与视图的分离。
  4. 开源免费:PHP 使用 PHP License 发布,这是一个开源许可证,允许自由使用、修改和分发。
  5. 弱类型但支持严格模式:PHP 是弱类型语言,但自 PHP 7.0 起支持严格类型声明,自 PHP 8.0 起联合类型(Union Types)进一步增强了类型安全。

PHP 的语法特点

PHP 标签

PHP 代码需要使用特殊的标签来与 HTML 内容区分。最常用的标准标签是 <?php?>

php
<?php
declare(strict_types=1);

// 标准的 PHP 开始标签
// 这是单行注释

/*
 * 这是多行注释
 * 可以跨越多行
 */

echo "Hello, PHP!";

PHP 还支持短标签 <? 和短回显标签 <?= ?>,但短标签需要在 php.ini 中启用 short_open_tag不推荐在生产环境中使用。短回显标签 <?= ?> 自 PHP 5.4 起始终可用,推荐使用:

php
<?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 文件
.phtmlPHP 模板文件(常用于视图层)
.php8指定 PHP 8 版本的文件(少数项目使用)
.incPHP 包含文件(不推荐,有安全风险)

详细说明

PHP 作为服务端脚本语言

PHP 最经典的运行模式是作为服务端脚本。在这种模式下,PHP 代码由 Web 服务器(如 Apache 或 Nginx)通过 SAPI(Server Application Programming Interface)调用执行。以下是两种最常见的运行方式:

CGI/FastCGI 模式(推荐用于 Nginx):

php
<?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
<?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)NginxPHP-FPM
Linux (Ubuntu/CentOS)Apachemod_php / PHP-FPM
macOSNginx / ApachePHP-FPM / Homebrew PHP
WindowsIISFastCGI
WindowsXAMPP/WAMPApache (集成环境)

PHP 嵌入 HTML 的方式

PHP 可以灵活地嵌入到 HTML 中,这种方式使其特别适合 Web 开发:

php
<?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 开发领域有着独特的优势,但也面临来自其他语言的竞争。以下是简要对比:

特性PHPPythonNode.js (JavaScript)JavaGo
主要领域Web 开发通用 / AI / WebWeb / 全栈企业级应用云服务 / 微服务
学习曲线低~中
执行速度快(PHP 8+ JIT)快(V8)非常快
并发能力中(Swoole/Octane)好(异步事件循环)非常好(Goroutine)
Web 生态非常丰富丰富(Django/Flask)非常丰富丰富(Spring)成长中
包管理ComposerpipnpmMaven/GradleGo Modules
主机支持几乎所有虚拟主机需 VPS需 VPS需 VPS需 VPS
嵌入 HTML原生支持需模板引擎需模板引擎需模板引擎需模板引擎
php
<?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=1255

PHP 的生态系统

Composer — PHP 的包管理器

Composer 是 PHP 生态系统中最重要的工具之一,类似于 Node.js 的 npm 或 Python 的 pip。它允许你声明项目所依赖的库,并自动管理这些依赖的安装和更新。

php
<?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
<?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
<?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
<?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 在实际开发中的各种应用场景。

参考链接