PHP 8 支持方法返回类型声明为 static,表示返回调用者实际所属类的实例,实现协变返回与准确链式调用推断;仅适用于非静态方法,须配合 return $this,不支持构造/析构/静态方法及联合类型。

PHP 8 支持在方法声明中使用 静态返回类型(static),它表示该方法返回当前调用类的实例(即支持“流式调用”和“链式调用”的准确类型推断),而不是硬编码为父类或具体类名。这在构建 Fluent Interface(如 Builder 模式、ORM 查询构造器)时非常有用。
语法:直接用 static 作返回类型
在方法签名末尾加上 : static 即可:
class User
{
public function setName(string $name): static
{
$this->name = $name;
return $this;
}
public function setEmail(string $email): static
{
$this->email = $email;
return $this;
}
}
注意:static 是保留字,不能作为变量名或类名;且仅可用于 非静态方法 的返回类型声明(静态方法不能声明返回 static,因为 static::class 在静态上下文中含义不同,PHP 8 不允许 static 作静态方法返回类型)。
与 self 和 $this 的区别
-
self→ 始终指向定义该方法的类(不支持后期静态绑定) -
static(返回类型)→ 表示“调用者实际所属的类”,配合return $this实现真正的协变返回 -
$this→ 运行时对象本身,其类型由返回类型static向 IDE 和类型检查器(如 PHPStan、Psalm)承诺
例如子类调用时:
立即学习“PHP免费学习笔记(深入)”;
class Admin extends User { }
$admin = (new Admin())->setName('Alice')->setEmail('a@example.com');
// 类型推断为 Admin,不是 User —— IDE 可正确提示 Admin 特有方法
使用限制和注意事项
- 必须搭配
return $this;(或等效逻辑),否则会违反类型契约 - 不能用于构造方法(
__construct)、析构方法(__destruct)或静态方法 - 不能与
void、mixed等类型混用;也不支持联合类型如static|null(PHP 8.0–8.3 尚不支持) - 继承时子类重写该方法,也应保持
: static返回类型(PHP 8.1+ 支持协变返回类型,允许子类声明更具体的类型,但static本身已足够灵活)
实战建议
- 优先在 Builder、Query、Config 等需要链式调用的类中使用
static - 配合 PHPStan 或 Psalm 开启严格模式,能提前捕获返回类型不一致问题
- 避免在可能返回
null或其他类型的场景中强行用static—— 此时应改用具体类名或泛型(PHP 8.4+ 的class-string或模板类型更合适) - 文档注释中无需额外写
@return static,PHP 8 的原生类型已足够



















