【问题标题】:Using self:: instead of $this使用 self:: 而不是 $this
【发布时间】:2018-04-13 21:57:26
【问题描述】:

我来自一些 php 代码,我认为编写它的开发人员有点矛盾。 所以这是他写的代码:

if ($this->SQL !== null && $this->SQLState === self::STATE_CLEAN)
        return $this->SQL;

SQLState 和 STATE_CLEAN 的定义如下:

class someClass {
    const STATE_CLEAN = 1;
    private $SQLState = self::STATE_CLEAN;
}

所以你可以看到,对于某些类属性,他使用 $this,而对于某些类属性,他使用 self::,我不明白为什么。 任何人都可以帮忙。谢谢

【问题讨论】:

  • 不可能,因为我知道它们都是什么意思,我只是不明白这个具体情况。
  • 我想我不明白你的问题。你能解释更多吗?
  • 他故意同时使用 self:: 和 $this 而他可以使用 $this 来代替,实际上他不应该使用任何定义的属性是静态的吗?所以我认为要么他与他的代码不一致,要么他知道我不知道的事情

标签: php static static-methods


【解决方案1】:

这里:

private $SQLState = self::STATE_CLEAN;

属性被初始化为常量的值。

在某些时候,属性可能会改变,但常量是常量。所以检查这种情况:

$this->SQLState === self::STATE_CLEAN

验证当前状态是否与初始状态相同是有意义的。


为了澄清,因为我认为我错过了问题的要点,使用self::STATE_CLEAN 是因为STATE_CLEANclass constant。使用$this->STATE_CLEAN 会得到你

注意:未定义的属性:someClass::$STATE_CLEAN

【讨论】:

  • 为什么不使用 $this->STATE_CLEAN 而不是 self::STATE_CLEAN
  • @Dever 在哪一部分他应该使用$this->STATE_CLEAN 而不是self::STATE_CLEAN
  • 实际上两者都不是静态的,为什么要使用 self::
  • @Dever STATE_CLEAN 是一个常量,你不能使用$this访问它
【解决方案2】:

好的做法是:

使用 self:: 用于类常量
(在引用类时 - 您可能没有此类的初始化对象实例)

$this-> 用于类变量
(在引用初始化对象实例时)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    相关资源
    最近更新 更多