我在 php 中做一些 oop,而当我只是想知道这样做是否好?当我使用时$this->functionName()
,它工作正常,我什至尝试使用 self:: 和 static:: 并且它们按我预期的方式工作:
self:: 将使用父方法实现,如果被覆盖(后期静态绑定),静态将使用该方法的最后一个实现。但问题是它被用于非静态函数。这个好吗?它有什么缺点吗??为什么我不应该使用它?
我在 php 中做一些 oop,而当我只是想知道这样做是否好?当我使用时$this->functionName()
,它工作正常,我什至尝试使用 self:: 和 static:: 并且它们按我预期的方式工作:
self:: 将使用父方法实现,如果被覆盖(后期静态绑定),静态将使用该方法的最后一个实现。但问题是它被用于非静态函数。这个好吗?它有什么缺点吗??为什么我不应该使用它?
有关详细说明,请参阅此答案。
一般来说,可以做你描述的事情,PHP 允许这样做。但是请记住,人们习惯于多态性和方法覆盖,因此如果您的基类允许覆盖某些方法,然后使用 aself
来调用它,那么我无法更改类行为会很奇怪,尽管它在它的API 作为public
或protected
方法。
IMO,它违反了本叔叔的清洁代码书中引用的最小惊讶原则。
static
此外,和$this
绑定之间也有一些区别,因为static
总是会尝试在较窄的范围内引用元素,并不总是合适的范围。此行为在此示例中呈现,并在上面的注释中进行了解释,我在此引用:
在非静态上下文中,被调用的类将是对象实例的类。由于
$this->
将尝试从同一范围调用私有方法,因此使用static::
可能会产生不同的结果。另一个区别是static::
只能引用静态属性。
因此,尽管可以在某些适当的static
地方使用,但引入关键字是为了使用访问静态方法和字段,并将其用于其他目的应该被认为是令人困惑的。$this
static