PHP后端十年:从0到资深开发者的10堂必修课

第1篇:基石篇——PHP语法基础与开发环境搭建

PHP 作为后端开发的主流语言,以其简单易学、生态丰富而闻名。但“易上手”并不代表“能精通”。本篇将带你走进 PHP 的世界,从运行原理到语法细节,再到开发环境的搭建,为你打下坚实的基石。


一、PHP 运行原理

在编写第一行 PHP 代码之前,先理解 PHP 是如何工作的,这有助于后续调试和性能优化。

1. SAPI(Server API)概念:CLI、Apache 模块、PHP-FPM

PHP 与外部环境的交互通过 SAPI(Server Application Programming Interface)完成。不同的运行方式对应不同的 SAPI:

  • CLI(Command Line Interface):命令行模式下运行,用于脚本、定时任务、开发调试。
    php script.php
    
  • Apache 模块(mod_php):PHP 作为 Apache 的一个模块嵌入,与 Apache 共享进程。这种方式简单但资源消耗高,现已较少用于生产环境。
  • PHP-FPM(FastCGI Process Manager):独立运行的 FastCGI 进程管理器,与 Nginx/Apache 通过 FastCGI 协议通信。它是现代 PHP 应用的标准配置,支持进程池管理、动态扩容等。

理解 SAPI 的差异,有助于根据场景选择合适的运行方式。

2. 请求生命周期(从浏览器到脚本执行)

一个典型的 HTTP 请求流程(以 Nginx + PHP-FPM 为例):

  1. 浏览器发起请求 https://example.com/index.php
  2. Nginx 接收请求,根据配置将 .php 请求转发给 PHP-FPM(通过 FastCGI)。
  3. PHP-FPM 从进程池中获取一个空闲 worker 进程,处理该请求。
  4. PHP 解析器加载并执行 index.php 脚本,将输出结果返回给 Nginx。
  5. Nginx 将响应返回给浏览器。

FastCGI

输出

响应

响应

浏览器

Nginx

PHP-FPM Worker

执行 PHP 脚本

每个请求在 PHP 内部经历:

  • 启动:初始化模块、设置环境变量、加载扩展。
  • 执行:解析脚本、编译成操作码(opcode)、执行。
  • 关闭:清理资源、输出缓冲区内容。

了解生命周期,有助于优化内存使用和避免资源泄漏。


二、基础语法与核心特性

PHP 的语法借鉴了 C 和 Perl,但更灵活。掌握核心语法是高效编码的第一步。

1. 变量与常量、数据类型

变量$ 开头,由字母、数字、下划线组成(数字不能开头)。PHP 是弱类型语言,变量类型由值决定。

$name = "Alice";      // 字符串
$age = 25;            // 整数
$score = 89.5;        // 浮点数
$isActive = true;     // 布尔
$skills = ['PHP', 'Laravel']; // 数组
$user = null;         // 空值

常量使用 define()const 定义,一旦定义不可修改。

define('APP_NAME', 'MyBlog');
const VERSION = '1.0.0';

数据类型

  • 标量类型:string、int、float、bool
  • 复合类型:array、object
  • 特殊类型:callable、resource、null

PHP 7+ 引入了严格类型声明(declare(strict_types=1);),可提升代码健壮性。

2. 运算符、流程控制

运算符:算术(+-*/%)、比较(=====!=<>!==><等)、逻辑(&&||!)、赋值(=+=.=)等。

注意 ===== 的区别:== 只比较值,=== 同时比较类型。

var_dump(1 == '1');   // true
var_dump(1 === '1');  // false

流程控制

  • 条件:if...elseif...elseswitch
  • 循环:whiledo...whileforforeach(遍历数组)
$fruits = ['apple', 'banana', 'orange'];
foreach ($fruits as $index => $fruit) {
    echo "$index: $fruit\n";
}

3. 函数定义与参数、可变函数、匿名函数

函数定义使用 function 关键字:

function add(int $a, int $b): int {
    return $a + $b;
}

支持默认参数、可变参数(...$args)。

function greet($name, $greeting = 'Hello') {
    echo "$greeting, $name";
}
greet('Alice'); // Hello, Alice
greet('Bob', 'Hi'); // Hi, Bob

可变函数:变量名后加括号,调用该变量所代表的函数。

function foo() { echo "foo"; }
$func = 'foo';
$func(); // 输出 foo

匿名函数(闭包):没有名称的函数,常作为回调使用。

$greet = function($name) {
    return "Hello, $name";
};
echo $greet('Alice');

闭包可以通过 use 引入外部变量:

$message = 'Hello';
$closure = function($name) use ($message) {
    return "$message, $name";
};

三、数组与字符串高级操作

PHP 提供了丰富的数组和字符串处理函数,掌握它们能极大提升开发效率。

1. 数组函数(array_map、array_filter、array_reduce)

