1

別のSEサイトで「良い」と主張されているコードでこの機能を見つけました。

public static function init()
        {
            is_null( self::$instance ) AND self::$instance = new self;
            return self::$instance;
        }

誰かこの行を英語で説明してくれませんか?

is_null( self::$instance ) AND self::$instance = new self;

singletonsあなたがなぜ悪いと思うのか、私には興味がありません。このコードが含まれているクラスのインスタンスを返すように設計されていることは承知していますが、その 1 行の読み方がわかりません。の結果はself::$instance = new self;

4

3 に答える 3

2

それは基本的に、もしあればself:$instance作るnullことを意味しself:$instance new selfます。

より詳細な方法は次のとおりです。

if(is_null(self::$instance)){
    self::$instance = new self;
}

実際の質問に答えるには、の結果は にself::$instance = new self;なりますがtrue、変数自体を割り当てるために使用しているだけなので、それは関係ありません。

于 2013-10-24T13:13:06.597 に答える
2

これは完全にクリーンなコードです。行は最初にシングルトンがすでに存在するかどうかをテストし、存在する場合はそれが返されます。そうでない場合は、新しいインスタンスが作成され、シングルトン クラスの静的インスタンス属性内に格納されて返されます。

AND演算子を使用した型にはまらない表記法につまずくかもしれません。しかし、それは完全に有効な PHP コードです: の後ろの部分ANDは、前の条件が true の場合にのみ実行されます。

ここでは、構文の代入の結果 (戻り値)self::$instance = new selfは関係ありません。その義務を果たし、オブジェクトが作成されます。個人的には、この構造をバケツ内に記述することを好みます。しかし、一般に代入演算子は、この方法で評価されると戻り値も持ちます。これが、この構造を使用して非常にきれいなコードを作成できる理由です: if (FALSE===($result=action())) {do_something();}.

于 2013-10-24T13:11:59.120 に答える
0

その結果self::$instance = new self;、静的$instance変数は現在のオブジェクトによって初期化されます (事前に存在しなかったため)。

于 2013-10-24T13:11:26.550 に答える