5

免責事項:はい、私はPHP4.3.0をサポートすることを余儀なくされています。私はそれが死んでいることを知っています。いいえ、アップグレードできません。複数のサーバーを扱っているため、一部のサーバーにはアクセスできません。

さて、self::PHP5固有であるため使用できないので、PHP4クラスに静的を実装するにはどうすればよいですか?私の研究からこれまでのところstatic、関数のコンテキストでのみキーワードを使用できるようです。$ _ GLOBALSを使用する別のメソッドを見ましたが、それを使用することはないと思います。

同じページにいるので、4でこれらのPHP5統計にアクセスする必要があります。

public static $_monthTable = array(
     31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
public static $_yearTable = array(
     1970 => 0,            1960 => -315619200);

これまでのところ、静的変数が見つからない場合は基本的に静的変数を設定する独自の関数を考え出し、すべての静的プロパティをその関数にハードコーディングしています。ただし、インスタンス化されておらず、コンストラクターが起動されていない、つまりを使用できないと仮定すると、同じクラスのantherメソッド内でこれらの静的なものを参照する方法が完全にはわかりません$this

class DateClass {

    function statics( $name = null ) {

        static $statics = array();

        if ( count( $statics ) == 0 ) {
            $statics['months'] = array(
                'Jan', 'Feb'
            );
        }

        if ( $name != null && array_key_exists($name, $statics ) ) {
            return $statics[$name];
        }
    }

};

var_dump( DateClass::statics('months') );

質問1:これは実行可能ですか?別の方法を試してみる必要がありますか?

質問2:同じクラスのメソッドから統計をどのように参照しますか?試しましたが、単なる文字列__CLASS__::staticsだと思う__CLASS__ので、実際にはメソッドを呼び出していません。

注:これは、Apache2 + / IIS6 +、PHP4.3.0からPHP 5.2、OSX / Linux/Windowsで使用されるフレームワークに実装します。

4

2 に答える 2

4

あなたの最初の質問に答えて、私はあなたの解決策が良いと思います。変数も設定および設定解除できるように拡張します。また、静的な$ staticsを別の方法で「プライミング」します。設定されていない変数の値は、デフォルトで。になりnullます。

<?php
class DateClass {
  function statics( $name, $value=null, $unset=null ) {
    static $statics;
    // better way to "prime" $statics, it's null by default
    if ( !$statics ) {
      $statics = array( "months" => array( "Jan", "Feb" ) );
    }
    if ( $value )
      $statics[ $name ] = $value;
    if ( $unset )
      unset( $statics[ $name ] );
    // don't worry about checking for existence
    // values of unset variables and array keys always are null
    // that's what you should return
    return $statics[ $name ];
  }
}

2番目の質問に関しては、DateClass::statics()のその他のメソッド(静的または非静的)内でも、どこでも使用できますDateClassDateClass::statics()PHP4では、そうすべきではない場合でも、インスタンスメソッドとして呼び出すこともできます。(外部スコープに$ thisがある限り、インスタンスメソッドを静的に呼び出すこともできます。これはきれいではないので、絶対に行わないでください;-)

DateClass呼び出しをより動的にしたい場合は、 call_user_funcを使用できます。これはもう少し冗長です。

<?php
class DateClass {
  function statics( ... ) { ... }
  function anotherStaticFunc() {
    var_dump( DateClass::statics( 'months' ) );
    // using __CLASS__ and call_user_func
    var_dump(
      call_user_func( array( __CLASS__, 'statics' ), 'months' )
    );
  }
  function instanceMethod() {
    var_dump( $this->statics( 'months' ) );
  }
}
于 2010-01-13T08:28:38.753 に答える
1

一般に、言語機能をエミュレートすることはお勧めできません。PHP 4は静的プロパティをサポートしていないため、巧妙な方法でそれをあたかも見せるようにすることはお勧めしません。最も自然なことは、グローバル変数を使用することだと思います。基本的に、それはとにかく静的プロパティが何であるかです-それはただ名前空間化されています。したがって、名前空間の慣例を使用して、名前の衝突のリスクを最小限に抑えれば、基本的に同じことが起こります。例えば。それ以外の:

class Foo {
  static $ninja = 42;
}

使用できます

$GLOBALS['foo_ninja'] = 42;
于 2010-01-13T11:25:41.950 に答える