2014-11-05 110 views
3

this StackOverflow question我了解到self::不是遗传感知,其中static::(在PHP中)。当涉及到在类中定义一堆常量时,如果要覆盖子类中的那些常量以更改默认“行为”,则有必要使用static::,以便引用常量,荣誉的父类方法“覆盖”。static :: vs. self :: - 有没有什么缺点?

在2岁,因为我问原来的问题,我一直在使用static::广泛,给我很少用self::因为self::点似乎限制使用常量类的可扩展性,其中static::没有启动这个限制。

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

但是,在别人的代码中,我很少看到任何使用static::。直到2012年,我甚至不知道它存在。当然,为什么在self::的地方使用static::当然不是一般惯例?

我的问题的话,就是:是否有任何明显缺点使用static::为指的类的常量,而不是self::?我是否在这里使用粗糙的反模式?

回答

0

其实它只取决于你需要的用途。如果您需要访问您呼叫的类的常量,请使用self。如果您需要延迟静态绑定,请使用static

从表演的角度来看,selfstatic是相当的。

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

对于您的问题的直接回答,我总是倾向于使用static进行测试(即使PHPUnit 4删除了对模拟静态方法的支持)。

+1

感谢您的回答!为什么“广泛使用静态”不是一个好主意?请解释。另外,为什么静态更适合测试目的? – 2014-11-05 18:28:13

+0

有很多关于此主题的有用信息:http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/ – dynamic 2014-11-05 18:57:40