可能で使いすぎ下旬に静的拘束力を有すPHP?
-
08-07-2019 - |
質問
出版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()
が無効なクリアしました。
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::
この例と同様であった。での使用がこのクラスはでき合う形のタグだけでは伸びることをオーバーの定数です。
ですから、ラップも、これらの利用やそれに類似の下旬に静的な結合が失わせないアイテム?ある目立ったパフォーマンス?また、頻繁に使用下旬の結合を低減し、全体の性能向上によるopcodeのキャッシュ?
解決
それで、すべてをまとめると、遅延静的バインディングのこれらの使用(および同様の使用)は過剰なものですか?顕著なパフォーマンスヒットはありますか?また、レイトバインディングを頻繁に使用すると、オペコードキャッシュによってもたらされる全体的なパフォーマンスの向上が抑えられますか?
遅延静的バインディングの導入により、PHPのオブジェクトモデルの欠陥が修正されます。パフォーマンスについてではなく、セマンティクスについてです。
たとえば、メソッドの実装で $ this
を使用しない場合は常に静的メソッドを使用します。メソッドが静的であるからといって、時々オーバーライドしたくないと言っているわけではありません。 PHP 5.3より前の動作では、静的メソッドをオーバーライドしてもエラーはフラグされませんでしたが、PHPは先に進み、親のバージョンを静かに使用します。たとえば、次のコードはPHP 5.3より前の「A」を出力します。これは非常に予期しない動作です。
後期静的バインディングにより修正され、同じコードで「B」が出力されるようになりました。
<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who();
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
?>
他のヒント
静的メソッド(初期遅行きをタカップリング(し)の削減testability.を作成できます大きなプログラムPHPを使用せずに複数の静的ます。私にとって、遅めのstaticメソッドは非特徴です。
編集 答えによらマルコDemaioの問題 どのようなstaticメソッドの削減testability?
すみません場合はすべての明らかな、静的メンバー(両方のデータと方法) は 有用となる場合に使用責任を持っていalludingを主流とする。
いまウェブアプリケーションを使用するSQLデータベースです。事業のオブジェクトを取得するデータを用いた静的なインタフェースを通じて多型.のいずれか
class MyBusinessObject
extends...
{
public function doThisOrThat(...)
{
$results = db::query('sql string...');
...
}
}
または
class MyBusinessObject
extends...
{
public function __construct(dbconn $db)
{
$this->db = $db;
}
private $db;
public function doThisOrThat(...)
{
$results = $this->db->query('sql string...');
...
}
}
後者はや試験につきましてしたいテストするためのsql文字列から構築されたほどの入力は、どこどこでやりを他の実施 dbconn
面での変化の意味 db::
.なぜったいなかが必要な実データベースのsqlを構成する行動をとるのが難しいのですが試験を実施 なし 実データベースです。もうスタブのsql消費者の場合試験に関しては別の側面をカット(コードの下でテスト。
試験にもと添い寝をコードして共同研究者、abstainingからの静的インタフェース(の"doublecolon"または"quadridotことのあることを要しない大規模な手術であるプラス、遠くに、コードの生産からコードの意義を低下さの試験結果です。
遅延静的バインディングを使用する必要があると思うのは、PHPUnitを使用した単体テスト用の静的メソッドのモックを許可することです。私が抱えている問題は、モックを許可するために厳密にコードを変更するのは好きではないということですが、それを乗り越えることができます。
しかし、あなたの質問に答えるために、これがもたらすパフォーマンスコストが何であれ、それはほとんどのプログラムランタイムと比較して見劣りするだろうと思います。つまり、目立った違いはありません。