Начиная с версии 5.3, PHP поддерживает late binding для статических методов. Хотя это, несомненно, полезная функция, есть только несколько случаев, когда ее использование действительно необходимо (например, шаблон Active Record).Возможно ли чрезмерное статическое связывание в 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::
в этом примере, аналогична предыдущей. Он используется только потому, что этот класс может быть создан для соответствия разным образом сформированным тэгам, просто расширяя его и переопределяя константу.
Таким образом, чтобы обернуть все это, используются ли эти (и подобные) поздние статические привязки, являются излишним? Есть ли заметная производительность? Кроме того, частое использование позднего связывания уменьшает общий прирост производительности, предоставляемый кэшами операций операций?
Ну, второе может быть достигнуто с переопределением частной переменной и с использованием '$ this' тоже, верно? Или я что-то не понимаю? – Franz
Да, но я просто не мог подойти к лучшему примеру ... Наличие в качестве 'const' означает избежать копирования всех экземпляров. И даже если бы PHP-копирование-на-запись оптимизировало бы это, оно, безусловно, выглядит лучше как константа класса, потому что оно на самом деле является постоянным значением класса в целом. –
... и все это на самом деле означало, что в этом случае использование переменных экземпляра выглядит как обходное решение, а 'static ::' - нет. –