2

たとえば、通常の使用法がオブジェクトの作成であるローカライズされた日付クラスがあるとします。

$d = new Date(mktime(), 'MM-DD-YYYY', array('locale' => 'es'));

では、新しいオブジェクトを常に明示的に作成するのではなく、次のようなものが必要だとしたらどうでしょうか。

<p>The date is <?php echo 
Date::formatDate( mktime(), 'MM-DD-YYYY', array('locale'=>'es') );?>
</p>

私のformatDateメソッドでは、コンストラクターを呼び出して日付オブジェクトを内部的に作成することをお勧めしますか、それともすべての内部メソッド呼び出しを完全に静的にする必要がありますか?

class Date {
    function getLocalisedDate( $time, $format, $options ) {
        $obj = Date::Date(
            $time, $format, $options
        ); // invoke the constructor
        return $obj->get();
    }
};

私は多くのクラスを開発したことがありません.OO言語で一般的なパターンであるかどうか疑問に思っています.

4

1 に答える 1

2

問題は < php 5.3 で、静的メソッドは常にハードコードされたクラスのインスタンスを作成しようとしています。したがって、実際にMyAdvancedDatewhich extendsを使用している場合は、メソッドが実際に存在するクラスを常に参照するため、常にDate親のインスタンスを取得することになります。これはもちろん、子孫クラスでメソッドを明示的にオーバーライドしない限りです。これは、レイト スタティック バインディングと呼ばれます。self__CLASS__

5.2 で LSB を実装する必要がある場合は、通常、静的プロパティと対応する静的アクセサーを作成して、静的呼び出しによってインスタンス化されたクラスを変更できるようにします。ここでの唯一のことは、静的プロパティを変更すると全体的に変更されるため、単一の子孫のみを使用することを前提としていることです。プロジェクト/アプリ/モジュール/パッケージの実際のアーキテクチャに応じて、パンチで機能する可能性があります。

于 2010-01-13T19:09:35.837 に答える