从一段重复代码说起

假设你要在网页里展示几本书的信息,用散落的变量加函数也能做,但每加一本书就要多写一遍变量,数据一多就乱。面向对象的思路是把「书」的属性和操作打包成一个模板——类,再用模板批量生成对象,代码更整齐也更好维护。

定义一个类

用 class 关键字定义类,里面声明属性和方法:

<?php
class Book {
    public $title;   // 书名
    public $price;   // 价格
}
?>

类里的 $title 和 $price 叫属性,前面的 public 表示外部代码可以访问。类只是一个模板,本身不装数据,要 new 一个对象出来才有内容。

创建对象并访问属性

<?php
$book = new Book();
$book->title = 'PHP 入门教程';
$book->price = 39.9;

echo $book->title;   // 输出:PHP 入门教程
echo $book->price;   // 输出:39.9

注意 PHP 用箭头符号 -> 访问对象的属性和方法,它和数组里的 => 长得像但完全是两回事,新手很容易混。

给类添加方法

方法就是写在类里的函数,用来描述对象能做什么:

<?php
class Book {
    public $title;
    public $price;

    public function intro() {
        return '《' . $this->title . '》售价 ' . $this->price . ' 元';
    }
}

$book = new Book();
$book->title = 'PHP 从入门到实践';
$book->price = 59.9;

echo $book->intro();   // 输出:《PHP 从入门到实践》售价 59.9 元

方法里用 $this 指代「当前这个对象」,$this->title 就是这个对象自己的书名。

构造函数:创建时自动初始化

每次 new 完都要手动给属性赋值,很麻烦。构造函数 __construct 会在创建对象的那一刻自动执行:

<?php
class Book {
    public $title;
    public $price;

    public function __construct($title, $price) {
        $this->title = $title;
        $this->price = $price;
    }

    public function intro() {
        return '《' . $this->title . '》售价 ' . $this->price . ' 元';
    }
}

$book = new Book('PHP 核心技术', 45.0);
echo $book->intro();   // 输出:《PHP 核心技术》售价 45 元

一行 new 同时完成创建和赋值,对象一多时特别省事。

用 private 保护属性

属性随便改容易出 bug,可以把它设为 private,只允许类内部的方法碰它:

<?php
class Wallet {
    private $money = 100;

    public function pay($amount) {
        if ($amount > $this->money) {
            return '余额不足';
        }
        $this->money -= $amount;
        return '支付成功,余额 ' . $this->money;
    }
}

$wallet = new Wallet();
echo $wallet->pay(30);    // 输出:支付成功,余额 70
// echo $wallet->money;   // 报错:private 属性外部不能直接访问

外部想动余额只能走 pay 方法,方法里可以加校验,数据就安全多了。

小结

这篇我们掌握了 PHP 面向对象的入门内容:用 class 定义类,new 创建对象,-> 访问属性和方法,$this 指代当前对象,__construct 自动初始化,private 配合方法保护数据。把属性和方法打包成类,是写出结构清晰的 PHP 代码的第一步,后面还可以继续学继承与接口,让类复用得更彻底。