在类内部调用非静态方法必须用 $this->methodname(),它是唯一推荐方式;调用静态方法应优先用 self::method(),仅需后期静态绑定时才用 static::method()。

直接用 $this->methodName() 就行,这是最常用、最安全的方式。其他写法要么限制多,要么容易出错。
在类内部调用公有/受保护的非静态方法
用 $this 是唯一推荐方式,它明确指向当前实例,能正确访问属性、触发魔术方法、支持重载和继承逻辑:
-
$this只能在非静态上下文中使用;在static方法里直接用会报Fatal error: Using $this when not in object context - 调用私有方法也走
$this,只要在同一个类内定义,无需额外处理 - 如果方法返回
self(PHP 7.4+ 类型声明),链式调用可被 IDE 和 PHPStan 正确识别,比如$this->setFoo()->setBar()
在类内部调用本类的静态方法
不能用 $this::method(),也不该用硬编码类名(如 MyClass::method()),而应优先用 self::method():
-
self指向“当前定义该方法的类”,改名不需同步更新所有调用点 - 若需后期静态绑定(比如子类重写后仍想调用子类自己的静态方法),才用
static::method() - 在静态方法内部调用另一个静态方法,
self::是必须的——$this在那里根本不可用
别踩这些坑
常见错误不是语法写不对,而是语义混淆:
- 在非静态方法里用
self::调用非静态方法,会报Strict standards: Non-static method should not be called statically(PHP 7.4 默认开启严格模式) - 把
$this->method()写成$this->method(漏括号),结果是读属性而非调用方法,静默失败 - 从构造函数
__construct()里调用尚未初始化的属性或依赖,容易引发 Notice 或逻辑错位,这类问题不会报错但行为异常
真正容易被忽略的是:是否该把方法设计成静态,往往比“怎么调用”更重要。一个看似只是工具逻辑的方法,一旦依赖 $this->config 或触发事件监听器,就不再是纯静态的——强行用 self:: 会绕过对象生命周期,埋下维护隐患。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











