class Person { public $name; public function __construct($name) { $this->name = $name; } public function greet() { return "Hello, my name is {$this->name}"; }}$person = new Person("Alice");echo $person->greet(); // Hello, my name is Alice
封装
数据隐藏: 限制对对象内部状态的直接访问
接口暴露: 提供公共方法来操作对象
PHP通过访问修饰符实现封装:
public: 任何地方可访问
protected: 类内部和子类中可访问
private: 仅在类内部可访问
class BankAccount { private $balance = 0; public function deposit($amount) { if ($amount > 0) { $this->balance += $amount; } } public function getBalance() { return $this->balance; }}$account = new BankAccount();$account->deposit(100);echo $account->getBalance(); // 100// echo $account->balance; // 报错: 无法访问私有属性
继承(Inheritance)
继承允许新类(子类)获取现有类(父类)的属性和方法,并可以扩展或修改它们。
继承类型:
单继承(PHP只支持单继承)
多级继承
class Animal { protected $name; public function __construct($name) { $this->name = $name; } public function eat() { return "{$this->name} is eating"; }}class Dog extends Animal { public function bark() { return "{$this->name} says woof!"; }}$dog = new Dog("Buddy");echo $dog->eat(); // Buddy is eatingecho $dog->bark(); // Buddy says woof!
多态(Polymorphism)
多态允许不同类的对象对相同消息(方法调用)做出不同响应。
实现方式:
方法重写(Override)
接口实现
interface Shape { public function area();}class Circle implements Shape { private $radius; public function __construct($radius) { $this->radius = $radius; } public function area() { return pi() * pow($this->radius, 2); }}class Square implements Shape { private $side; public function __construct($side) { $this->side = $side; } public function area() { return pow($this->side, 2); }}function printArea(Shape $shape) { echo "Area: " . $shape->area() . "\n";}printArea(new Circle(5)); // Area: 78.539816339745printArea(new Square(4)); // Area: 16
抽象类
抽象类是不能实例化的类,用于定义子类必须实现的接口。
abstract class Vehicle { abstract public function startEngine(); public function stopEngine() { return "Engine stopped"; }}class Car extends Vehicle { public function startEngine() { return "Car engine started"; }}$car = new Car();echo $car->startEngine(); // Car engine startedecho $car->stopEngine(); // Engine stopped
接口
接口定义了一组方法规范,类可以实现多个接口。
interface Logger { public function log($message);}interface Notifier { public function sendNotification($message);}class FileLogger implements Logger { public function log($message) { file_put_contents('log.txt', $message, FILE_APPEND); }}class EmailNotifier implements Logger, Notifier { public function log($message) { // 记录日志 } public function sendNotification($message) { // 发送邮件 }}
魔术方法
__construct() 对象创建时
__destruct() 对象销毁时
__get() 访问不可访问属性时
__set() 设置不可访问属性时
__call() 调用不可访问方法时
__toString() 对象被当作字符串使用时
class Magic { private $data = []; public function __set($name, $value) { $this->data[$name] = $value; } public function __get($name) { return $this->data[$name] ?? null; } public function __toString() { return json_encode($this->data); }}$magic = new Magic();$magic->property = 'value';echo $magic; // {"property":"value"}
特质(Trait)
PHP使用特质(Trait)解决单继承限制,允许代码复用。
trait Loggable { public function log($message) { echo "[LOG] {$message}\n"; }}trait Timestampable { public function timestamp() { return date('Y-m-d H:i:s'); }}class Order { use Loggable, Timestampable; public function process() { $this->log("Order processed at " . $this->timestamp()); }}$order = new Order();$order->process();
类型声明
PHP7+增强了类型声明支持:
class Calculator { public function add(float $a, float $b): float { return $a + $b; } public function concat(string ...$strings): string { return implode(' ', $strings); }}$calc = new Calculator();echo $calc->add(1.5, 2.5); // 4.0echo $calc->concat("Hello", "world"); // Hello world
依赖注入(DI)
依赖注入是一种实现控制反转(IoC)的技术,减少类之间的直接依赖。
interface Database { public function query($sql);}class MySQLDatabase implements Database { public function query($sql) { echo "Executing MySQL query: {$sql}\n"; }}class UserRepository { private $db; public function __construct(Database $db) { $this->db = $db; } public function getUsers() { return $this->db->query("SELECT * FROM users"); }}$db = new MySQLDatabase();$userRepo = new UserRepository($db);$userRepo->getUsers();
匿名类
$logger = new class { public function log(string $msg): void { echo "[LOG] $msg\n"; }};$logger->log('hello');
接口和抽象类的区别
对比项
接口(Interface);
抽象类(Abstract Class)
定义关键字
interface
abstract class
方法实现
所有方法必须为抽象方法(无实现体)
可包含抽象方法(无实现体)和具体方法(有实现体)
属性/成员变量
仅能定义常量(public static final)
可定义普通属性、静态属性和常量,支持多种访问修饰符
继承/实现方式
类通过implements实现多个接口
类通过extends继承单个抽象类
构造方法
不允许定义构造方法
可定义构造方法(用于子类初始化)
方法访问修饰符
所有方法默认为public
支持public、protected、private
多继承支持
支持(一个类可实现多个接口)
不支持(PHP为单继承)
设计目的
强调行为契约(“能做什么”)
<?php// 接口定义示例interface AnimalInterface { const TYPE = '生物'; // 常量 public function makeSound(); // 抽象方法 public function eat(string $food); // 抽象方法}// 抽象类定义示例abstract class AnimalAbstract { protected $name; // 成员属性 public function __construct(string $name) { // 构造方法 $this->name = $name; } abstract public function run(); // 抽象方法 public function sleep() { // 具体方法 echo "{$this->name}正在睡觉...\n"; }}// 实现接口和继承抽象类class Dog extends AnimalAbstract implements AnimalInterface { public function makeSound() { echo "汪汪!\n"; } public function eat(string $food) { echo "吃{$food}\n"; } public function run() { echo "{$this->name}快速奔跑\n"; }}// 使用示例$dog = new Dog('阿黄');$dog->makeSound(); // 输出: 汪汪!$dog->eat('骨头'); // 输出: 吃骨头$dog->sleep(); // 输出: 阿黄正在睡觉...$dog->run(); // 输出: 阿黄快速奔跑?>
trait Greeting { public function sayHello() { echo "Hello!\n"; }}class User { use Greeting;}$user = new User();$user->sayHello(); // 输出:Hello!
interface 接口中的方法不能有具体实现,只能定义方法的签名(方法名、参数和返回值类型)。
interface Animal { public function makeSound(): string;}class Dog implements Animal { public function makeSound(): string { return "Bark"; }}class Cat implements Animal { public function makeSound(): string { return "Meow"; }}
class UserService { private $userRepository; public function __construct(UserRepository $userRepository) { $this->userRepository = $userRepository; } public function getUser($id) { return $this->userRepository->find($id); }}
方法注入
class ReportGenerator { public function generate(ExportFormatter $formatter, $data) { return $formatter->format($data); }}// 使用示例$generator = new ReportGenerator();$generator->generate(app(ExcelFormatter::class), $data);
接口/契约注入
interface LoggerInterface { public function log($message);}class FileLogger implements LoggerInterface { public function log($message) { file_put_contents('app.log', $message, FILE_APPEND); }}// 绑定接口到实现$this->app->bind(LoggerInterface::class, FileLogger::class);// 使用class OrderProcessor { public function __construct(LoggerInterface $logger) { $this->logger = $logger; }}