在非静态函数上使用 self:: 或 static:: 是否好


is it good to use self:: or static:: on non static function?

我正在用 php 做一些 oop,当我只是想知道这样做是否好吗?当我使用 $this->functionName() 时,它工作正常,我什至尝试使用 self:: 和 static:: 它们按我预期工作:

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

有关详细说明,请参阅此答案。

一般来说,可以做你描述的事情,PHP 允许它。但请记住,人们习惯于多态性和方法覆盖,所以如果你的基类允许覆盖某个方法,然后使用self来调用它,那么我无法更改类行为会很奇怪,尽管它在其 API 中将其公开为 publicprotected 方法。

IMO,它违反了本叔叔的清洁代码书中引用的最小惊讶原则。

此外,static 绑定和$this绑定之间存在一些差异,因为static总是尝试在较窄且并不总是合适的范围内引用元素。此示例中介绍了此行为,并在上面的注释中进行了说明,我在此处引用了该注释:

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

因此,尽管可以在一些合适的地方使用 static $this,但引入static关键字是为了使用静态方法和字段,将其用于其他目的应被视为混淆。