array_map:对每个元素应用回调,返回新数组。

$numbers = [1, 2, 3, 4];
$squares = array_map(function($n) {
    return $n * $n;
}, $numbers);
// $squares = [1, 4, 9, 16]

array_filter:过滤数组,只保留满足条件的元素。

$numbers = [1, 2, 3, 4];
$evens = array_filter($numbers, function($n) {
    return $n % 2 === 0;
});
// $evens = [2, 4] (索引保留)

array_reduce:迭代归约为单个值。

$numbers = [1, 2, 3, 4];
$sum = array_reduce($numbers, function($carry, $item) {
    return $carry + $item;
}, 0); // 10

这些函数让代码更简洁,并易于函数式编程。

2. 字符串处理(正则表达式、mbstring 扩展)

字符串操作:PHP 提供多种函数,如 strlenstrpossubstrexplodeimplode 等。

$str = "Hello, World!";
echo strlen($str);          // 13
echo strpos($str, "World"); // 7
$parts = explode(", ", $str); // ['Hello', 'World!']

正则表达式:使用 preg_* 系列函数(PCRE 库)。

$email = "user@example.com";
if (preg_match('/^[\w.-]+@[\w.-]+\.[a-z]{2,}$/', $email)) {
    echo "邮箱格式正确";
}

多字节字符串:对于中文等 UTF-8 字符,使用 mbstring 扩展(如 mb_strlenmb_substr)。需要在 php.ini 中启用该扩展。

$chinese = "你好世界";
echo strlen($chinese);      // 12(UTF-8 下每个中文字符占 3 字节)
echo mb_strlen($chinese);   // 4

四、开发环境搭建

工欲善其事,必先利其器。一个稳定的开发环境能让编码更加顺畅。

1. 本地环境(XAMPP、Docker)

  • XAMPP:集成了 Apache、MySQL、PHP、Perl 的集成包,适合初学者快速上手。
    • 下载安装后,将代码放在 htdocs 目录,启动 Apache 即可。
  • Docker:推荐使用 Docker Compose 搭建开发环境,更贴近生产,且便于团队统一。
    # docker-compose.yml
    version: '3'
    services:
      web:
        image: nginx:alpine
        ports:
          - "8080:80"
        volumes:
          - ./public:/var/www/html
      php:
        image: php:8.2-fpm
        volumes:
          - ./public:/var/www/html
      db:
        image: mysql:8.0
        environment:
          MYSQL_ROOT_PASSWORD: root
    

2. Composer 依赖管理

Composer 是 PHP 的包管理工具,用于管理项目依赖。

  • 安装:从 https://getcomposer.org/ 下载。
  • 初始化composer init 生成 composer.json
  • 安装依赖composer require monolog/monolog
  • 自动加载:通过 vendor/autoload.php 加载所有类。
require __DIR__ . '/vendor/autoload.php';
use Monolog\Logger;
$log = new Logger('name');

3. IDE 推荐(PhpStorm、VS Code)与调试配置(Xdebug)

  • PhpStorm:JetBrains 出品的专业 PHP IDE,支持代码提示、重构、调试、数据库工具等。配合 Xdebug 可设置断点、单步执行。
  • VS Code:轻量级编辑器,通过插件扩展 PHP 支持。推荐插件:PHP IntelephenseXdebug

Xdebug 配置(以 PHP 8.2 为例):

  1. 安装 Xdebug 扩展(可通过 pecl install xdebug 或使用集成包)。
  2. 修改 php.ini
    zend_extension=xdebug.so
    xdebug.mode=debug
    xdebug.start_with_request=yes
    xdebug.client_host=127.0.0.1
    xdebug.client_port=9003
    
  3. 在 IDE 中配置监听端口(通常 9003),然后设置断点,启动调试。

总结

本篇我们从 PHP 的运行原理出发,了解了 SAPI 和请求生命周期;学习了基础语法,包括变量、数据类型、流程控制和函数;掌握了数组与字符串的高级操作;最后搭建了本地开发环境,并配置了 Composer 和 Xdebug。

有了这些基础,你已经可以编写简单的 PHP 程序了。下一篇我们将进入 面向对象编程与命名空间,深入 PHP 的面向对象特性,为构建复杂应用打下坚实基础。


思考题

  1. PHP-FPM 相比 mod_php 有哪些优势?为什么生产环境更推荐使用 PHP-FPM?
  2. array_mapforeach 循环在性能上有差异吗?何时选择使用函数式方法?
  3. 如何在 Docker 环境中配置 PHP 扩展?请给出一个安装 mbstringpdo_mysql 的示例 Dockerfile。
  4. Xdebug 的 xdebug.remote_autostartxdebug.start_with_request 分别是什么作用?

欢迎在评论区分享你的学习心得和疑问,一起讨论进步!

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