PHP 类关键词
最后修改于 2025 年 4 月 16 日
PHP class 关键词是面向对象编程的基础。它定义了一个蓝图,用于创建具有属性和方法的对象。类将数据和行为封装到可重用的组件中。它们构成了 PHP 中 OOP 的基础。
基本定义
一个 class 是用于创建对象的模板。它定义了对象将拥有的属性(变量)和方法(函数)。类促进代码的可重用性和组织性。
一个 object 是使用 new 关键词创建的类的实例。每个对象都有自己的一组属性值。对象可以通过它们的方法进行交互。
语法:class ClassName { properties methods }。类名通常采用 PascalCase 命名法。属性和方法可以具有可见性修饰符(public, protected, private)。
基本类定义
此示例演示了一个具有属性和方法的简单类。
<?php
declare(strict_types=1);
class Car {
public string $model;
public string $color;
public function startEngine(): void {
echo "Engine started for {$this->color} {$this->model}";
}
}
$myCar = new Car();
$myCar->model = "Toyota";
$myCar->color = "red";
$myCar->startEngine();
该代码定义了一个 Car 类,具有两个属性和一个方法。我们使用 new 创建一个实例并设置其属性。 $this 关键词引用当前对象实例。这展示了基本类的用法。
构造函数方法
此示例显示了如何使用 __construct 方法。
<?php
declare(strict_types=1);
class Person {
public string $name;
public int $age;
public function __construct(string $name, int $age) {
$this->name = $name;
$this->age = $age;
}
public function introduce(): void {
echo "Hi, I'm {$this->name} and I'm {$this->age} years old.";
}
}
$person = new Person("Alice", 30);
$person->introduce();
创建对象时,构造函数会自动调用。它使用提供的值初始化对象属性。这消除了单独分配属性的需要。构造函数确保对象从有效状态开始。
继承
此示例演示了使用 extends 关键词的类继承。
<?php
declare(strict_types=1);
class Animal {
public string $name;
public function __construct(string $name) {
$this->name = $name;
}
public function makeSound(): void {
echo "Some generic animal sound";
}
}
class Dog extends Animal {
public function makeSound(): void {
echo "{$this->name} says: Woof!";
}
}
$dog = new Dog("Buddy");
$dog->makeSound();
Dog 类继承自 Animal 并重写其 makeSound 方法。子类自动获得父类的属性和方法。继承实现代码重用和多态性。子类可以扩展或修改父类的行为。
可见性修饰符
此示例展示了 public、protected 和 private 可见性在实际应用中的情况。
<?php
declare(strict_types=1);
class BankAccount {
public string $owner;
protected float $balance = 0;
private string $accountNumber;
public function __construct(string $owner, string $accountNumber) {
$this->owner = $owner;
$this->accountNumber = $accountNumber;
}
public function deposit(float $amount): void {
$this->balance += $amount;
}
public function getBalance(): float {
return $this->balance;
}
}
$account = new BankAccount("John Doe", "123456789");
$account->deposit(1000);
echo "Balance: " . $account->getBalance();
Public 成员可以在任何地方访问,protected 成员只能在类及其子类中访问,private 成员只能在类中访问。这通过隐藏内部细节来实现封装。余额只能通过定义的方法进行修改。可见性控制对类成员的访问。
静态属性和方法
此示例演示了使用 static 关键词的静态类成员。
<?php
declare(strict_types=1);
class Counter {
public static int $count = 0;
public static function increment(): void {
self::$count++;
}
public static function getCount(): int {
return self::$count;
}
}
Counter::increment();
Counter::increment();
echo "Count: " . Counter::getCount();
静态成员属于类而不是实例。它们使用 :: 而不是 -> 访问。self 关键词引用当前类。静态属性在所有实例中都保留其值。它们对于类级别的的数据和实用程序很有用。
抽象类
此示例显示了不能直接实例化的抽象类。
<?php
declare(strict_types=1);
abstract class Shape {
abstract public function area(): float;
public function describe(): string {
return "This shape has an area of " . $this->area();
}
}
class Circle extends Shape {
private float $radius;
public function __construct(float $radius) {
$this->radius = $radius;
}
public function area(): float {
return pi() * pow($this->radius, 2);
}
}
$circle = new Circle(5);
echo $circle->describe();
抽象类不能被实例化,并且可能包含抽象方法。子类必须实现所有抽象方法。它们为相关类提供通用接口。这强制在子类之间实现一致的行为,同时允许实现细节有所不同。
接口
此示例演示了使用 implements 关键词实现接口。
<?php
declare(strict_types=1);
interface Logger {
public function log(string $message): void;
}
class FileLogger implements Logger {
public function log(string $message): void {
file_put_contents('log.txt', $message . PHP_EOL, FILE_APPEND);
}
}
$logger = new FileLogger();
$logger->log("This is a test message");
接口定义没有实现的函数签名。类可以实现多个接口。它们提供了实现类必须遵循的契约。接口通过允许不同的类可以互换使用来实现多态性。它们对于依赖注入至关重要。
最佳实践
- 单一职责:每个类都应该有一个明确的目的。
- 封装:使用适当的可见性隐藏内部细节。
- 组合:偏向对象组合而非继承。
- 类型提示:将它们用于方法参数和返回类型。
- 文档:使用注释记录类的目的和用法。
来源
本教程通过实际示例介绍了 PHP 类,展示了基本用法、继承、可见性、静态成员、抽象类和接口。
作者
列出 所有 PHP 教程。