はじめに
PHP の関数呼び出しでは「値渡し」「参照渡し」「オブジェクト渡し」で挙動が異なります。
特にオブジェクトは、参照を使わなくても「元の値を変更できる」という点が試験で狙われやすいポイントです。
目次
値渡しと参照渡しの違い
PHP では基本的に スカラ型(int, string, float, boolなど) は「値渡し」で渡されます。
関数の中で変数を書き換えても、呼び出し元の値は変わりません。
ただし &
をつけることで「参照渡し」にでき、その場合は呼び出し元の変数そのものを操作できます。
オブジェクトは参照的挙動をする
PHP5 以降、オブジェクトは「参照型のような挙動」をします。
変数にはオブジェクトそのものではなく オブジェクトへの参照(ハンドル) が入るため、
関数に渡すだけで同じインスタンスを共有できます。
実例コード
<?php
declare(strict_types=1);
error_reporting(-1);
class Hoge{
public int $num;
}
function func(int $i){
$i *= 100;
}
function funcR(int &$i){
$i *= 100;
}
function funcObj(Hoge $h){
$h->num *= 100;
}
$obj = new Hoge();
$obj->num = $num = 12;
func($num);
var_dump($num);
funcR($num);
var_dump($num);
funcObj($obj);
var_dump($obj);
ASCIIアートでイメージ理解
値渡し(func)
$num(12) ----コピー---> $i(12)
$i *= 100 → 1200 ($numには影響なし)
参照渡し(funcR)
$num(12)
↑
└--- $i (同じアドレスを参照)
$i *= 100 → $num も 1200 に変化
オブジェクト渡し(funcObj)
$obj ---> [ Hogeインスタンス#1 ]
└ num = 12
$h も同じインスタンスを参照
$h->num *= 100 → num = 1200
実行結果
int(12)
int(1200)
object(Hoge)#1 (1) {
["num"]=>
int(1200)
}
試験で狙われるポイント
- スカラ型はデフォルトで値渡し。参照渡しには
&
が必要。 - オブジェクトは「参照のように」扱われる(ただし
clone
を使えばコピーできる)。 - 値渡し/参照渡し/オブジェクト参照を混同させる問題がよく出る。
👉試験対策では「スカラ型とオブジェクトで挙動が違う」という点を意識しておくのが重要です。