:: 操作符不支持链式调用,因其仅用于静态成员访问、不返回对象、非函数调用且为编译期绑定;链式必须依赖 -> 与返回 $this 的实例方法。
操作符本身不支持链式调用。它只是用于访问类的静态成员(属性、方法)或父类/接口中定义的静态内容,不是函数调用,也不返回对象,因此无法像
那样连续点下去。
为什么
不能链式调用
作用域
操作符
的语义是「从某个类作用域中取出一个静态成员」,它不产生可继续调用的对象实例,也不返回任何值(除非你显式
)。常见误解是以为写成
能成立,但 PHP 会直接报错:
这是因为解析器在
执行完后,期待的是分号、逗号或右括号等终结符,而不是又一个
。
返回的是方法的执行结果(比如
、
或
),不是类或对象
只有返回
、
或具体对象实例的方法,才能支持后续
链式调用
是编译期绑定的静态访问语法,不参与运行时对象流转
想实现“静态风格”的链式操作?得靠返回对象
所谓“静态方法链式”,本质是让每个方法都返回一个对象(通常是当前类实例或新实例),然后用
连起来。静态方法本身可以作为工厂或入口,但链式动作必须落在实例方法上。
立即学习
“
PHP免费学习笔记(深入)
”;
典型模式:
是静态工厂方法,返回
实例
所有
必须返回
(注意:不能是
,否则可能破坏继承链)
如果真要用纯静态方式模拟链式(不推荐),只能嵌套调用:
—— 这既难读又不可维护
示例(合法且常用):
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
}
// ✅ 正确链式:静态入口 + 实例方法链
$result = QueryBuilder::table('users')-youjiankuohao
php
cnwhere('id > 10')->get();
容易踩的坑:混淆静态调用与链式前提
很多初学者试图这样写:
}
// ❌ 报错:Cannot use object of type int as array / unexpected '::'
Utils::add(5)::mul(10);
原因很直接:
返回的是
,而
不支持
操作。PHP 中只有类名、变量(含对象)、
关键字后面才能跟
。
别给返回标量的静态方法加链式幻想
若需组合多个静态计算,老实用变量承接:
继承场景下,
可能延迟绑定,但依然不解决链式问题 —— 它只是换了个类去查静态成员,不改变返回值类型
真正需要链式时,就老老实实走对象路线;如果只是想省掉
,用静态工厂起步没问题,但链子必须挂在
上。硬凑
链式,只会提前遇到语法错误或语义混乱。
::->::::returnFoo::bar()::baz()Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)Foo::bar()::Foo::staticMethod()stringintnullselfstatic->::->Builder::create()->withName('a')->withAge(12)->build()Builder::create()new staticwithXxx()$thisstaticBuilder::withName(Builder::create(), 'a')::withAge('b')::build()class QueryBuilder
{
private string $table = '';
private function __construct() {}
public static function table(string $name): self
{
$instance = new self();
$instance->table = $name;
return $instance;
}
public function where(string $cond): self
{
// ... 处理条件
return $this;
}
public function get(): array
{
return ['SELECT * FROM ' . $this->table];
}class Utils
{
public static function add(int $a): int
{
return $a + 1;
}
public static function mul(int $a): int
{
return $a * 2;
}Utils::add(5)intint::class::$x = Utils::add(5); $y = Utils::mul($x);static::new->::