今日も適当ダイアリー

PHP や Javascript や Symfony、BEAR.Sunday などのWeb周りのことを中心に。それ以外のことも気まぐれに投稿します。

PHPでもif文の代わりに三項演算子(条件演算子)が利用できる

タイトルの通りなのですが、PHPでも三項演算子(条件演算子)が利用できるので、特定の場合では、if文を条件演算子に置き換えたほうが、可読性が増す場合があります。
そこで、三項演算子を知らない人のために、ここでちょっと解説しておきます。

条件 ? 真の場合の値 : 偽の場合の値

構文は上記の通りです。
で、これを利用すると条件によって異なる値を変数などに適用する際に、簡潔に記述することができます。

例えば、

<?php
    if (preg_match('\A\d+\z', $_GET['id'])) {
        // $_GET['id'] が数値のみなら、それを $id とする
        $id = $_GET['id'];
    } else {
        // 入力値が不正ならデフォルト値(1)
        $id = 1;
    }

のように、ユーザー入力のチェックを行い、入力チェックに通らなければ、デフォルト値を使うような記述を三項演算子で書き換えると、簡潔に記述することができます。

<?php
    $id = (preg_match('\A\d+\z', $_GET['id'])) ? $_GET['id'] : 1;

もちろん、return 文などでも使うことが可能です。

<?php
    function getid() {
        return (preg_match('\A\d+\z', $_GET['id'])) ? $_GET['id'] : 1;
    }

ただし、あくまでも三項演算子は式なので、値としてはではなく、式の結果として評価されます。
よって、結果をリファレンスとして返す関数では下記のように記述する事はできません。(期待している動作は行われません。)

    function &get($str) {
        return (isset($_POST['mode'])) ? $_POST['mode'] : $_GET['mode']
    }

    $get = &get('id');

上記コードは、下記のように書けば、期待している通りに動作します。

    function &get($str) {
        if (isset($_POST[$str])) {
            return $_POST[$str];
        } else {
            return $_GET[$str];
        }
    }

    $get = &get('id');