それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

php も三項演算子を簡潔に! ?:

三項演算子大好きです。

簡潔に書ける三項演算子

<?php
$params = @$params ?: array();

ときどき、コーディング規約で「三項演算子は禁止」とか言う人いるけど、合理的理由が「読みにくい」じゃ納得出来ない。。。かなしい。

結局はエディタで三項演算子のマクロ展開を書くことになってですね・・・不毛

三項演算子はそれなりに良さがある。

<?php
if( !$a ) {
  $a = 1;
} 

これを、一行にまとめると読みづらい。

<?php
if( !$a ) $a = 1;

if には必ず、ブレイスつけてブロック化しろとかコーディング規約もあったりして。

三項演算子読みやすい

<?php
$a = ($a) ? $a : 1;

簡潔にかける三項演算子

なんと、デフォルト値省略できたんですね

<?php
$a = 2;
$a = ($a) ?: 1;
echo $a ; //=> 2

便利ですね

未定義な変数をどうする?

でも未定義な変数を初期化したい時にどうするんだ?

PHP Notice:  Undefined variable: a in /Users/takuya/Desktop/test.php on line 5

@ つけちゃえ

これが冒頭のサンプルです。超可読性アップですよね。

<?php
$a = @$a ?: 1;
echo $a ; //=> 2

OKWAVeやqiita 読んでたら@ つけると「エラー抑制でデバッグが手間、処理遅くなる」とか言う人いた、

でも、この関数呼び出しですらない@に文句は言えないだろう!

でもコレが出来ない

三項演算子を使うとちょっと楽になった、PHPですが、Rubyできてるコレが出来ない。

a = ( ARGV[0] || "default" )
puts a
#!/bin/env ruby
a ||= 1
puts a #=> 1

OR比較がTRUE/FALSEなのはなんとかならないですかねぇ。。。

まぁ、出来なくても余り困らないんだけど。

php 7 (5.7)から

<?php

$a = @$a ?? 1;
echo $a ; //=> 2

が出来たので、undefined or が書けるようになった。

コーディング規約の 気持ち悪さといえば

三項演算子より、DIRECTORY_SEPARATORやPHP_EOLのほうが気持ち悪さ半端ない。

最近はWindowsでもスラッシュをパス名に解釈してくれるだろうに・・・

PHPを書く人に中途半端なのが多くて、無駄にチェック作業や規約が増えてクソって言われているのでは、、、そんな気がするのは私だけ?

関連資料

規約が増えていく好例、適当に書くから規約が多くなって。。。

orangestar.hatenadiary.jp

参考資料

エルビス演算子ってGroovy呼び名なので、PHPでその呼び名を使うのが相応しいかわからなかった。

http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html

https://hydrocul.github.io/wiki/programming_languages_diff/etc/elvis.html

エルビス演算子でスマートに変数を初期化 - Qiita