PHP 入门指南:从零基础到掌握核心语法
前言
PHP(Hypertext Preprocessor)作为 Web 开发领域的常青树,至今仍在全球超过 75% 的网站中使用。从 WordPress 到 Laravel,从小型博客到大型企业系统,PHP 以其简单易学、部署方便、生态丰富而备受开发者青睐。
本文将系统讲解 PHP 的核心语法,帮助你快速入门并打下坚实基础。
一、PHP 初体验
1.1 第一个 PHP 程序
php
<?php
echo "Hello, World!";
?>
文件保存为 index.php,通过 Web 服务器访问即可看到输出。
1.2 PHP 标签类型
php
<?php echo "标准标签(推荐)"; ?>
<?= "简写输出标签(PHP 5.4+)" ?>
<? echo "短标签(不推荐,需配置开启)"; ?>
<script language="php"> echo "脚本标签(已废弃)"; </script>
1.3 PHP 代码结构
php
<?php
// PHP 代码写在标签内
// 每条语句以分号结束
echo "语句1";
echo "语句2";
// 文件末尾的 PHP 结束标签可以省略(纯 PHP 文件推荐)
二、变量与数据类型
2.1 变量命名规则
ini
<?php
$variable = "合法变量";
$_private = "下划线开头";
$var123 = "包含数字";
$myVariable = "驼峰命名";
// ❌ 非法变量
// $123var = "数字开头";
// $my-var = "包含连字符";
// $my var = "包含空格";
规则总结:
- 以
$符号开头 - 变量名以字母或下划线开头
- 只能包含字母、数字、下划线
- 区分大小写
2.2 八种数据类型
php
<?php
// ─────────────────────────────────────────
// 标量类型(4 种)
// ─────────────────────────────────────────
// 1. 布尔型 (boolean)
$isActive = true;
$isDeleted = false;
// 2. 整型 (integer)
$age = 25;
$negative = -10;
$hex = 0x1A; // 十六进制
$octal = 0755; // 八进制
$binary = 0b1010; // 二进制(PHP 5.4+)
// 3. 浮点型 (float/double)
$price = 19.99;
$scientific = 1.2e3; // 1200
// 4. 字符串 (string)
$name = "John";
$greeting = 'Hello';
// ─────────────────────────────────────────
// 复合类型(2 种)
// ─────────────────────────────────────────
// 5. 数组 (array)
$colors = ['red', 'green', 'blue'];
$user = ['name' => 'John', 'age' => 25];
// 6. 对象 (object)
class Person {
public $name;
}
$person = new Person();
// ─────────────────────────────────────────
// 特殊类型(2 种)
// ─────────────────────────────────────────
// 7. NULL
$empty = null;
// 8. 资源 (resource)
$file = fopen('test.txt', 'r');
2.3 字符串的四种定义方式
php
<?php
$name = "World";
// 1. 单引号 - 不解析变量
echo 'Hello $name'; // 输出:Hello $name
// 2. 双引号 - 解析变量
echo "Hello $name"; // 输出:Hello World
// 3. Heredoc - 类似双引号
$text = <<<EOT
Hello $name
这是多行字符串
EOT;
// 4. Nowdoc - 类似单引号
$text = <<<'EOT'
Hello $name
变量不会被解析
EOT;
2.4 类型检查与转换
php
<?php
// 类型检查
$var = "123";
var_dump(is_string($var)); // true
var_dump(is_int($var)); // false
var_dump(is_numeric($var)); // true
// 获取类型
echo gettype($var); // string
// 强制类型转换
$int = (int) "123"; // 123
$float = (float) "3.14"; // 3.14
$bool = (bool) 1; // true
$str = (string) 100; // "100"
$array = (array) "item"; // ["item"]
// 类型转换函数
$int = intval("123");
$float = floatval("3.14");
$str = strval(100);
三、运算符大全
3.1 算术运算符
php
<?php
$a = 10;
$b = 3;
echo $a + $b; // 13 加法
echo $a - $b; // 7 减法
echo $a * $b; // 30 乘法
echo $a / $b; // 3.33 除法
echo $a % $b; // 1 取余
echo $a ** $b; // 1000 幂运算(PHP 5.6+)
echo ++$a; // 11 前置递增
echo $a--; // 11 后置递减
3.2 比较运算符
php
<?php
$a = 10;
$b = "10";
var_dump($a == $b); // true 等于(值相等)
var_dump($a === $b); // false 全等(值和类型都相等)
var_dump($a != $b); // false 不等于
var_dump($a !== $b); // true 不全等
var_dump($a > $b); // false 大于
var_dump($a < $b); // false 小于
var_dump($a >= $b); // true 大于等于
var_dump($a <= $b); // true 小于等于
// 太空船运算符(PHP 7+)
echo $a <=> $b; // 0 相等,-1 小于,1 大于
3.3 逻辑运算符
php
<?php
$a = true;
$b = false;
var_dump($a && $b); // false 与
var_dump($a || $b); // true 或
var_dump(!$a); // false 非
var_dump($a and $b); // false 与(低优先级)
var_dump($a or $b); // true 或(低优先级)
var_dump($a xor $b); // true 异或
3.4 字符串运算符
php
<?php
// 连接运算符
$firstName = "John";
$lastName = "Doe";
$fullName = $firstName . " " . $lastName; // "John Doe"
// 连接赋值
$message = "Hello";
$message .= " World"; // "Hello World"
3.5 数组运算符
php
<?php
$a = ['x' => 1, 'y' => 2];
$b = ['y' => 3, 'z' => 4];
$c = $a + $b; // ['x'=>1, 'y'=>2, 'z'=>4] 联合(保留左侧)
var_dump($a == $b); // false 相等(键值相同)
var_dump($a === $b); // false 全等(键值类型顺序都相同)
3.6 其他运算符
php
<?php
// 三元运算符
$age = 20;
$status = ($age >= 18) ? "成年" : "未成年";
// 简化三元(PHP 5.3+)
$name = $input ?: "默认值";
// 空合并运算符(PHP 7+)
$name = $input ?? "默认值";
// 空合并赋值(PHP 7.4+)
$data['name'] ??= "默认值";
// 错误抑制
$value = @$undefined; // 不产生警告
// 执行运算符
$output = `ls -la`; // 执行 shell 命令
四、控制结构
4.1 条件语句
php
<?php
// if - elseif - else
$score = 85;
if ($score >= 90) {
echo "优秀";
} elseif ($score >= 80) {
echo "良好";
} elseif ($score >= 60) {
echo "及格";
} else {
echo "不及格";
}
// switch 语句
$day = "Monday";
switch ($day) {
case "Monday":
echo "周一";
break;
case "Tuesday":
echo "周二";
break;
default:
echo "其他";
}
// match 表达式(PHP 8+)
$result = match($day) {
"Monday" => "周一",
"Tuesday" => "周二",
default => "其他"
};
4.2 循环结构
php
<?php
// for 循环
for ($i = 0; $i < 5; $i++) {
echo $i;
}
// while 循环
$i = 0;
while ($i < 5) {
echo $i;
$i++;
}
// do-while 循环
$i = 0;
do {
echo $i;
$i++;
} while ($i < 5);
// foreach 循环(数组遍历)
$colors = ['red', 'green', 'blue'];
foreach ($colors as $color) {
echo $color;
}
// 带键名的 foreach
$user = ['name' => 'John', 'age' => 25];
foreach ($user as $key => $value) {
echo "$key: $value";
}
// 引用遍历(可修改原数组)
foreach ($colors as &$color) {
$color = strtoupper($color);
}
4.3 循环控制
php
<?php
// break - 跳出循环
for ($i = 0; $i < 10; $i++) {
if ($i == 5) {
break; // 跳出整个循环
}
echo $i;
}
// continue - 跳过本次迭代
for ($i = 0; $i < 10; $i++) {
if ($i % 2 == 0) {
continue; // 跳过偶数
}
echo $i;
}
// goto(不推荐使用)
goto end;
echo "这行不会执行";
end:
echo "跳转到了这里";
五、函数详解
5.1 函数定义与调用
php
<?php
// 基本函数
function sayHello($name) {
return "Hello, $name!";
}
echo sayHello("World"); // Hello, World!
// 带默认参数
function greet($name = "Guest") {
return "Hello, $name!";
}
echo greet(); // Hello, Guest!
echo greet("Alice"); // Hello, Alice!
// 可变参数(PHP 5.6+)
function sum(...$numbers) {
return array_sum($numbers);
}
echo sum(1, 2, 3, 4); // 10
// 引用参数
function addOne(&$value) {
$value++;
}
$num = 5;
addOne($num);
echo $num; // 6
5.2 匿名函数与箭头函数
php
<?php
// 匿名函数
$greet = function($name) {
return "Hello, $name!";
};
echo $greet("World");
// use 导入外部变量
$message = "Hello";
$greet = function($name) use ($message) {
return "$message, $name!";
};
// 箭头函数(PHP 7.4+)
$multiply = fn($a, $b) => $a * $b;
echo $multiply(3, 4); // 12
// 箭头函数自动捕获外部变量
$factor = 2;
$double = fn($n) => $n * $factor;
echo $double(5); // 10
5.3 类型声明
php
<?php
// 参数类型声明
function add(int $a, int $b): int {
return $a + $b;
}
// 多种类型(PHP 8+)
function process(int|string $input): int|string {
return $input;
}
// 联合类型(PHP 8+)
function getId(): int|string {
return 123;
}
// 可空类型
function findUser(?int $id): ?array {
if ($id === null) {
return null;
}
return ['id' => $id];
}
// 严格模式
declare(strict_types=1);
function divide(float $a, float $b): float {
return $a / $b;
}
// divide(10, 2); // 严格模式下会报错
5.4 内置常用函数
scss
<?php
// 字符串函数
strlen("hello"); // 5
strtoupper("hello"); // "HELLO"
strtolower("HELLO"); // "hello"
substr("hello", 1, 3); // "ell"
str_replace("l", "x", "hello"); // "hexxo"
explode(",", "a,b,c"); // ["a", "b", "c"]
implode(",", ["a", "b", "c"]); // "a,b,c"
// 数组函数
count([1, 2, 3]); // 3
in_array(2, [1, 2, 3]); // true
array_push($arr, $item);
array_pop($arr);
array_merge($arr1, $arr2);
sort($arr);
ksort($arr);
// 数学函数
abs(-5); // 5
round(3.14); // 3
ceil(3.14); // 4
floor(3.14); // 3
rand(1, 100); // 随机数
max(1, 5, 3); // 5
min(1, 5, 3); // 1
// 日期时间
date("Y-m-d H:i:s"); // "2026-02-24 14:27:00"
time(); // 时间戳
strtotime("next Monday");
六、数组操作
6.1 数组创建
php
<?php
// 索引数组
$colors = ['red', 'green', 'blue'];
$colors = array('red', 'green', 'blue');
// 关联数组
$user = [
'name' => 'John',
'age' => 25,
'city' => 'New York'
];
// 多维数组
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
// 访问元素
echo $colors[0]; // red
echo $user['name']; // John
echo $matrix[1][2]; // 6
6.2 常用数组操作
php
<?php
$arr = [1, 2, 3, 4, 5];
// 添加元素
array_push($arr, 6); // 末尾添加
$arr[] = 7; // 末尾添加(推荐)
array_unshift($arr, 0); // 开头添加
// 删除元素
array_pop($arr); // 删除末尾
array_shift($arr); // 删除开头
unset($arr[2]); // 删除指定键
// 数组信息
count($arr); // 元素个数
in_array(3, $arr); // 是否存在
array_key_exists('name', $user); // 键是否存在
// 数组转换
$keys = array_keys($user); // 获取所有键
$values = array_values($user); // 获取所有值
$list = implode(',', $arr); // 转字符串
$arr = explode(',', $list); // 字符串转数组
// 数组处理
$ doubled = array_map(fn($n) => $n * 2, $arr);
$filtered = array_filter($arr, fn($n) => $n > 2);
$sum = array_reduce($arr, fn($carry, $n) => $carry + $n, 0);
七、面向对象编程
7.1 类与对象
php
<?php
class Person {
// 属性
public $name;
protected $age;
private $password;
// 静态属性
public static $count = 0;
// 构造函数
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
self::$count++;
}
// 析构函数
public function __destruct() {
self::$count--;
}
// 方法
public function sayHello() {
return "Hello, I'm $this->name";
}
// 静态方法
public static function getCount() {
return self::$count;
}
// Getter/Setter
public function getAge() {
return $this->age;
}
public function setAge($age) {
if ($age > 0) {
$this->age = $age;
}
}
}
// 使用类
$person = new Person("John", 25);
echo $person->sayHello();
echo Person::getCount();
7.2 继承与多态
php
<?php
// 父类
class Animal {
protected $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
return "Some sound";
}
}
// 子类
class Dog extends Animal {
public function speak() {
return "Woof!";
}
public function fetch() {
return "$this->name is fetching";
}
}
// 使用
$dog = new Dog("Buddy");
echo $dog->speak(); // Woof!
echo $dog->fetch(); // Buddy is fetching
7.3 抽象类与接口
php
<?php
// 抽象类
abstract class Shape {
abstract public function area();
public function describe() {
return "This is a shape";
}
}
class Circle extends Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function area() {
return pi() * $this->radius ** 2;
}
}
// 接口
interface Flyable {
public function fly();
}
interface Swimmable {
public function swim();
}
// 实现多个接口
class Duck implements Flyable, Swimmable {
public function fly() {
return "Flying...";
}
public function swim() {
return "Swimming...";
}
}
7.4 特性(Traits)
php
<?php
// Trait - 代码复用机制
trait Loggable {
public function log($message) {
echo "[LOG] $message";
}
}
trait Timestampable {
public function getTimestamp() {
return time();
}
}
class User {
use Loggable, Timestampable;
public function create() {
$this->log("User created at " . $this->getTimestamp());
}
}
$user = new User();
$user->create();
八、错误与异常处理
8.1 错误处理
php
<?php
// 错误报告级别
error_reporting(E_ALL);
ini_set('display_errors', 1);
// 自定义错误处理
set_error_handler(function($errno, $errstr, $errfile, $errline) {
echo "Error: [$errno] $errstr in $errfile on line $errline";
});
// 触发错误
trigger_error("Custom error", E_USER_WARNING);
8.2 异常处理
php
<?php
// 基本异常处理
try {
$result = 10 / 0;
if ($result === false) {
throw new Exception("Division failed");
}
} catch (Exception $e) {
echo "Caught: " . $e->getMessage();
} finally {
echo "Always executed";
}
// 自定义异常
class ValidationException extends Exception {
private $field;
public function __construct($field, $message) {
$this->field = $field;
parent::__construct($message);
}
public function getField() {
return $this->field;
}
}
// 多个 catch(PHP 7.1+)
try {
// 可能抛出多种异常
} catch (ValidationException | InvalidArgumentException $e) {
echo $e->getMessage();
}
// PHP 8+ 非捕获异常
try {
// 代码
} catch (Exception $e) {
// 可以不留空 catch 块
}
九、命名空间与自动加载
9.1 命名空间
php
<?php
// 定义命名空间
namespace App\Models;
class User {
public function getName() {
return "John";
}
}
// 使用命名空间
namespace App\Controllers;
use App\Models\User;
use App\Models\User as UserModel;
$user = new User();
$user = new UserModel();
// 全局命名空间
$dt = new \DateTime();
9.2 Composer 自动加载
swift
// composer.json
{
"autoload": {
"psr-4": {
"App\": "src/"
}
}
}
php
<?php
// 引入自动加载
require 'vendor/autoload.php';
// 类会自动加载
$user = new App\Models\User();
十、最佳实践
10.1 代码规范
php
<?php
// ✅ 推荐
class UserController
{
public function index(): array
{
$users = $this->userRepository->findAll();
return [
'success' => true,
'data' => $users
];
}
}
// ❌ 避免
class userController{public function index(){
$users=$this->userRepository->findAll();return['success'=>true,'data'=>$users];}}
10.2 安全要点
php
<?php
// ✅ SQL 防注入 - 使用预处理
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
// ❌ 危险 - 直接拼接 SQL
$sql = "SELECT * FROM users WHERE id = $id";
// ✅ XSS 防护
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// ✅ 密码处理
$hash = password_hash($password, PASSWORD_DEFAULT);
$valid = password_verify($password, $hash);
// ❌ 危险 - 明文存储密码
10.3 性能优化
php
<?php
// ✅ 预分配数组大小
$result = [];
for ($i = 0; $i < 1000; $i++) {
$result[$i] = $i * 2;
}
// ✅ 使用单引号(不解析变量时)
$str = 'static string';
// ✅ 避免在循环中查询数据库
$ids = [1, 2, 3, 4, 5];
$users = $db->query("SELECT * FROM users WHERE id IN (" . implode(',', $ids) . ")");
// ❌ 避免 N+1 查询
foreach ($ids as $id) {
$user = $db->query("SELECT * FROM users WHERE id = $id");
}
附录:快速参考表
php
┌─────────────────────────────────────────────────────────┐
│ PHP 语法速查表 │
├─────────────────────────────────────────────────────────┤
│ 变量 $var, $array['key'], $obj->prop │
│ 常量 define('NAME', 'value'), const NAME = '' │
│ 输出 echo, print, var_dump, print_r │
│ 注释 //, #, /* */ │
│ 包含 include, require, include_once, require_once│
│ 超全局 $_GET, $_POST, $_SESSION, $_COOKIE │
│ $_SERVER, $_FILES, $_REQUEST, $GLOBALS │
│ 文件操作 fopen, fread, fwrite, fclose, file_get_contents│
│ 数据库 PDO, mysqli │
│ 会话 session_start, $_SESSION │
│ Cookie setcookie, $_COOKIE │
│ 正则 preg_match, preg_replace │
│ JSON json_encode, json_decode │
└─────────────────────────────────────────────────────────┘