PHP中static::调用非静态方法的解析与语法适用性问题
PHP中
static::foo()调用的解析与语法疑问解答 一、代码里static::foo()的具体解析
这段代码运行后会输出两次Success!,其中static::foo()的执行逻辑如下:
static::是PHP的后期静态绑定语法,在当前没有子类继承的场景下,static会直接解析为当前类A。- 虽然
foo是标记为private的非静态方法,但PHP允许使用::运算符调用非静态方法——不过这种调用方式会把方法当作静态方法执行,方法内部不能依赖$this(如果foo里用到$this会直接报错)。 - 因为
foo是private方法,它的作用域仅限于类A内部,哪怕后续有子类继承A并尝试重写foo,static::foo()依然会调用类A的foo方法,不会被子类的实现覆盖。
二、::调用静态/非静态方法的语法说明
是的,PHP的作用域解析运算符::(Paamayim Nekudotayim)在语法上确实可以同时用于静态方法和非静态方法的调用,但两者有本质区别:
- 调用静态方法:这是标准、推荐的用法,方法属于类级别,内部不能使用
$this。 - 调用非静态方法:这属于PHP的兼容语法,但不推荐使用——因为这种调用会脱离实例上下文,方法内如果存在
$this会直接触发错误,同时也会让代码逻辑变得混淆,不符合面向对象的设计规范。
官方手册没有重点讲解这种用法,是因为它属于非标准场景,PHP官方更建议开发者用$this->调用非静态方法,用::调用静态方法,保证代码的可读性和规范性。
内容的提问来源于stack exchange,提问作者Denis Kulagin
相关产品推荐
相关产品推荐

