2

PHP でオブジェクトを初期化する前に、=== null の代わりに instanceof を使用する特定の利点はありますか?

Zend フレームワークでは、次のようなコードをよく見かけます。

if (!self::$_httpClient instanceof Zend_Http_Client) {
        /**
         * @see Zend_Http_Client
         */
        #require_once 'Zend/Http/Client.php';
        self::$_httpClient = new Zend_Http_Client();
    }

    return self::$_httpClient;

ただし、プロパティを外部から設定することはできないため、設定されるまで null になります

4

4 に答える 4

3

self::$_httpClient を Zend_Http_Client にし、それ以外は絶対にしたくない場合、このチェックはもう少し確実です。

適切なプログラミングにより、変数がそれ以外のものになるのを防ぐことができますが、変数が String、int、または別のオブジェクトのインスタンスになる場合は、null のチェックが行われない場所で修正されます。

于 2012-05-19T22:51:20.570 に答える
2

あなたのソリューションと "===" でそれを行うことはできますが、インスタンスが実際に "Zend_Http_Client" のインスタンスであるかどうかを確認することはできません。おそらく、別のクラスを $_httpClient に呼び出してから、NULL ではなく、動作していません。

私の考えでは、phpの内部関数を使用してそのようなことを確認することをお勧めします。

于 2012-05-19T22:50:29.960 に答える
1

これはシングルトン実装のように見えます。それが本当なら、このチェックを行う正当な理由はありませんnull

于 2012-05-19T22:48:33.063 に答える
0

ZF では、ほぼすべてのクラスを拡張できます。したがって、子クラスが setHttpClient() を別の実装に置き換えないことを確信することはできません。また、誰かが独自の HTTP クライアント実装を使用したくないという確信もありません。このコードでは、両方を一度にチェックします。null の場合は機能します。Zend_Http_Client を継承していないクラスの場合も同様です。

于 2012-05-20T14:36:15.683 に答える