PHP 面向对象
PHP 面向对象(OOP)中文讲解
什么是 PHP 面向对象编程?
面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,通过将数据和操作封装为“对象”来组织代码。PHP 提供了强大的面向对象支持,允许开发者使用类、对象、继承、封装、多态等特性来构建模块化、可维护的代码。PHP 的 OOP 特性从 PHP 4 开始引入,并在 PHP 5 和后续版本中得到显著增强,广泛应用于现代框架如 Laravel、Symfony 等。
核心概念
- 类(Class):类是对象的蓝图,定义了对象的属性(数据)和方法(行为)。
- 对象(Object):类的实例,通过
new
关键字创建。 - 封装(Encapsulation):通过访问修饰符(如
public
、protected
、private
)控制属性和方法的访问权限,隐藏实现细节。 - 继承(Inheritance):子类继承父类的属性和方法,支持代码复用。
- 多态(Polymorphism):通过接口或抽象类实现不同类以统一方式调用方法。
- 抽象(Abstraction):通过抽象类或接口隐藏复杂实现,提供简化的调用方式。
基本语法
- 定义类
<?php class Car { // 属性 public $brand; private $price; // 构造函数 public function __construct($brand, $price) { $this->brand = $brand; $this->price = $price; } // 方法 public function getInfo() { return "Brand: {$this->brand}, Price: {$this->price}"; } } ?>
class
定义类,public
、private
是访问修饰符。$this
指代当前对象,用于访问属性和方法。__construct
是构造函数,对象创建时自动调用。
- 创建对象
<?php $car = new Car("Toyota", 20000); echo $car->getInfo(); // 输出:Brand: Toyota, Price: 20000 ?>
- 访问修饰符
public
:属性或方法可被外部访问。protected
:仅类本身及其子类可访问。private
:仅类本身可访问。
<?php class Car { private $price = 20000; public function getPrice() { return $this->price; } } $car = new Car(); // echo $car->price; // 错误:无法访问私有属性 echo $car->getPrice(); // 输出:20000 ?>
继承
继承通过 extends
关键字实现,子类可以复用父类的属性和方法,并可重写(override)方法:
<?php
class Vehicle {
protected $type = "Vehicle";
public function getType() {
return $this->type;
}
}
class Car extends Vehicle {
protected $type = "Car";
public function getInfo() {
return "Type: " . $this->getType();
}
}
$car = new Car();
echo $car->getInfo(); // 输出:Type: Car
?>
- 子类
Car
继承Vehicle
,重写了$type
属性。
抽象类与接口
- 抽象类(Abstract Class)
抽象类不能直接实例化,需通过子类实现抽象方法:<?php abstract class Animal { abstract public function makeSound(); public function eat() { return "Eating..."; } } class Dog extends Animal { public function makeSound() { return "Woof!"; } } $dog = new Dog(); echo $dog->makeSound(); // 输出:Woof! echo $dog->eat(); // 输出:Eating... ?>
- 接口(Interface)
接口定义方法签名,类通过implements
实现:<?php interface Drivable { public function drive(); } class Car implements Drivable { public function drive() { return "Car is driving!"; } } $car = new Car(); echo $car->drive(); // 输出:Car is driving! ?>
- 接口支持多实现,弥补 PHP 单继承的限制。
Trait
Trait 是 PHP 5.4 引入的代码复用机制,允许在多个类中共享方法:
<?php
trait Logger {
public function log($message) {
echo "Log: $message";
}
}
class User {
use Logger;
public function create() {
$this->log("User created");
}
}
$user = new User();
$user->create(); // 输出:Log: User created
?>
- Trait 避免了继承的复杂性,适合横向复用。
魔术方法
PHP 提供了一些以 __
开头的魔术方法,自动在特定场景触发:
__construct()
:构造函数。__destruct()
:析构函数,对象销毁时调用。__get($name)
:访问不存在或不可访问的属性时调用。__set($name, $value)
:设置不存在或不可访问的属性时调用。__toString()
:对象被当做字符串时调用。
<?php
class Product {
private $data = [];
public function __set($name, $value) {
$this->data[$name] = $value;
}
public function __get($name) {
return $this->data[$name] ?? null;
}
public function __toString() {
return "Product Object";
}
}
$product = new Product();
$product->name = "Laptop"; // 调用 __set
echo $product->name; // 调用 __get,输出:Laptop
echo $product; // 调用 __toString,输出:Product Object
?>
命名空间与 OOP
命名空间常与 OOP 结合使用,避免类名冲突:
<?php
namespace App\Models;
class User {
public function getName() {
return "User from App\Models";
}
}
namespace App\Controllers;
use App\Models\User;
class UserController {
public function index() {
$user = new User();
return $user->getName();
}
}
$controller = new UserController();
echo $controller->index(); // 输出:User from App\Models
?>
最佳实践
- 单一职责原则:一个类只负责一个功能,保持代码模块化。
- 使用命名空间:结合 PSR-4 规范组织类,配合 Composer 自动加载。
- 访问控制:优先使用
private
或protected
,通过公共方法暴露必要功能。 - 类型声明:在 PHP 7+ 中使用类型声明(如
string
、int
)提高代码健壮性:<?php class User { public function setAge(int $age): void { $this->age = $age; } } ?>
- 异常处理:在类中使用
throw new Exception()
处理错误。 - 遵循 PSR 标准:如 PSR-12(代码风格)、PSR-4(自动加载)。
常见问题与解决方案
- 方法重写问题:子类重写父类方法时,需保持方法签名一致,否则可能引发错误。
- 私有属性继承:
private
属性无法被子类直接访问,需通过公共或受保护方法访问。 - 性能优化:避免在类中过度使用魔术方法(如
__get
、__set
),因其性能开销较高。
参考资源
- PHP 官方手册 – 面向对象:详细技术说明。
- 菜鸟教程 – PHP 面向对象:适合初学者的简明讲解。
- PSR-12 代码风格规范:PHP 代码规范。
总结
PHP 面向对象编程通过类、对象、继承、抽象等特性,提供了强大的工具来构建模块化、可扩展的应用。结合命名空间、Trait 和魔术方法,开发者可以编写清晰、健壮的代码。无论是开发小型脚本还是大型框架,掌握 PHP OOP 都是提升代码质量和效率的关键。