static:: vs. self:: - 有什么缺点吗?

Tom*_*ger 5 php static constants self late-static-binding

这个 StackOverflow 问题中,我了解到它self::不是继承感知的static::(在 PHP 中)。当涉及在类中定义一堆常量时,如果您想覆盖子类中的这些常量以更改默认的“行为”,则必须使用static::父类中引用该常量的方法,从而尊重“覆盖”。

自从我提出这个原始问题以来的 2 年里,我已经开始static::广泛使用,以至于我很少使用,self::因为self::这似乎限制了使用常量的类的可扩展性,而static::没有这种限制。

即使我不目前打算常数被覆盖在一个子类,我最终使用static::,以防万一-所以我没有做一堆的以后的搜索和替换,如果事实证明我将要扩展类并覆盖常量。

但是,在其他人的代码中,我很少看到static::. 直到 2012 年,我什至不知道它的存在。那么,为什么不是理所当然地使用static::代替的普遍做法self::呢?

我的问题的话,就是:是否有任何明显的缺点,使用static::了指的类的常量,而不是self::?我是否因为在这里使用了严重的反模式而感到内疚?

dyn*_*mic 2

实际上这仅取决于您需要的用途。如果您需要访问调用它的类的常量,请使用self. 如果您需要后期静态绑定,请使用static.

从性能的角度来看,self两者static相当。

另请注意,广泛使用静态组合来覆盖/继承并不是一个好主意。

为了直接回答你的问题,我总是更喜欢使用 来static进行测试(尽管现在 PHPUnit 4 删除了对模拟静态方法的支持)。

  • 我知道自从提出这个问题以来,PHP 已经发生了很大的变化,但认为值得注意 - 当在子类中使用时,`self::` 似乎是从父级继承的,并且从我在这个问题上看到的问题来看,显然父类上下文中的 `self::` 不会被子类覆盖。所以 `static::` 应该在父上下文中使用,但 `self::` 在子上下文中就完全足够了。 (2认同)