PHP 面向对象语法入门教程
面向对象编程(Object-Oriented Programming, OOP)是一种流行的编程范式,它允许开发者将代码组织成“对象”,这些对象包含数据以及可以对这些数据执行的操作。PHP 从版本5开始全面支持面向对象编程,并且在后续的版本中持续增强了这方面的功能。本教程旨在为初学者提供一个清晰、易懂的指南,帮助大家理解并使用 PHP 的面向对象语法。
一、类与对象
在 PHP 中,“类”是定义一种类型的蓝图或模板,而“对象”则是基于这个蓝图创建的具体实例。类描述了该类型的所有属性和方法;对象则代表了现实世界中的实体或概念,并通过调用类中定义的方法来完成特定任务。
-
定义一个简单的类。
php深色版本1class Car { 2 public $brand; 3 public $color; 4 5 function __construct($brand, $color) { 6 $this->brand = $brand; 7 $this->color = $color; 8 } 9 10 public function displayInfo() { 11 echo "This car is a {$this->color} {$this->brand}."; 12 } 13}
-
创建对象。
- 使用
new
关键字根据类创建对象。
php深色版本1$myCar = new Car("Toyota", "Blue");
- 使用
-
访问对象属性。
- 可以直接通过
->
操作符访问对象的公共属性。
php深色版本1echo $myCar->brand; // 输出 Toyota
- 可以直接通过
-
调用对象方法。
- 同样地,也可以通过
->
操作符调用对象的方法。
php深色版本1$myCar->displayInfo(); // 输出 This car is a Blue Toyota.
- 同样地,也可以通过
二、构造函数与析构函数
构造函数 (__construct
) 在对象被创建时自动调用,用于初始化新创建的对象的状态。相反地,析构函数 (__destruct
) 则是在对象即将被销毁前执行清理工作的地方。
- 构造函数示例已见于上文。
- 定义析构函数。
php深色版本
1class Car { 2 //...其他代码... 3 function __destruct() { 4 echo "The car object has been destroyed."; 5 } 6}
- 观察析构函数的作用。
- 当脚本结束或者对象不再被引用时触发。
php深色版本1$myCar = new Car("Honda", "Red"); 2unset($myCar); // 手动释放对象,触发析构函数
三、继承
继承允许我们基于另一个类来定义一个新的类,这样新的类就拥有了原有类的所有属性和方法。这有助于提高代码重用性和可维护性。
-
创建基类。
php深色版本1class Vehicle { 2 protected $type; 3 4 function setType($type) { 5 $this->type = $type; 6 } 7 8 function getType() { 9 return $this->type; 10 } 11}
-
通过关键字
extends
来派生子类。php深色版本1class Car extends Vehicle { 2 private $model; 3 4 function setModel($model) { 5 $this->model = $model; 6 } 7 8 function getModel() { 9 return $this->model; 10 } 11}
-
使用子类。
php深色版本1$electricCar = new Car(); 2$electricCar->setType("Electric"); 3$electricCar->setModel("Tesla Model S"); 4 5echo $electricCar->getType(); // 输出 Electric 6echo $electricCar->getModel(); // 输出 Tesla Model S
四、封装
封装是指将数据(属性)隐藏起来,只对外公开有限的接口(方法)。这样做的好处是可以防止外部直接修改内部状态,保证数据的安全性和完整性。
-
将属性设为私有或受保护。
php深色版本1class BankAccount { 2 private $balance = 0; 3 4 public function deposit($amount) { 5 if ($amount > 0) { 6 $this->balance += $amount; 7 } 8 } 9 10 public function getBalance() { 11 return $this->balance; 12 } 13}
-
通过公有方法间接访问私有属性。
php深色版本1$account = new BankAccount(); 2$account->deposit(500); 3echo $account->getBalance(); // 正确输出余额 4// 不能直接修改私有属性: $account->balance = 1000; // 错误
五、多态
多态意味着不同类的对象可以通过相同的接口名调用相同的方法,但表现出不同的行为。这是实现抽象层次设计的关键技术之一。
-
基类中声明一个方法作为接口。
php深色版本1abstract class Animal { 2 abstract public function makeSound(); 3}
-
子类各自实现自己的版本。
php深色版本1class Dog extends Animal { 2 public function makeSound() { 3 return "Woof!"; 4 } 5} 6 7class Cat extends Animal { 8 public function makeSound() { 9 return "Meow~"; 10 } 11}
-
多态的实际应用。
php深色版本1$animals = [new Dog(), new Cat()]; 2foreach ($animals as $animal) { 3 echo $animal->makeSound() . "\n"; // 分别输出 Woof! 和 Meow~ 4}
六、静态成员
静态成员属于类本身而不是某个具体的对象实例。这意味着即使没有创建任何对象,也能直接通过类名访问到这些成员。
-
定义静态属性。
php深色版本1class Counter { 2 public static $count = 0; 3 4 public function incrementCount() { 5 self::$count++; 6 } 7}
-
直接使用类名访问静态成员。
php深色版本1Counter::incrementCount(); 2echo Counter::$count; // 输出 1
通过上述几个部分的学习,你应该已经掌握了 PHP 中基本的面向对象编程技巧。当然,OOP 还有很多更深入的概念和技术等待你去探索,比如接口、特性等高级主题。希望这份入门指南能够为你开启进一步学习的大门!