PHP 入门指南:从零基础到掌握核心语法

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                   │
└─────────────────────────────────────────────────────────┘
相关推荐
却尘1 小时前
一个 ERR_SSL_PROTOCOL_ERROR 让我们排查了三层问题,最后发现根本不是 SSL 的锅
前端·后端·网络协议
yhyyht2 小时前
Apache Camel 框架入门记录(二)
后端
paterWang2 小时前
基于SpringBoot+Vue的鞋类商品购物商城系统的设计与实现
vue.js·spring boot·后端
paterWang2 小时前
基于SpringBoot的商铺共享点评系统的设计与实现
spring boot·后端
嘻哈baby2 小时前
Tomcat 与 Nginx、Apache 的区别是什么?
后端
祈安_2 小时前
深入理解指针(七)
c语言·后端
ServBay3 小时前
彻底重绘Spring Boot性能版图,资源占用缩减80%
java·spring boot·后端
序安InToo3 小时前
第3课|第一个Ada程序:Hello World深入解析
后端·操作系统·嵌入式
Java编程爱好者3 小时前
为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解??
后端