バージョン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::
は、前の例と同様です。これは、このクラスを拡張して定数をオーバーライドするだけで、異なる形式のタグに一致させることができるという理由だけで使用されます。
それで、それをすべてまとめると、後期静的バインディングのこれらの使用法(および同様の使用法)はやり過ぎですか?目立ったパフォーマンスの低下はありますか?また、遅延バインディングを頻繁に使用すると、オペコードキャッシュによる全体的なパフォーマンスの向上が低下しますか?