《PHP8上級試験対策》 値渡し・参照渡し・オブジェクトの挙動を理解する

  • URLをコピーしました!

はじめに

PHP の関数呼び出しでは「値渡し」「参照渡し」「オブジェクト渡し」で挙動が異なります。
特にオブジェクトは、参照を使わなくても「元の値を変更できる」という点が試験で狙われやすいポイントです。

キーワード: 値渡し / 参照渡し / オブジェクト参照 / PHP8 / スカラ型

目次

値渡しと参照渡しの違い

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 を使えばコピーできる)。
  • 値渡し/参照渡し/オブジェクト参照を混同させる問題がよく出る。

👉試験対策では「スカラ型とオブジェクトで挙動が違う」という点を意識しておくのが重要です。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次