ZetCode

PHP 类关键词

最后修改于 2025 年 4 月 16 日

PHP class 关键词是面向对象编程的基础。它定义了一个蓝图,用于创建具有属性和方法的对象。类将数据和行为封装到可重用的组件中。它们构成了 PHP 中 OOP 的基础。

基本定义

一个 class 是用于创建对象的模板。它定义了对象将拥有的属性(变量)和方法(函数)。类促进代码的可重用性和组织性。

一个 object 是使用 new 关键词创建的类的实例。每个对象都有自己的一组属性值。对象可以通过它们的方法进行交互。

语法:class ClassName { properties methods }。类名通常采用 PascalCase 命名法。属性和方法可以具有可见性修饰符(public, protected, private)。

基本类定义

此示例演示了一个具有属性和方法的简单类。

basic_class.php
<?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 方法。

constructor.php
<?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 关键词的类继承。

inheritance.php
<?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 可见性在实际应用中的情况。

visibility.php
<?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 关键词的静态类成员。

static.php
<?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 关键词引用当前类。静态属性在所有实例中都保留其值。它们对于类级别的的数据和实用程序很有用。

抽象类

此示例显示了不能直接实例化的抽象类。

abstract.php
<?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 关键词实现接口。

interface.php
<?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 OOP 文档

本教程通过实际示例介绍了 PHP 类,展示了基本用法、继承、可见性、静态成员、抽象类和接口。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 PHP 教程