最近、5.3 まで PHP に遅延静的バインディングがないという話をよく耳にします。
私が読んだことから、言語にこの機能が実装されるまで、ActiveRecord のようなものの適切な実装は不可能です。
だから、私は興味があります:
- それをサポートする言語、特に Python、Ruby、Perl、Java、C#、(JavaScript など) などの Web 開発に一般的に関連付けられている言語はどれですか?
- 実際に定期的に使用しているのはどれですか?
回避策が必要な場合は、確かに少し時間がかかりますが、php 5.3 が利用可能になり主流になったときに簡単に削除されます。次のコードを試すことができます。
class Specific_Model extends Model{
public static function GetAll($options = null){
parent::GetAll($options, get_class());
}
}
class Model{
public static function GetAll($options = null, $class = null){
if(is_null($class)) $class = get_class();
/* Do stuff here */
}
}
次に、次のコードを使用できます...
Specific_Model::GetAll($options);
また、php 5.3 に移行するときに余分なコードを簡単に取り除くことができます。
遅延静的バインディングがないと、プログラマーがクラス B で関数を明確に表現しているときに、PHP インタープリターは関数 hello() をクラス A にバインドします。遅延静的バインディングがないと、hello にもかかわらず「bye」ではなく「hello」が出力されます。 () クラス B で呼び出されています。
遅延静的バインディングとは何かを完全に誤解していました。ウィキペディアには次のように書かれています。
レイト スタティック バインディングは、スタティック バインディングとダイナミック バインディングの間の [name] バインディングのバリアントです。次の PHP の例を考えてみましょう。
class A {
static $word = "hello";
static function hello() {print self::$word;}
}
class B extends A {
static $word = "bye";
}
B::hello();
レイト スタティック バインディングを使用しないと
hello()
、プログラマーが で関数を明確に表現しているときに、PHP インタープリターは関数をクラス A に バインドしclass B
ます。hello()
遅延静的バインディングがないと、 on が呼び出されたにもかかわらず、「bye」ではなく「hello」が出力されclass B
ます。インタープリターでの遅延静的バインディングは、
$word
実行時に決定されることを意味します。この場合、 if が呼び出された 場合とB::$word
ifが呼び出された場合を参照します。これには、キーワードをto に変更する必要が あります (おそらく PHP 5.3 以降で利用可能)。B::hello()
A::$word
A::hello()
self
static
A::hello()
class A {
static $word = "Welcome";
static function hello() {print static::$word;}
}
class B extends A {
static $word = "bye";
}
B::hello();