静态方法和属性
本课属于 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:: 访问静态属性和其他静态方法。
要点:静态方法适用于不需要对象状态的实用函数,也适用于管理类级别的数据。它们无需实例化对象即可提供功能。
挑战
简单让我们构建一个 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 的编号
?>这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: PHP 在线编译器