PHP研修 each()関数と配列の可変変数のPHP7.2対応

 PHP研修中のyoshimotoです。
本日は、研修中でおこなった以下のPHP7対応をご紹介させていただきます。

* each() 関数のPHP7対応
* 配列の可変変数のPHP7対応

each()関数のPHP7対応

each()関数は、配列の内部ポインターを順次進めてくれる大変便利な関数ですが、
PHP7.2から非推奨となってしまいました。

以下のように複数の配列を同時に進行させることができます。

$num = 3;
$names = [‘apple’, ‘banana’, ‘orange’];
$prices = [100, 150, 80];

for ($i = 0; $i <$ num; $i++) {
    $name = each($names);
    $price = each($prices);
    $items[$name[“value”]] = $price[“value”]
}

print_r($items);
/* 結果
Array
(
    [apple] => 100
    [banana] => 150
    [orange] => 80
)
*/

PHP7.2では以下のようにcurrent()関数で要素を取り出し、
next()関数で次の要素に進むようにさせる必要があります。

$num = 3;
$names = [‘apple’, ‘banana’, ‘orange’];
$prices = [100, 150, 80];

for ($i = 0; $i <$ num; $i++) {
    $name = current($names); next($names);
    $price = current($prices); next(prices);
    $items[$name] = $price
}

print_r($items);
/* 結果
Array
(
    [apple] => 100
    [banana] => 150
    [orange] => 80
)
*/

わざわざ記述量が多くなる方向でバージョンアップされてしまうのは、
ちょっと納得がいきませんが、上記のように代替する関数があることなどで廃止されたようです。

配列の可変変数のPHP7対応

配列の可変変数の解析方法がPHP5とPHP7で変更されてしまいました。
以下のコードはPHP5では、何の問題もなく動作いたします。

$variables = [‘foo’, ‘bar’];
$$variables[0] = ‘Hi foo’; // $foo = ‘Hi foo’; 
$$variables[1] = ‘Hi bar’; // $bar = ‘Hi bar’;

しかしながらPHP7では、以下のようにエラーが出力されるようになります。

PHP Notice:  Array to string conversion
Notice: Undefined variable: foo

1行目のエラーは、配列を文字列として評価してしまった際に出力されるエラーと同一になります。
こちらは、PHP7では純粋に左から右へと評価するようになってしまい、
以下のように解析されるようになってしまったためです。

$ → $variables → [0]

真ん中の$variables変数をPHPが評価した際に内部の値(配列)を文字列(一番左の$にくっつけるための変数名)に変換しようとしてしまい、エラーが出力されたと考えられます。

従ってPHP7では、以下のように{}をつけて先に評価されるように修正する必要があります。

$variables = [‘foo’, ‘bar’];
${$variables[0]} = ‘Hi foo’; // $foo = ‘Hi foo’; 
${$variables[1] }= ‘Hi bar’; // $bar = ‘Hi bar’;

まとめ

PHP7では、処理速度が大幅に改善されるだけでなく、
関数に型を定義することができるようになり、安全性も高くなりました。

ですが、上記のようにPHP5とPHP7では互換性が無い機能が沢山あります。

以上、PHP7対応のご紹介でした。

木曜担当 yoshimoto



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム