从一段重复代码说起
假设你要在网页里展示几本书的信息,用散落的变量加函数也能做,但每加一本书就要多写一遍变量,数据一多就乱。面向对象的思路是把「书」的属性和操作打包成一个模板——类,再用模板批量生成对象,代码更整齐也更好维护。
定义一个类
用 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 代码的第一步,后面还可以继续学继承与接口,让类复用得更彻底。

