PHP代码中混用$this与self::的原因解析求助
关于PHP中$this和self::用法差异的解答
嘿,这个问题其实是PHP里类常量和实例属性的基础区别,我来给你掰扯清楚:
1. self:: 用来访问类常量/静态成员
self:: 是PHP里指向类本身的关键字,它关联的是类的定义,而非某个具体的实例:
- 代码里的
self::STATE_CLEAN是someClass定义的类常量,这个值是固定不变的,属于整个类,所有该类的实例共享同一个STATE_CLEAN值,不会随单个实例变化。 - 因为常量是类级别的资源,所以必须用
self::(或者直接写类名someClass::)来访问,不能用$this->。
2. $this-> 用来访问实例属性
$this 指向的是当前类的具体实例对象,用来访问属于这个实例独有的非静态属性:
- 代码里的
$this->SQL和$this->SQLState都是实例属性,每个someClass的实例都有自己独立的SQL和SQLState值。 - 虽然
$SQLState的初始值是self::STATE_CLEAN,但它本质是实例属性——你可以在某个实例里修改它的值(比如改成2),这个修改只会影响当前实例,不会波及其他实例。所以必须用$this->来获取当前实例的SQLState实时值。
结合你的代码看逻辑合理性
看这段判断代码:
if ($this->SQL !== null && $this->SQLState === self::STATE_CLEAN) return $this->SQL;
这里的写法完全没问题,逻辑是:
- 用
$this->SQLState获取当前实例的状态值 - 用
self::STATE_CLEAN获取类定义的固定常量值 - 两者对比,判断当前实例的状态是否为“干净”,如果是且SQL不为空,就返回该实例的SQL值
举个简单例子帮你直观理解差异:
class someClass { const STATE_CLEAN = 1; private $SQLState = self::STATE_CLEAN; // 加一个修改状态的方法 public function setDirty() { $this->SQLState = 2; } } $obj1 = new someClass(); $obj2 = new someClass(); $obj1->setDirty(); // 此时$obj1的SQLState是2,$obj2的SQLState还是1 // 但self::STATE_CLEAN始终是1,不会随实例变化
内容的提问来源于stack exchange,提问作者oajmi
相关产品推荐
相关产品推荐

