代入演算子をつかった変数への代入には2種類あります。
「値による代入」と「参照による代入」です。
値による代入
値による代入とは?
一番よく見かける代入方法ですね。代入演算子の=を使って、変数に値を格納するために使用します。
変数にはデータ型があり、文字列型や整数型、小数型、配列型、オブジェクト型など様々な形があります。
<?php
$title = "PHP入門";
$number = 100;
$fruits_list = array(
"みかん",
"バナナ",
"キウイ",
);
?>
各データ型の初期化方法はそれぞれ別のページで説明しているので、よろしければごらんください。
複合代入演算子
複合代入演算子とは?
複合代入演算子すでに設定されている変数に対して行う計算をシンプルに表現する方法です。
まずは見てみましょう。
以下は算術演算子を使って計算した結果を代入した例です。
$price = 100;
$price = $price + 10;
echo $price . PHP_EOL; //110と表示される
元々の100に10を加算しています。
これをシンプルに記述することができます。
$price = 100;
$price += 10;
echo $price . PHP_EOL; //110と表示される
この += 部分が複合代入演算子です。
様々な複合代入演算子
+だけでなく様々な算術演算子と組み合わせて複合代入演算子として使えます。
主な複合代入演算子の一覧
+= |
-= |
*= |
**= |
.= |
乗算による複合代入演算子
$price = 100;
$price *= 10;
echo $price . PHP_EOL; //1000と表示される
文字列結合による複合代入演算子
$name = "山田";
$name .= "太郎";
echo $name . PHP_EOL; //山田太郎と表示される
参照による代入
変数の代入には実は2種類があると冒頭で言いました。
2つ目は参照による代入です。
まず、参照という概念について少しお話します。
参照とは?
今まで省略して説明してきましたが、変数には実は値が直接格納されているのではありません。値が格納してあるコンピュータのメモリ上の場所(アドレス)が格納されています。
$name1 = "山田";
$name2 = "佐藤";
$name3 = $name1; //代入して山田のコピーを作成
これを実行すると変数とアドレスの関係は、以下のようになります。
変数 | アドレス |
$name1 | 0 |
$name2 | 1 |
$name3 | 2 |
アドレス | 値 |
0 | 山田 |
1 | 佐藤 |
2 | 山田 |
PHPの内部処理として$name1の値を取得するとき、変数に代入された0というアドレスから「山田」という値を検索しにいきます。値はアドレスを通して間接的に参照されます。
また、$name3 = $name1のように同じ「山田」という値による代入が行われると、違うアドレス2の部分にコピー値が格納されています。
これが参照という仕組みです。
参照の代入
参照の代入は変数に間接的に値を結びつけるのではなく、直接アドレスを指定して代入する方法です。
具体的にはこのようにします。
$name1 = "山田";
$name2 = &$name1; //$name1の参照を$name2に直接代入
変数 | アドレス |
$name1 | 0 |
$name2 | 0 |
2つの変数が同じアドレスになりました。
アドレス | 値 |
0 | 山田 |
先ほどとは違い値がコピーされていません。
なので、1つの値を書き換えると2つの変数の値が書き換わることになります。
以下、例を示します。
$name1 = "山田";
$name2 = &$name1; //$name1の参照を$name2に直接代入
echo $name1 . ":" . $name2 . PHP_EOL; //山田:山田と表示される
$name1 = "佐藤"; //name1だけ書き換える
echo $name1 . ":" . $name2 . PHP_EOL; //佐藤:佐藤と表示される(両方書き換わった!)
このように&をつけて、直接アドレスを代入する方法を参照の代入と呼びます。
※なお、データ型のオブジェクト型はデフォルトで参照の代入が行われます。
コメント