??演算子を使ってみた
この記事は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で新しく追加された演算子により、新たな書き方が追加されとても面白かったという体験談でした。