PHP 8.0+ 支持在非静态方法中使用 static 作为返回类型,表示当前调用类的实例,但静态方法仍不支持 : static 声明(截至 PHP 8.3),需用 self 或 @return static PHPDoc 补充。

PHP 8 引入了对返回类型声明的增强支持,但要注意:PHP 并不支持 static 作为返回类型关键字(像 self 或 static 这样的“后期静态绑定”类型)直接用于返回类型声明语法中。你不能写 function foo(): static { ... } —— 这在 PHP 8 中是语法错误。
不过,PHP 8.0+ 确实支持几种与“静态上下文”相关的返回类型写法,关键在于区分清楚:
✅ 正确用法:用 static 作为返回类型(PHP 8.0+ 支持)
从 PHP 8.0 开始,static 正式成为可声明的返回类型,表示“当前调用该方法的类的实例”,即支持后期静态绑定(LSB)的返回类型。
class ParentClass
{
public function create(): static
{
return new static();
}
}
class ChildClass extends ParentClass {}
$obj = (new ChildClass())->create(); // $obj 是 ChildClass 实例✅ 这是合法且推荐的写法(PHP 8.0+)。static 在这里不是“静态方法”的意思,而是“当前静态调用者类的实例类型”。
立即学习“PHP免费学习笔记(深入)”;
⚠️ 注意:
static返回类型只能用于实例方法(不能用于static方法本身作返回类型),且要求方法实际返回new static()或兼容对象。
❌ 常见误解:static function foo(): static
这是不允许的:
class A {
static function get(): static { // ❌ Parse error: syntax error
return new static();
}
}PHP 不允许在 static 方法上使用 static 作为返回类型(截至 PHP 8.3 仍不支持)。此时应改用 self 或具体类名,或 PHP 8.1+ 的 static 仅限非静态方法。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
✅ 替代方案(兼容性或特殊场景)
-
用
self:返回定义该方法的类的实例(不支持 LSB)public function cloneMe(): self { return new self(); } -
用
?static(PHP 8.0+):允许返回null或当前类实例public function maybeCreate(): ?static { return rand(0,1) ? new static() : null; } PHP 8.1+ 支持
readonly+static组合(仅属性),但和返回类型无关。
✅ 静态方法想返回当前类?用 static 作为返回类型(PHP 8.4+ 实验性?不,等等——目前仍不支持)
截至目前(PHP 8.3),静态方法仍不能声明 : static 返回类型。官方 RFC 曾讨论过,但尚未合并。所以:
class A {
public static function make(): static { } // ❌ 至今不支持(2024年中)
}替代写法(推荐):
class A {
public static function make(): self {
return new static(); // 运行时是子类实例,但类型提示是 self → IDE 可能误报
}
}更准确的做法(PHP 8.1+)是使用泛型模拟(需配合 PHPStan/psalm)或接受 @return static PHPDoc 补充:
/**
* @return static
*/
public static function make() {
return new static();
}这样 IDE 和静态分析工具能识别,运行时无类型约束但语义清晰。
不复杂但容易忽略:static 返回类型只对非静态方法有效,且依赖 new static();静态方法暂无法用 : static 声明,靠 PHPDoc + 运行时保障。


















