PHP推奨したい記述方法のチートシート
速度面だけでなく、可読性も考慮して、私が普段から気をつけている記述方法をまとめました。
参考にどうぞ。
array_key_existsは使用しない
array_key_existsはPHP7.4.x以降に非推奨となっています。(参考URL: https://www.php.net/manual/ja/migration74.deprecated.php)
また、issetは言語構造であるため、arra_key_existsよりも高速に動作します。
$array = ['key1' => 'value1', 'key2' => 'value2'];
$isExistKey = array_key_exists('key1', $array);
代わりにissetを使用する。
$array = ['key1' => 'value1', 'key2' => 'value2'];
$isExistKey = isset($array['key1']);
※ issetの場合は、値にnullが入っている時に、キーが存在しても、falseを返すため、注意が必要です。
三項演算子、エルビス演算子等を活用する
これらの演算子は、シンプルに記述でき、使用箇所によっては、可読性を向上させますが、ネストする場合等、複雑になる場合の使用はおすすめできません。
三項演算子
通常の記述
if($number % 2 === 0){
echo '偶数';
}else{
echo '奇数';
}
三項演算子
echo $number %2 == 0 ? '偶数' : '奇数';
エルビス演算子
通常の記述
if(!empty($sideburns)){
echo 'Presley';
}
エルビス演算子
empty($sideburns) ?: echo 'Presley';
※ エルビス演算子の名前の由来は、本当にプレスリーらしいです...。(参考URL: https://qiita.com/ito_gen/items/7650454fbb27baefc1f7)
null合体演算子
通常の記述
if(is_null($val)){
echo '値がnullです';
}
null演算子
echo $val ?? '値がnullです';
※ PHP7から利用できます。
宇宙船演算子
通常の記述
if($a > $b){
return 1;
}elseif($a == $b){
return 0;
}elseif($a < $b){
return -1;
}
宇宙船演算子
return $a <=> $b;
宇宙船演算子では、
左辺が大きい場合に、1
同値の場合に、0
右辺が大きい場合に、-1
を返します。
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
※ PHP7から利用できます。型の比較は行われません。
nullセーフ演算子
通常の記述
$user = new User();
$age = 0;
if(!empty($user){
$age = $user->getAge();
}
nullセーフ演算子
$user = new User();
$age = $user?->getAge() ?? 0;
PHP8以前までは、インスタンスが空($userがnull)であった場合には、エラーが発生していましたが、nullセーフ演算子を使用することで、関数アクセスができない場合には、nullが返るよう記述することができるようになりました。
※ PHP8から利用できます。プロパティアクセスであれば、PHP8以前でもnull安全です。
配列からランダムに取り出す時には、shalfullを使用しない
良くない例
シンプルに記述できて見栄えは良いですが、配列が長くなるとかなり重くなります。
$fruits = ['apple', 'orange', 'grape'];
shuffle($array);
echo $array[0];
※ 速度比較を行なっているサイトがありました。(参考URL: https://ameblo.jp/ca-seo/entry-10128785884.html)
良い例
こちらは第二引数の大きさが増えるほど重くなります。
$fruits = ['apple', 'orange', 'grape'];
$rand_keys = array_rand($array, 3);
echo $array[$rand_keys[0]];
もっと良い例
乱数生成の関数は、mt_randの他にrandがありますが、mt_randの方が数倍早く動作すると言われています。
$fruits = ['apple', 'orange', 'grape'];
$rand = mt_rand(0, count($array) - 1);
echo $array[$rand];
負の数を返したくない時は、maxを活用する
読みにくい記述
if(0 > $number){
return 0;
}
return $number
読みやすい記述
return max(0, $number);
※ 逆もしかり、特定値以上は返さないようにする場合は、min関数を使用します。
前置インクリメント(デクリメント)を使用する
後置の場合
for($i = 0; $i < 100; $i++){}
前置の場合
for($i = 0; $i < 100; ++$i){}
※ 前置の方が実行速度が速いと言われています。そこまで大幅に変わるわけではないので、レビュー指摘する程ではないと思いますが...。
同じ型の比較時には==ではなく===を使用する
良くない例
1 == 1
良い例
1 === 1
==の場合には、キャスト後に比較されるため、速度が落ちるようです。
同じ型だとわかっている場合には、===を使用するよう心がけましょう。
ビット演算子を活用する
通常の記述方法
$number / 2;
$number / 4;
$number * 2;
$number * 4;
ビット演算子
$number >> 1; // 半分
$number >> 2; // 4分の1
$number << 1; // 2倍
$number << 2; // 4倍
慣れていないと可読性が落ちますが、ビット演算子の方が速度が速いと言われています。
※ 小数点は、切り捨てになってしまうため、注意が必要です。