从 5.3 版开始,PHP 支持静态方法的后期绑定。虽然它无疑是一个有用的特性,但只有少数情况下确实需要使用它(例如 Active Record 模式)。
考虑这些例子:
1. 便利构造函数(::create()
)
class SimpleObject
{
public function __construct() { /* ... */ }
public static function create()
{
return new static; // or: return new self;
}
}
如果这个类可以扩展(但是,它没有被同一个包中的任何类扩展),是否应该使用后期静态绑定来使其更容易扩展(不必重写::create()
方法,更重要的是,不必记住要做到这一点)?
注意:此习惯用法用于解决无法在仅构造的对象上调用方法的问题:new SimpleObject()->doStuff()
在 PHP 中无效。
2.类常量
class TagMatcher
{
const TAG_PATTERN = '/\<([a-z\-]+?)\>/i';
private $subject;
public function construct($subject) { $this->subject = $subject; }
public function getAllTags()
{
$pattern = static::TAG_PATTERN;
preg_match_all($pattern, $this->subject);
return $pattern[1];
}
}
static::
在这个例子中使用的原因与上一个类似。之所以使用它,是因为可以通过扩展它并覆盖常量来使此类匹配不同格式的标签。
那么,总而言之,后期静态绑定的这些用途(和类似用途)是不是有点矫枉过正?是否有明显的性能影响?此外,频繁使用后期绑定是否会降低操作码缓存带来的整体性能提升?