在非静态函数上使用self ::或static ::很好吗?

时间:2013-11-02 07:55:12

标签: php static late-static-binding

我在php中做了一些oop,当我只是想知道它是否有好处呢? 当我使用$this->functionName()时,它工作正常,我甚至尝试使用self ::和static ::它们按照我的预期工作:

self ::将使用父方法实现,静态将使用方法的最后一个实现(如果被覆盖)(后期静态绑定)。但问题是它被用于非静态函数。这个好吗?它有任何缺点吗?为什么我不应该使用它?

1 个答案:

答案 0 :(得分:1)

有关详细说明,请参阅this answer

通常,可以执行您描述的内容并且PHP允许它。但请记住,人们习惯于多态和方法重写,所以如果你的基类允许覆盖某些方法然后使用self来调用它,那么我不能改变类的行为会很奇怪,尽管它将其在API中以publicprotected方法公开。

IMO,它违反了Ben叔叔的清洁代码书中引用的Principle of least astonishment

此外,static$this绑定之间存在一些差异,因为static将始终尝试在较窄但不总是适当的范围内引用该元素。此行为在this example中显示,并在上面的注释中进行了解释,我在此处引用:

  

在非静态上下文中,被调用的类将是对象实例的类。由于$this->会尝试从同一范围调用私有方法,因此使用static::可能会产生不同的结果。另一个区别是static::只能引用静态属性。

因此,尽管可以在static适当的某些地方使用$this,但引入了static关键字以使用访问静态方法和字段并将其用于其他目的应该被认为是令人困惑的。