2

最近、5.3 まで PHP に遅延静的バインディングがないという話をよく耳にします。

私が読んだことから、言語にこの機能が実装されるまで、ActiveRecord のようなものの適切な実装は不可能です。

だから、私は興味があります:

  • それをサポートする言語、特に Python、Ruby、Perl、Java、C#、(JavaScript など) などの Web 開発に一般的に関連付けられている言語はどれですか?
  • 実際に定期的に使用しているのはどれですか?
4

4 に答える 4

4

回避策が必要な場合は、確かに少し時間がかかりますが、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 に移行するときに余分なコードを簡単に取り除くことができます。

于 2008-12-15T05:43:16.250 に答える
-1

遅延静的バインディングがないと、プログラマーがクラス B で関数を明確に表現しているときに、PHP インタープリターは関数 hello() をクラス A にバインドします。遅延静的バインディングがないと、hello にもかかわらず「bye」ではなく「hello」が出力されます。 () クラス B で呼び出されています。

于 2009-04-18T05:28:40.257 に答える
-3

遅延静的バインディングとは何かを完全に誤解していました。ウィキペディアには次のように書かれています。

レイト スタティック バインディングは、スタティック バインディングとダイナミック バインディングの間の [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::$wordA::hello()selfstaticA::hello()

class A {
    static $word = "Welcome";
    static function hello() {print static::$word;}
}

class B extends A {
    static $word = "bye";
}

B::hello();
于 2008-12-15T03:31:49.403 に答える