PHP(PHP: Hypertext Preprocessor,超文本预处理器)是一种广泛使用的开源服务器端脚本语言,专门为Web开发而设计。PHP代码在服务器上执行,生成HTML发送到客户端浏览器。
<?php ?>)与HTML内容分离。这种混合模式使得创建动态网页变得简单直观。理解PHP在Web技术栈中的位置非常重要:
| 语言 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| PHP |
|
|
|
| Python |
|
|
|
| Node.js |
|
|
|
理解PHP的工作原理对于深入学习至关重要,这将帮助你理解代码执行的底层机制:
客户端请求 → Web服务器接收 → PHP-FPM/模块处理 → Zend引擎执行 → 生成HTML → 返回给客户端
| 执行模式 | 工作原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| Apache模块 | PHP作为Apache模块运行 | 配置简单,集成度高 | 每个请求创建新进程,内存占用大 | 小型网站,开发环境 |
| PHP-FPM | 独立进程池,通过FastCGI通信 | 性能高,稳定,支持进程管理 | 配置稍复杂 | 生产环境,高流量网站 |
| CLI模式 | 命令行直接执行 | 适合脚本和自动化任务 | 不适合Web请求处理 | 脚本、定时任务、开发工具 |
了解不同PHP版本的主要特性有助于选择合适的版本:
| 版本 | 发布时间 | 主要特性 | 推荐使用 |
|---|---|---|---|
| PHP 5.x | 2004-2015 | 面向对象编程、PDO、命名空间 | ❌ 已停止支持 |
| PHP 7.x | 2015-2020 | 性能提升2倍、类型声明、返回类型声明 | ✅ 稳定版本 |
| PHP 8.x | 2020-至今 | JIT编译器、联合类型、属性、匹配表达式 | ✅ 最新推荐 |
PHP在Web开发中有着广泛的应用:
根据不同操作系统,有多种安装方式。对于初学者,推荐使用集成环境包,可以快速搭建完整的开发环境。
1. 访问 https://www.apachefriends.org
2. 下载XAMPP安装包(包含Apache、PHP、MySQL)
3. 运行安装程序,选择安装路径
4. 启动XAMPP控制面板
5. 点击Apache的"Start"按钮启动服务器
# 安装Homebrew(如果未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 安装PHP
brew install php
# 启动PHP内置服务器
php -S localhost:8000
# Ubuntu/Debian
sudo apt update
sudo apt install php php-cli php-mysql
# CentOS/RHEL
sudo yum install php php-cli php-mysql
# 验证安装
php -v
php -v
# 输出示例:
# PHP 8.2.0 (cli) (built: Dec 6 2022 15:31:23) (NTS)
# Copyright (c) The PHP Group
一个完整的PHP开发环境应该包含以下组件:
| 环境包 | 支持平台 | 包含组件 | 特点 |
|---|---|---|---|
| XAMPP | Windows、macOS、Linux | Apache、PHP、MySQL、phpMyAdmin | 跨平台、免费、易于使用 |
| WAMP | Windows | Apache、PHP、MySQL | Windows专用、轻量级 |
| MAMP | macOS | Apache、PHP、MySQL | macOS专用、界面友好 |
| Laragon | Windows | Nginx、PHP、MySQL | 现代化、支持多PHP版本 |
让我们开始编写第一个PHP程序,理解PHP的基本结构和执行方式。
创建一个名为 hello.php 的文件:
<?php
/**
* 第一个PHP程序
* 功能:输出"Hello, PHP!"到浏览器或命令行
*
* PHP文件的基本结构:
* 1. PHP开始标记:<?php
* 2. PHP代码
* 3. PHP结束标记:?>(可选,如果文件只包含PHP代码)
*/
// 这是单行注释,用于简单说明代码功能
// echo是PHP的输出语句,用于向浏览器或命令行输出内容
echo "Hello, PHP!"; // 输出文本,注意末尾的分号
/**
* 代码执行流程:
* 1. PHP解释器读取文件
* 2. 识别PHP标记内的代码
* 3. 执行echo语句
* 4. 输出结果
* 5. 脚本执行结束
*/
?>
有两种方式可以运行PHP程序:
# 命令行运行
php hello.php
# 输出:Hello, PHP!
# 将文件放在Web服务器的文档根目录(如XAMPP的htdocs文件夹)
# 在浏览器中访问:http://localhost/hello.php
# 浏览器将显示:Hello, PHP!
当PHP文件被执行时,会发生以下过程,了解这个过程有助于理解PHP的工作原理:
OPcache是PHP的性能优化扩展,它缓存预编译的PHP脚本字节码,避免重复编译,显著提高性能:
在php.ini中启用OPcache:
zend_extension=opcache
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.validate_timestamps=1
opcache.revalidate_freq=60
掌握PHP的基本语法规则是学习PHP的第一步,这些规则构成了PHP语言的基础。
PHP代码需要包含在特定的标记中,以便服务器能够识别和执行。
<?php
/**
* PHP标记
* 标准PHP开始标记:<?php
* 标准PHP结束标记:?>
*
* 注意事项:
* - 结束标记对于纯PHP文件是可选的
* - 如果省略结束标记,可以避免意外的空白字符输出
* - 所有PHP代码必须包含在PHP标记内
*/
// 标准PHP开始标记
echo "这是PHP代码";
?>
<?php
// 如果文件只包含PHP代码,建议省略结束标记
// 这样可以避免文件末尾的空白字符导致的问题
echo "纯PHP文件可以不写结束标记";
/**
* 为什么推荐省略结束标记?
* 1. 避免意外的空白字符输出
* 2. 防止在包含文件时出现问题
* 3. 符合PSR-1代码规范
* 4. 减少文件大小(微小)
*/
// 注意:如果文件中包含HTML内容,则必须使用结束标记
?>
PHP标记类型:
- <?php ?>:标准标记,推荐使用
- <? ?>:短标记,需要开启short_open_tag
- <% %>:ASP风格标记,不推荐使用
- <script language="php"> </script>:脚本标记,极少使用
2. 注释方式
注释是代码中不可或缺的部分,用于解释代码的功能和逻辑,提高代码的可读性和可维护性。
<?php
/**
* PHP注释类型
* 1. 单行注释:// 或 #
* 2. 多行注释:/* */
* 3. 文档注释:/** */(PHPDoc格式)
*/
// 单行注释 - 用于简短说明
// 通常用于解释单行代码的功能
$name = "张三"; // 也可以在代码行末尾添加注释
# 也是单行注释(Shell风格)
# 与//功能相同,但推荐使用//以保持一致性
$age = 25;
/*
* 多行注释
* 用于详细说明代码块的功能
* 可以跨越多行
* 注意:多行注释不能嵌套
*/
function calculateSum($a, $b) {
return $a + $b;
}
/**
* 文档注释(PHPDoc格式)
* 用于为函数、类、方法等生成文档
* 支持各种标签,如@param、@return、@throws等
*
* @param int $a 第一个数字
* @param int $b 第二个数字
* @return int 两个数字的和
* @example calculateSum(1, 2) // 返回3
*/
function calculateSum($a, $b) {
return $a + $b;
}
/**
* 注释最佳实践:
* 1. 为复杂的逻辑添加注释
* 2. 解释"为什么"而不是"是什么"
* 3. 使用PHPDoc为公共API添加文档
* 4. 保持注释与代码同步更新
* 5. 避免过度注释(如显而易见的代码)
* 6. 使用一致的注释风格
*/
?>
注释最佳实践:
- 为复杂的逻辑添加注释,解释为什么这样写
- 避免显而易见的注释,如
// 设置变量
- 使用PHPDoc为函数和类添加文档注释
- 保持注释与代码同步更新
3. 语句分隔符
PHP使用分号作为语句分隔符,这是大多数C风格语言的共同特点。
<?php
echo "第一条语句"; // 分号结尾
echo "第二条语句"; // 每条语句必须以分号结束
// 最后一条语句的分号可以省略(不推荐)
echo "最后一条"
?>
分号的重要性:
- 分号告诉PHP解释器一条语句的结束
- 忘记分号会导致语法错误
- 在控制结构(if、for等)中,分号的使用规则有所不同
- 始终使用分号是良好的编程习惯
4. 大小写敏感性
PHP在大小写敏感性方面有特定的规则,了解这些规则可以避免常见的错误。
<?php
// 变量名区分大小写
$name = "张三";
$Name = "李四";
echo $name; // 输出:张三
echo $Name; // 输出:李四
// 函数名、类名不区分大小写
ECHO "Hello"; // 正常工作
Echo "World"; // 正常工作
// 关键字也不区分大小写
If (true) { // 正常工作
echo "条件成立";
}
?>
大小写规则总结:
- 区分大小写:变量名、常量名(除非使用define的第三个参数)
- 不区分大小写:函数名、类名、关键字、构造器
- 最佳实践:保持一致的命名风格,避免混淆
PHP与HTML混合使用
PHP最强大的特性之一就是能够与HTML无缝混合使用,实现动态网页内容的生成。
基本混合使用
<!DOCTYPE html>
<html>
<head>
<title>PHP与HTML</title>
</head>
<body>
<h1>欢迎来到PHP世界</h1>
<!--
PHP与HTML混合使用的基本语法:
- 在HTML中嵌入PHP代码块
- PHP代码必须包含在 <?php ?> 标记内
- 可以在HTML的任何位置嵌入PHP代码
-->
<!-- 示例1:输出当前时间 -->
<p>当前时间:<?php echo date('Y-m-d H:i:s'); ?></p>
<!-- 示例2:输出服务器IP地址 -->
<p>服务器IP:<?php echo $_SERVER['SERVER_ADDR']; ?></p>
<!--
最佳实践:
1. 保持HTML结构清晰,避免过多PHP代码嵌入
2. 对于复杂逻辑,将PHP代码放在文件顶部
3. 使用HTML友好的PHP语法(如替代语法)
4. 注意输出内容的安全性,避免XSS攻击
-->
</body>
</html>
条件性内容输出
<!DOCTYPE html>
<html>
<head>
<title>条件性内容</title>
</head>
<body>
<!-- 方法1:使用传统PHP语法 -->
<?php
// 获取当前小时(24小时制)
$hour = date('H');
// 根据时间输出不同的问候语
if ($hour < 12) {
echo "<h1>早上好!</h1>";
} else if ($hour < 18) {
echo "<h1>下午好!</h1>";
} else {
echo "<h1>晚上好!</h1>";
}
?>
<!-- 方法2:使用PHP替代语法(推荐在HTML中使用) -->
<?php if ($hour < 12): ?>
<p>现在是上午,适合学习和工作!</p>
<?php elseif ($hour < 18): ?>
<p>现在是下午,继续加油!</p>
<?php else: ?>
<p>现在是晚上,注意休息!</p>
<?php endif; ?>
<!--
PHP替代语法的优势:
1. 更适合在HTML模板中使用
2. 结构更清晰,与HTML标签更好地融合
3. 避免引号转义的麻烦
4. 可读性更高
支持替代语法的控制结构:
- if, elseif, else, endif
- for, endfor
- foreach, endforeach
- while, endwhile
- switch, case, default, endswitch
-->
</body>
</html>
PHP与HTML混合使用的技巧:
- 分离逻辑与表现:尽量将PHP逻辑代码放在文件顶部
- 使用替代语法:if、for、while等控制结构有HTML友好的替代语法
- 避免过度混合:过多的PHP代码嵌入HTML会降低可读性
- 模板引擎:对于复杂项目,考虑使用Smarty、Blade等模板引擎
输出内容的方法
1. echo语句
<?php
/**
* echo语句
* 特点:
* - 不是函数,是语言结构
* - 可以输出多个参数,用逗号分隔
* - 没有返回值
* - 执行速度快
* - 可以使用括号或不使用括号
*/
// 基本用法
echo "Hello World";
// 输出多个参数(用逗号分隔,比连接字符串更高效)
echo "Hello", " ", "World"; // 可以输出多个参数
// 输出不同类型的数据
echo "数字:", 123, " 布尔:", true;
// 使用括号(可选)
echo("使用括号的echo");
/**
* 最佳实践:
* - 输出多个值时,使用逗号分隔参数而不是字符串连接
* - 对于简单输出,使用echo
* - 注意HTML特殊字符的转义
*/
?>
2. print语句
<?php
/**
* print语句
* 特点:
* - 不是函数,是语言结构
* - 只能输出一个参数
* - 有返回值,总是返回1
* - 执行速度比echo稍慢
*/
// 基本用法
print "Hello World"; // 只能输出一个参数
// 可以赋值给变量(因为有返回值)
$result = print "测试"; // print有返回值(总是1)
echo "\n返回值:", $result; // 输出:返回值:1
/**
* 最佳实践:
* - 通常情况下推荐使用echo而不是print
* - 只在需要返回值的情况下使用print
*/
?>
3. var_dump()函数
<?php
/**
* var_dump()函数
* 特点:
* - 是函数,需要括号
* - 输出变量的详细信息,包括类型和值
* - 对于数组和对象,会递归输出结构
* - 主要用于调试
*/
$number = 42;
$text = "Hello";
$array = [1, 2, 3];
// 输出变量的详细信息
var_dump($number); // int(42)
var_dump($text); // string(5) "Hello"
var_dump($array); // array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
/**
* 最佳实践:
* - 仅用于开发和调试阶段
* - 不适合在生产环境中使用
* - 可以使用ini_set('xdebug.overload_var_dump', 0)来禁用Xdebug的var_dump重载
*/
?>
4. print_r()函数
<?php
/**
* print_r()函数
* 特点:
* - 是函数,需要括号
* - 以人类可读的格式输出变量
* - 对于数组和对象,会显示结构
* - 主要用于调试
*/
$person = [
'name' => '张三',
'age' => 25,
'city' => '北京'
];
// 基本用法
print_r($person);
// 输出:
// Array
// (
// [name] => 张三
// [age] => 25
// [city] => 北京
// )
// 第二个参数为true时,返回字符串而不输出
$output = print_r($person, true);
echo "\n返回的字符串:", $output;
/**
* 最佳实践:
* - 仅用于开发和调试阶段
* - 不适合在生产环境中使用
* - 对于复杂数据结构,print_r()比var_dump()更简洁
*/
?>
PHP配置文件(php.ini)详解
php.ini是PHP的核心配置文件,控制PHP的行为、性能和安全设置。不同的PHP安装方式和运行模式会有不同的配置文件位置:
查找php.ini位置:
# 命令行模式
php --ini
# Web模式(创建info.php文件)
<?php
phpinfo();
?>
# 常见位置:
# Windows (XAMPP): C:\xampp\php\php.ini
# macOS (Homebrew): /usr/local/etc/php/8.2/php.ini
# Linux: /etc/php/8.2/cli/php.ini (CLI模式)
# Linux: /etc/php/8.2/fpm/php.ini (FPM模式)
重要配置项详解
开发环境配置:
; 错误处理
display_errors = On ; 显示错误信息(开发环境)
display_startup_errors = On ; 显示启动时的错误
error_reporting = E_ALL ; 报告所有错误和警告
log_errors = On ; 记录错误到日志
error_log = php_errors.log ; 错误日志文件位置
; 性能设置
max_execution_time = 30 ; 脚本最大执行时间(秒)
memory_limit = 128M ; 内存限制
post_max_size = 8M ; POST数据大小限制
upload_max_filesize = 2M ; 上传文件大小限制
max_file_uploads = 20 ; 最大上传文件数
; 时区设置
date.timezone = Asia/Shanghai ; 设置时区
; 编码设置
default_charset = "UTF-8" ; 默认字符集
mbstring.internal_encoding = UTF-8 ; 多字节字符串编码
; OPcache设置(开发环境)
zend_extension=opcache
opcache.enable=1
opcache.memory_consumption=128 ; 内存分配(MB)
opcache.interned_strings_buffer=8 ; 字符串缓冲区(MB)
opcache.max_accelerated_files=10000 ; 最大缓存文件数
opcache.validate_timestamps=1 ; 启用时间戳验证
opcache.revalidate_freq=2 ; 重新验证频率(秒),开发环境设为较小值
opcache.fast_shutdown=1 ; 快速关闭
; 调试设置
opcache.save_comments=1 ; 保存注释(对文档生成工具重要)
zend.assertions=1 ; 启用断言
assert.exception=1 ; 断言失败时抛出异常
生产环境配置:
; 错误处理
display_errors = Off ; 关闭错误显示(生产环境)
display_startup_errors = Off ; 关闭启动错误显示
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT ; 报告所有错误但排除过时和严格警告
log_errors = On ; 记录错误到日志
error_log = /var/log/php/errors.log ; 错误日志文件位置
; 性能设置
max_execution_time = 60 ; 脚本最大执行时间(秒)
memory_limit = 256M ; 内存限制(根据实际需求调整)
post_max_size = 16M ; POST数据大小限制
upload_max_filesize = 8M ; 上传文件大小限制
max_file_uploads = 20 ; 最大上传文件数
; 安全设置
expose_php = Off ; 隐藏PHP版本信息
disable_functions = exec,system,passthru,shell_exec,proc_open,proc_get_status,popen ; 禁用危险函数
open_basedir = /var/www/html:/tmp ; 限制文件访问范围
allow_url_fopen = Off ; 禁用远程文件访问
allow_url_include = Off ; 禁用远程文件包含
; 会话安全
session.cookie_httponly = 1 ; 防止JavaScript访问会话cookie
session.cookie_secure = 1 ; 仅通过HTTPS发送cookie(如果使用HTTPS)
session.cookie_samesite = "Strict" ; 防止CSRF攻击
; OPcache设置(生产环境)
zend_extension=opcache
opcache.enable=1
opcache.memory_consumption=256 ; 内存分配(MB)
opcache.interned_strings_buffer=16 ; 字符串缓冲区(MB)
opcache.max_accelerated_files=10000 ; 最大缓存文件数
opcache.validate_timestamps=0 ; 禁用时间戳验证(提高性能)
opcache.revalidate_freq=0 ; 禁用重新验证
opcache.fast_shutdown=1 ; 快速关闭
opcache.validate_permission=0 ; 禁用权限验证
opcache.validate_root=0 ; 禁用根目录验证
; 调试设置(生产环境)
zend.assertions=-1 ; 完全禁用断言
assert.exception=0 ; 禁用断言异常
安全配置最佳实践:
- 错误处理:生产环境必须关闭错误显示,只记录到日志
- 文件权限:确保php.ini文件权限为644(只有root可写)
- 危险函数:根据实际需求禁用不必要的系统函数
- 路径限制:使用open_basedir限制文件访问范围
- 会话安全:启用httponly、secure和samesite cookie设置
- 远程访问:禁用allow_url_fopen和allow_url_include
- 版本隐藏:设置expose_php = Off隐藏PHP版本
- 定期检查:定期检查配置文件是否存在安全漏洞
OPcache深度优化
OPcache性能调优参数:
; OPcache基本设置
opcache.enable=1
opcache.memory_consumption=256 ; 根据服务器内存调整,一般256-512M
opcache.interned_strings_buffer=16 ; 字符串缓冲区,一般8-16M
opcache.max_accelerated_files=10000 ; 项目文件数+20%
opcache.max_wasted_percentage=10 ; 最大浪费空间百分比
; 高级设置
opcache.use_cwd=1 ; 使用当前工作目录作为缓存键的一部分
opcache.validate_timestamps=0 ; 生产环境禁用
opcache.revalidate_freq=0 ; 与validate_timestamps=0配合使用
opcache.save_comments=1 ; 保存注释(对某些框架重要)
opcache.enable_file_override=0 ; 禁用文件覆盖
; 优化设置
opcache.optimization_level=0x7FFFBFFF ; 启用所有优化
opcache.dups_fix=0 ; 修复重复键
opcache.enable_cli=1 ; CLI模式也启用OPcache
; 内存管理
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.max_wasted_percentage=10
调优建议:
- 根据服务器内存大小调整memory_consumption
- 根据项目大小调整max_accelerated_files
- 生产环境必须设置validate_timestamps=0
- 定期监控OPcache状态:使用phpinfo()或opcache_get_status()
多PHP版本管理
在开发环境中,有时需要同时使用多个PHP版本,可以使用以下工具:
- Windows:使用Laragon或XAMPP的多版本支持
- macOS:使用Homebrew的php版本管理
- Linux:使用update-alternatives或Docker容器
使用Homebrew管理PHP版本(macOS):
# 安装PHP 8.2
brew install php@8.2
# 安装PHP 7.4
brew install php@7.4
# 切换版本
echo 'export PATH="/usr/local/opt/php@8.2/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
开发工具推荐
- PhpStorm:专业的PHP IDE,功能强大(付费)
- Visual Studio Code:轻量级编辑器,配合PHP插件使用(免费)
- Sublime Text:快速的文本编辑器(免费/付费)
- NetBeans:免费的PHP IDE,支持调试
VS Code推荐插件:
- PHP Intelephense - 代码智能提示
- PHP Debug - 调试支持
- PHP DocBlocker - 文档注释生成
- PHP Namespace Resolver - 命名空间管理
实践练习
- 环境搭建:在你的电脑上安装PHP环境,并验证安装成功
- Hello World:创建hello.php文件,输出"你好,PHP世界!"
- 信息输出:使用phpinfo()函数查看PHP配置信息
- 混合编程:创建一个HTML页面,在其中嵌入PHP代码显示当前日期和时间
- 注释练习:编写一个PHP文件,使用三种不同的注释方式
- 输出对比:分别使用echo、print、var_dump输出同一个变量,观察区别
- 配置查看:使用命令行查找php.ini文件位置,并查看其中的配置
- 内置服务器:使用PHP内置服务器运行一个简单的网页