PHP 基础语法完全指南
一份适合入门与速查的 PHP 基础语法手册,涵盖从环境搭建到面向对象的核心知识点。
目录
- 1. PHP 简介
- 2. 基本语法
- 3. 变量与常量
- 4. 数据类型
- 5. 运算符
- 6. 流程控制
- 7. 函数
- 8. 数组
- 9. 字符串处理
- 10. 表单与超全局变量
- 11. 面向对象编程
- 12. 命名空间与自动加载
- 13. 异常处理
- 14. 文件与 I/O
- 15. 常用内置函数速查
- 16. 常见最佳实践
1. PHP 简介
PHP(Hypertext Preprocessor)是一种开源的、运行在服务器端的脚本语言,广泛用于 Web 开发。
- 文件扩展名:
.php - 默认运行环境:Apache / Nginx + PHP-FPM
- 当前主流版本:PHP 8.x(支持 JIT、命名参数、枚举等新特性)
查看版本:
php -v2. 基本语法
PHP 代码必须包含在 <?php ... ?> 标签中:
<?php
echo "Hello, World!";纯 PHP 文件建议不要写结尾的
?>,以避免输出多余空白字符。
注释
<?php
// 单行注释
# 单行注释(Shell 风格)
/*
多行
注释
*/
/**
* 文档注释(PHPDoc)
* @param int $x
* @return int
*/语句结束符
每条语句必须以 ; 结尾:
<?php
$name = "Tom";
echo $name;3. 变量与常量
变量
- 以
$开头 - 区分大小写
- 不需要声明类型(动态弱类型)
<?php
$name = "Alice";
$age = 18;
$price = 9.99;
$ok = true;常量
<?php
define('SITE_NAME', '示例网站'); // 运行时定义
const VERSION = '1.0.0'; // 编译时定义(类中也可用)
echo SITE_NAME;
echo VERSION;变量作用域
<?php
$x = 10; // 全局变量
function demo() {
global $x; // 引入全局变量
echo $x;
}
function counter() {
static $n = 0; // 静态变量,函数调用间保留
$n++;
echo $n;
}4. 数据类型
PHP 是动态弱类型语言,主要类型如下:
| 类型 | 说明 | 示例 |
|---|---|---|
int |
整数 | 42 |
float |
浮点数 | 3.14 |
string |
字符串 | "hello" |
bool |
布尔值 | true / false |
array |
数组 | [1,2,3] |
object |
对象 | new Foo() |
null |
空值 | null |
resource |
资源 | 文件句柄等 |
类型判断与转换
<?php
$x = "123";
var_dump($x); // string(3) "123"
$y = (int) $x; // 强制转换
settype($x, "integer"); // 直接修改类型
is_int($y); // true
is_string($x); // false
gettype($y); // "integer"字符串定义
<?php
$a = 'Hello $name'; // 单引号:不解析变量
$b = "Hello $name"; // 双引号:解析变量
$c = <<<EOT
Heredoc 字符串 $name
支持变量解析
EOT;
$d = <<<'EOT'
Nowdoc 字符串 $name
不支持变量解析
EOT;5. 运算符
算术运算符
+ - * / % **赋值运算符
= += -= *= /= .= %=比较运算符
| 运算符 | 含义 |
|---|---|
== |
值相等(类型自动转换) |
=== |
值且类型相等 |
!= / <> |
不等 |
!== |
严格不等 |
<=> |
太空船运算符(返回 -1/0/1) |
逻辑运算符
&& || ! // 或 and / or / not字符串运算符
$s = "Hello" . " " . "World"; // 拼接
$s .= "!"; // 拼接赋值三元 / Null 合并
<?php
$a = $x ?: 'default'; // 短三元
$b = $x ?? 'default'; // null 合并(推荐)
$c = $x ??= 'default'; // null 合并赋值(PHP 7.4+)6. 流程控制
if / else
<?php
if ($score >= 90) {
echo "优秀";
} elseif ($score >= 60) {
echo "及格";
} else {
echo "不及格";
}switch
<?php
switch ($day) {
case 1:
case 2:
echo "工作日";
break;
case 6:
case 7:
echo "周末";
break;
default:
echo "未知";
}match(PHP 8+)
<?php
$result = match($status) {
1, 2 => '进行中',
3 => '已完成',
default => '未知',
};循环
<?php
// for
for ($i = 0; $i < 10; $i++) { echo $i; }
// while
while ($n > 0) { $n--; }
// do...while
do { ... } while ($cond);
// foreach
foreach ($arr as $value) { ... }
foreach ($arr as $key => $value) { ... }break / continue
<?php
foreach ($list as $v) {
if ($v < 0) continue; // 跳过本次
if ($v > 100) break; // 终止循环
}7. 函数
基本定义
<?php
function add($a, $b) {
return $a + $b;
}
echo add(1, 2); // 3默认参数 / 类型声明 / 返回值类型
<?php
function greet(string $name = "Guest"): string {
return "Hello, {$name}";
}可变参数
<?php
function sum(int ...$nums): int {
return array_sum($nums);
}
sum(1, 2, 3, 4); // 10命名参数(PHP 8+)
<?php
function createUser(string $name, int $age = 18, bool $admin = false) {}
createUser(name: 'Tom', admin: true);匿名函数 / 箭头函数
<?php
$square = function ($x) { return $x * $x; };
$double = fn($x) => $x * 2; // 箭头函数(PHP 7.4+)8. 数组
索引数组与关联数组
<?php
$fruits = ['apple', 'banana', 'cherry']; // 索引数组
$user = ['name' => 'Tom', 'age' => 18]; // 关联数组
$matrix = [[1, 2], [3, 4]]; // 多维数组
echo $fruits[0];
echo $user['name'];
echo $matrix[1][0];常用数组操作
<?php
count($arr); // 数组长度
in_array('apple', $fruits); // 是否存在某值
array_keys($user); // 获取所有键
array_values($user); // 获取所有值
array_merge($a, $b); // 合并
array_push($arr, $v); // 入栈
array_pop($arr); // 出栈
array_map('strtoupper', $arr);
array_filter($arr, fn($v) => $v > 0);
sort($arr); rsort($arr); ksort($arr); asort($arr);数组解构
<?php
[$a, $b, $c] = [1, 2, 3];
['name' => $n, 'age' => $age] = $user;9. 字符串处理
<?php
strlen($s); // 长度
mb_strlen($s, 'UTF-8'); // 多字节长度(中文常用)
strtolower($s); strtoupper($s);
trim($s); ltrim($s); rtrim($s);
str_replace('a', 'b', $s);
str_contains($s, 'foo'); // PHP 8+
str_starts_with($s, 'pre'); // PHP 8+
str_ends_with($s, 'end'); // PHP 8+
explode(',', $s); // 字符串转数组
implode('-', $arr); // 数组转字符串
substr($s, 0, 5);
sprintf("姓名:%s,年龄:%d", $name, $age);10. 表单与超全局变量
PHP 提供了一系列超全局变量(superglobals),在任何作用域可访问:
| 变量 | 用途 |
|---|---|
$_GET |
GET 请求参数 |
$_POST |
POST 请求参数 |
$_REQUEST |
GET + POST + COOKIE |
$_SESSION |
会话数据 |
$_COOKIE |
Cookie 数据 |
$_FILES |
上传文件 |
$_SERVER |
服务器与请求信息 |
$_ENV |
环境变量 |
$GLOBALS |
所有全局变量 |
示例:
<?php
// form.html: <form method="post" action="submit.php">
$name = $_POST['name'] ?? '';
$ip = $_SERVER['REMOTE_ADDR'];
session_start();
$_SESSION['user'] = $name;
setcookie('lang', 'zh-CN', time() + 3600);11. 面向对象编程
类与对象
<?php
class User
{
public string $name;
protected int $age;
private string $password;
public function __construct(string $name, int $age) {
$this->name = $name;
$this->age = $age;
}
public function sayHi(): string {
return "Hi, I'm {$this->name}";
}
}
$u = new User('Tom', 18);
echo $u->sayHi();继承与多态
<?php
class Admin extends User
{
public function sayHi(): string {
return parent::sayHi() . ' (admin)';
}
}访问修饰符
| 修饰符 | 类内 | 子类 | 外部 |
|---|---|---|---|
public |
✅ | ✅ | ✅ |
protected |
✅ | ✅ | ❌ |
private |
✅ | ❌ | ❌ |
静态成员
<?php
class Counter {
public static int $count = 0;
public static function inc(): void {
self::$count++;
}
}
Counter::inc();
echo Counter::$count;抽象类与接口
<?php
abstract class Animal {
abstract public function speak(): string;
}
interface Runnable {
public function run(): void;
}
class Dog extends Animal implements Runnable {
public function speak(): string { return "Woof"; }
public function run(): void { echo "running"; }
}Trait(代码复用)
<?php
trait Loggable {
public function log(string $msg): void {
echo "[LOG] $msg\n";
}
}
class Service {
use Loggable;
}构造函数提升(PHP 8+)
<?php
class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
) {}
}枚举(PHP 8.1+)
<?php
enum Status: string {
case Active = 'A';
case Disabled = 'D';
}
$s = Status::Active;
echo $s->value; // "A"12. 命名空间与自动加载
命名空间
<?php
namespace App\Service;
class UserService {}使用:
<?php
use App\Service\UserService;
use App\Service\UserService as US;
$svc = new UserService();Composer 自动加载
composer.json 示例:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}执行后即可自动加载:
composer dump-autoload<?php
require __DIR__ . '/vendor/autoload.php';13. 异常处理
<?php
try {
if ($x < 0) {
throw new InvalidArgumentException("x 必须 ≥ 0");
}
} catch (InvalidArgumentException $e) {
echo "参数错误: " . $e->getMessage();
} catch (Throwable $e) {
echo "未知错误: " . $e->getMessage();
} finally {
echo "总会执行";
}自定义异常:
<?php
class BusinessException extends \RuntimeException {}14. 文件与 I/O
<?php
// 读
$content = file_get_contents('data.txt');
$lines = file('data.txt');
// 写
file_put_contents('data.txt', "hello\n", FILE_APPEND);
// 句柄方式
$fp = fopen('data.txt', 'r');
while (!feof($fp)) {
echo fgets($fp);
}
fclose($fp);
// 判断
file_exists('a.txt');
is_file('a.txt');
is_dir('logs');
// JSON
$json = json_encode(['a' => 1], JSON_UNESCAPED_UNICODE);
$arr = json_decode($json, true);15. 常用内置函数速查
| 分类 | 常用函数 |
|---|---|
| 字符串 | strlen strpos str_replace explode implode sprintf trim |
| 数组 | count array_map array_filter array_merge in_array array_keys |
| 数学 | abs round ceil floor min max rand mt_rand |
| 时间 | time date strtotime mktime microtime |
| 类型 | is_int is_array is_null empty isset gettype |
| 调试 | var_dump print_r error_log debug_backtrace |
| 编码 | json_encode json_decode base64_encode urlencode md5 sha1 |
16. 常见最佳实践
- 始终开启严格类型:在文件顶部使用
declare(strict_types=1); - 优先使用
===与!==,避免类型隐式转换带来的坑 - 使用
??而不是isset(...) ? ... : ... - 遵循 PSR-12 编码规范 与 PSR-4 自动加载规范
- 使用 Composer 管理依赖,不再手动
require一堆文件 - 永远不要信任用户输入:过滤
$_GET/$_POST,使用 PDO 预处理防止 SQL 注入 - 输出到 HTML 时使用
htmlspecialchars()防止 XSS - 生产环境关闭
display_errors,只记录日志 - 使用现代框架(Laravel、Symfony 等)而不是裸写 PHP
- 保持 PHP 版本更新,至少使用 PHP 8.1+
严格类型示例
<?php
declare(strict_types=1);
function add(int $a, int $b): int {
return $a + $b;
}
add(1, '2'); // TypeError学完以上内容,你已经掌握了 PHP 的基础语法。下一步建议:
- 学习 PDO / MySQL 操作数据库
- 学习 Composer 与包管理
- 学习 Laravel 或 Symfony 等主流框架
- 阅读官方文档:https://www.php.net/manual/zh/