2013-11-02 21 views
0

我在做一些在PHP的oop,当我只是想知道它是否很好做到这一点? 当我使用$this->functionName(),它工作得很好,我甚至具有自我尝试::和静::和他们的工作如我所料:在非静态函数上使用self ::或static ::是很好的吗?

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

回答

1

查看this answer的详细说明。

一般而言,您可以完成所描述的任务,而PHP允许这样做。但是请记住,人们习惯于多态和重写方法,所以如果你的基类允许重写某种方法,然后使用self来调用它,那将是奇怪的,我不能改变类的行为,尽管它暴露了它其API为publicprotected方法。

IMO,它违反了本书的Uncle Ben的Clean Code book中引用的Principle of least astonishment

此外,static$this绑定之间有一些差异,因为static将始终尝试引用较窄但不总是适当的作用域中的元素。这种行为呈现在this example,并在上面的说明,我这里引用解释:

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

因此,尽管有可能在一些地方$this适合使用static,该static关键字被介绍给使用访问静态方法和字段,并用它另一个目的应被视为混乱。

+0

这并不能完全回答我的问题。 我们可以使用self :: methodName()而不是$ this-> methodName()...但这样做好吗?如果我们使用static :: methodName(),将不会出现多态性的问题,因为它将与$ this-> methodName相同...... 那么为什么不用self ::/static :: vs $ this-> ?? ? – user2707590

+0

请参阅我的编辑,因为我提供了更多反对静态方法使用静态的参数 – fracz

+0

@ user2707590使用错误的访问器不仅会造成混淆,还会生成警告消息! – ComFreek

相关问题