NissyBlog

Life goes on.

??演算子を使ってみた

この記事はPHP Advent Calendar 2015 - Qiitaの9日目の記事になります。
こんにちは。@nissy0409240です。

風邪を引きました

突然ですが、昨日、風邪を引きました。
今日も若干、病み上がりです。
年末の忙しい時期に健康であることの大切さを痛感した次第です。

そして、本エントリーが日付を越えて投稿される最大の理由がこちらになります。
本当にすみませんでした。

風邪を引いたか判断する

さて、風邪を引いたか判断する方法は体温を計るというのが一般的です。
そこで、体温を引数として渡すと風邪か判断してくれる下記の様な
kenko_shindan.phpを書きました。

<?php
    $condition = isset($argv[1]) && 37.0 <= $argv[1] ? '風邪引いてます。病院に行きましょう。' : '健康です。';
    echo $condition, PHP_EOL;
$ php kenko_shindan.php 35.6
健康です。
$ php kenko_shindan.php 36.9
健康です。
$ php kenko_shindan.php 37.0
風邪引いてます。病院に行きましょう。
$ php kenko_shindan.php 39.0
風邪引いてます。病院に行きましょう。

??演算子で書き直す

ここで、私が動かしている環境でおもむろに、

$ php -v

コマンドを実行してみます。

$ php -v
PHP 7.0.0-dev (cli) (built: Oct 22 2015 19:40:42) ( NTS DEBUG )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0-dev, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

せっかくPHP7が入っていますので、
PHP7でリリースされた??演算子を使って先ほどのkenko_shindan.phpを書き直してみました。

<?php
    $condition = $argv[1] ?? '健康です。';
    if (37.0 <= $argv[1]) {
        $condition = '風邪引いてます。病院に行きましょう。';
    } else {
        $condition = '健康です。';
    }
    echo $condition, PHP_EOL;
$ php kenko_shindan.php 35.6
健康です。
$ php kenko_shindan.php 36.9
健康です。
$ php kenko_shindan.php 37.0
風邪引いてます。病院に行きましょう。
$ php kenko_shindan.php 39.0
風邪引いてます。病院に行きましょう。

上記の様に書き直すことが出来ました。

二つを比べてみた

二つの例を比較してみると、最初に三項演算子で書いた方は引数で渡された数値を判定し、
37.0より大きい数値が入力された時、入力された内容を書き換えて出力するまでを
演算子が処理する範囲内で行っていました。
しかし、??演算子で書いた方は入力された内容の書き換え部分は
演算子が処理する範囲外でないと行えません。

なぜなら、PHP: rfc:isset_ternaryで言及されているように

In such processing it is common to check for something's existence, and if it doesn't exist, use a default value.

??演算子では変数に値が代入されているか否かを判定するからです。
以上、PHP7で新しく追加された演算子により、新たな書き方が追加されとても面白かったという体験談でした。

※参考
PHP: rfc:isset_ternary