<?php练功房

第 4 章 · 面向对象 · 第 4.3 课

静态成员、常量与枚举

约 15 分钟

静态成员

普通属性属于每个对象,静态(static)属性属于类本身,所有对象共享一份。静态方法不需要 new 就能调用,写法是 类名::方法()。在类的内部用 self:: 访问自己的静态成员。

类常量用 const 定义,同样通过 类名::常量名 访问。

静态方法里没有 $this,因为它不属于任何一个对象。

枚举 enum(PHP 8.1)

当一个值只能是固定的几种之一时(订单状态、星期、颜色……),用枚举比用字符串安全得多:写错一个字母,PHP 会直接报错,而不是悄悄出 bug。

带值的枚举(backed enum)给每个 case 绑定一个字符串或整数,方便存数据库。from() 根据值找到 case,找不到会报错;tryFrom() 找不到时返回 null。枚举里也可以写方法。

readonly 属性(PHP 8.1)

readonly 属性只能在初始化时赋值一次,之后谁都改不了。适合 id、创建时间这类“一旦确定就不该变”的数据。

选择题

在 static 方法里能使用 $this 吗?

练习 1

风险等级

写一个带整数值的枚举 Level:

  • 三个 case:Low = 1、Medium = 2、High = 3
  • 方法 label():分别返回 "低"、"中"、"高"
  • 静态方法 fromScore(int $score): self:80 分及以上返回 High,50 分及以上返回 Medium,其余返回 Low

练习 2

编号生成器

写一个类 IdGenerator,它的静态方法 next() 每调用一次,依次返回 "ID-1"、"ID-2"、"ID-3"……