PHPで気をつけた方が良い書き方
PHPは、緩い言語なので様々書き方ができてしまいます。それは初心者に優しい反面、自由過ぎが故にプログラムとしては動作するが推奨されない実装もいくつかあります。
これと行ったルールは無かったりするのですが、気をつけた方が良い書き方はいくつがあるので紹介します。
$str == 0
PHPの比較演算子には、==
と===
があります。
==
は緩い比較が行われ自動的に型変換が行われます。
一方、===
では厳密な比較が行われ型のチェックが行われます。
型変換が行われない分===
の方がより高速に、より安全に変数の検証が行うことができます。
Stringなど明らかに型が分かっている場合には、===
を使用しましょう。
<?php
$str = '1';
$foo = $str == 1; // true
$bar = $str === 1; // false
$hoge = $str === '1'; // true
“foo”
PHPで文字列を表す場合''
と""
を使用でき、""
では変数展開を行うことができます。
なので、読み手は、""
で書かれている場合、変数展開が行われていない場合でも、変数展開が行れることも想定してソースコードを読む必要性で出てきてしまいます。
より可読性を高めるためにも、変数展開を行わない場合は、''
をしない方が良いでしょう。IDEによっては、変数展開を行わない""
を使用していると怒られる場合もあります。
これと行ったルールは無いですが、チームで話し合って方針を固めたほうが良いでしょう。
<?php
// いっぱいあってツライ…
echo 'foo hoge bar';
echo "foo $hoge bar";
echo "foo ${hoge} bar";
echo 'foo ' . $hoge . 'bar';
<? ?>
short_open_tag = on
と設定すると<?php
の代わりに<?
だけでPHPのソースコードを書き始めることができます。しかし、short_open_tag = on
の状態でXMLをコピーするとソースコードが死にます。
そもそも<?php
を<?
に省略するメリットは何ですか?
<?xml version="1.0" encoding="UTF-8"?>
<? if($bool): ?>
foo
<? endif; ?>
また、この機能はPHP8で廃止されます。今後のPHPのアップデートのためにもショートオープンタグは使用しない方が良いでしょう。
1 ? 2 : 3 ? 4 : 5;
PHPでは、括弧を使用せずに三項演算子をネストすることは推奨されておらず、括弧を使用せずに三項演算子をネストすることを避けるために三項演算子をネストした際に一般的な言語とは逆の順序で評価される(左から評価)様になっています。
PHPでは言語レベルで評価順を分かりづらく、可読性を低くしているので括弧を使用せずに三項演算子をネストすることは止めましょう。
更にPHP7.4以降では括弧を使用せずに三項演算子をネストすることは非推奨となっており、PHP8ではコンパイルエラーになり将来的に使用することすらできなくなります。
https://www.php.net/manual/ja/migration74.deprecated.php
<?php
//非推奨の書き方
$foo = 1 ? 2 : 3 ? 4 : 5;
//推奨される書き方
$bar = (1 ? 2 : 3) ? 4 : 5;
$hoge = 1 ? 2 : (3 ? 4 : 5);
array_merge
PHP7.4でスプレッド演算子(...
)が追加されました。スプレッド演算子を使用することでarray_marge
と同等なことが高速にできる処理できます。
<?php
$arr1 = ['a', 'b'];
$arr2 = ['c', 'd', 'e'];
$arr3 = array_marge($arr1, $arr2); // ['a', 'b', 'c', 'd', 'e']
$arr4 = [...$arr1, ...$arr2]; // ['a', 'b', 'c', 'd', 'e']