【PHP】推奨したい記述方法 チートシート

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倍

慣れていないと可読性が落ちますが、ビット演算子の方が速度が速いと言われています。

※ 小数点は、切り捨てになってしまうため、注意が必要です。

コメントを残す

CAPTCHA