PHP 5.x中call_user_func()使用parent::/self::的警告及方法类型判断问题
关于PHP 5.x中
parent::/self::调用非静态方法的警告问题 将参考PHP官方手册的“Changelog(更新日志)”部分说明:“parent和self等面向对象关键字的解析方式已变更。此前使用双冒号语法调用它们会触发E_STRICT警告,因为它们被解析为静态调用。” 请问在PHP 5.x中,此类调用是否属于静态调用非静态方法并触发警告?如果是,我们如何确定所调用的方法是非静态的?目前我们仅是假设如此,而方法仅有两种类型……
问题解答
在PHP 5.x版本中,答案是肯定的:用parent::或self::双冒号语法调用非静态方法时,确实会被解析为静态调用,并触发E_STRICT级别的警告。
至于如何判断所调用的方法是非静态的,有两个明确的依据:
- 看方法的定义:如果方法声明时没有添加
static关键字,那它就是非静态方法。在PHP 5的严格模式下,这类方法本应通过类的实例(比如$this->或者$obj->)来调用。 - 看方法内部的实现:非静态方法允许使用
$this关键字访问当前实例的属性和其他非静态方法,而静态方法中如果尝试使用$this会直接抛出错误,这也是区分两者的直观特征。
另外补充个小知识点:PHP 7及以后的版本调整了这部分的解析逻辑,用self::/parent::调用非静态方法不再触发E_STRICT警告,因为解析器已经能正确识别这种调用是针对当前类/父类方法的合法调用,而非严格意义上的静态调用。
内容的提问来源于stack exchange,提问作者user9098366
相关产品推荐
相关产品推荐

