Menu
CoddyTech

静态方法和属性

本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 17 课,共 91 课。

和属性可以是静态的一样,方法也可以属于类本身,而不是单个对象。静态方法可以直接通过类调用,无需先创建实例。

你可以使用 static 关键字声明静态方法,并使用类名和 :: 运算符调用它:

<?php
class MathHelper {
    public static function add($a, $b) {
        return $a + $b;
    }
    
    public static function multiply($a, $b) {
        return $a * $b;
    }
}

echo MathHelper::add(5, 3) . "\n";
echo MathHelper::multiply(4, 2);

输出:

8
8

静态方法适合与静态属性搭配使用。一种常见模式是使用静态方法来管理共享的类数据:

<?php
class Counter {
    private static $count = 0;
    
    public static function increment() {
        self::$count++;
    }
    
    public static function getCount() {
        return self::$count;
    }
}

Counter::increment();
Counter::increment();
echo Counter::getCount();

输出:

2

注意,静态方法无法使用 $this,因为不存在对象实例。它们只能使用 self:: 访问静态属性和其他静态方法。

要点:静态方法适用于不需要对象状态的实用函数,也适用于管理类级别的数据。它们无需实例化对象即可提供功能。

challenge icon

挑战

简单

让我们构建一个 ID 生成器系统,通过静态方法和属性创建唯一标识符,无需实例化对象。

你将创建两个文件来整理代码:

  • IdGenerator.php:定义一个 IdGenerator 类,仅使用静态成员管理唯一 ID 的生成。该类应包含一个初始值为 0 的私有静态属性 $lastId,以及一个设为 "ID" 的私有静态属性 $prefix。创建一个静态方法 generate(),用于递增最后一个 ID,并返回由前缀和新 ID 组合而成的格式化字符串(例如 "ID1"、"ID2" 等)。添加一个静态方法 setPrefix($newPrefix) 来更改前缀,并添加一个静态方法 getLastId() 来返回 $lastId 的当前值。
  • main.php:引入 IdGenerator 类文件。使用默认前缀生成两个 ID,并将每个 ID 单独打印在一行上。然后使用静态方法将前缀改为 "USER",再生成两个 ID,并分别打印。最后,调用相应的静态方法打印最后一个 ID 的编号。

请记住,静态方法直接通过类调用,形式为 ClassName::methodName();在类内部,使用 self::$propertyName 访问静态属性。由于没有对象实例,不能在静态方法中使用 $this。

你的输出应展示不同前缀下 ID 的递增过程,说明静态属性如何在多次方法调用之间保留其值。

亲手试试

<?php

// 引入 IdGenerator 类文件
require_once 'IdGenerator.php';

// TODO: 使用默认前缀生成两个 ID,每个单独打印一行

// TODO: 使用静态方法将前缀改为 "USER"

// TODO: 再生成两个 ID,每个单独打印一行

// TODO: 使用相应的静态方法打印最后一个 ID 的编号

?>
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: PHP 在线编译器