質問: **最終的にやりたいこと** ・3つの状態をフラグのように変数で管理したい **最初に考えたこと** ・変数に数字を入れようと思ったのですが、数字だと分かりにくいので、true、false、null、未定義辺りで条件分岐したい(可能なら) **質問** ・例えば、$hoge が下記何れかであると仮定して; true、false、null、未定義 **下記のように条件分岐できるでしょうか?** ・$hogeが、trueなら ・$hogeが、falseなら ・$hogeが、nullなら ・$hogeが、未定義なら
回答: 直接の回答ではなく別解として。最終的な目的が > > 3つの状態をフラグのように変数で管理したい > > > ということであるのなら、その三種の状態を表すクラスを定義して const で定義値を持たせる方式もあります。 例えば次のようなクラスを作っておけば ``` /** * 性別 */ class Gender { const UNKNOWN = 0; const MALE = 1; const FEMALE = 2; } ``` 次のような分岐をさせることができます。 ``` public function foo($gender) { switch ($gender) { case Gender::MALE: break; case Gender::FEMALE: break; case Gender::UNKNOWN: default: break; } } ``` この方式の利点としては: * 明示的に状態の意味合いを表す名前を付けることによって、マジックナンバーを避け、可読性を上げることができる * 仕様変更でステータスが4つ以上に増えても追随できる 逆に欠点としては: * タイプ量が増える なおタイプ量については今どきのIDEを使っているならコード補完が効くのでさほど問題にはならないという見方もできます。 一方で、クラス化したところで、比較するものは所詮ただのスカラー値でしかなく `Gender::MALE == Paid::YES` などといった無意味な比較もできてしまうため、さしてタイプセーフ性は望めません(PHPにまともな列挙型があればよかったのですが......)。 このようにメリット・デメリットがあるので、単なる boolean 値で保持するのか、あるいは状態クラスを定義するのかは、そのときの開発規模等との兼ね合いで考えるべきだと思われます。