Начиная с версии 5.3, PHP поддерживает последнее связывание для статических методов. Хотя это, несомненно, полезная функция, есть только несколько случаев, когда ее использование действительно необходимо (например, шаблон активной записи).
Рассмотрим следующие примеры:
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::
в этом примере аналогична предыдущей. Он используется только потому, что этот класс можно сделать так, чтобы он соответствовал разным образом сформированным тэгам, просто расширив его и переопределив константу.
Итак, чтобы обернуть все это, являются ли эти использования (и подобные) поздней статической привязкой избыточным? Есть ли заметная производительность? Кроме того, частое использование позднего связывания уменьшает общее повышение производительности, предоставляемое кэшами операций операций?