【 PHP 】PHP8に入門してみた 87日目 PHPの基本 ( 制御構文 foreach応用 )

2022年11月11日

PHP8技術者認定初級試験 が始まるようなので 試験に向けて (できるだけ)勉強しようと思います! 使用する書籍は独習PHP 第4版(山田 祥寛)|翔泳社の本 (shoeisha.co.jp) となります。

制御構文

foreachの応用

foreachではテンポラリ変数(foreach($list as $data)の場合は$dataのこと)に代入される「もの」はです。

ですので、繰り返し内でテンポラリ変数の値を変更しても元の配列にはなんの影響もありません。

クラスオブジェクトは参照渡しになるのではないかと、現時点では思っています。

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PHPの基本</title>
</head>

<body>
    <?php
    // print命令は指定された文字列を表示するための命令です。
    $msg = 'こんにちは、変数の世界! <br />';

    print $msg;
    print 'こんにちは、皆さん! ';

    print '<br />';

    $list = ['1番', '2番', '3番', '4番', '5番'];
    foreach ($list as $value) {
        $value = 'aaa';
    }
    print_r($list);

    ?>
</body>

</html>

PHPではなんとテンポラリ変数に「アドレス」をコピーする参照渡しを行うことができます。

この方法を使用すると、繰り返し処理の中で元の配列を編集できてしまいます。

テンポラリ変数の先頭に「&」を付与することで実現できるようです。やってみます。

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PHPの基本</title>
</head>

<body>
    <?php
    // print命令は指定された文字列を表示するための命令です。
    $msg = 'こんにちは、変数の世界! <br />';

    print $msg;
    print 'こんにちは、皆さん! ';

    print '<br />';

    $list = ['1番', '2番', '3番', '4番', '5番'];
    foreach ($list as &$value) {
        $value = 'aaa';
    }
    print_r($list);

    ?>
</body>

</html>

本当ですね・・・😅

メモ

これは危険!?と感じるのですが、こういった仕組みがあるということは需要があるんでしょうね。

PHPPHP

Posted by raika@blog