PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPのリファレンス(参照)入門:unset()してもグローバル変数は削除されない


はじめに

PHPの多くの構文は、内部的にリファレンス(参照)の仕組みを利用して実装されています。本記事では、その中でも特に重要な挙動として、関数内でグローバル変数へのリファレンスをunset()で解除しても、グローバルスコープ上の元の変数は削除されないという点について解説します。

サンプルコード

<?php
$var1 = 'Hello World';
function myfunction(){
    global $var1;
    $var2 =&$var1;
    echo "$var1, $var2 \n";
    $var2="Hello PHP";
    echo "$var1, $var2 \n";
    unset($var1);
}
myfunction();
echo "$var1\n";
?>

処理の流れ

まず、グローバル変数$var1に「Hello World」を代入します。関数myfunction()内では、global $var1;宣言によりローカル変数$var1がグローバル変数$var1へのリファレンスになります。さらに$var2 =&$var1;によって、$var2も同じ値を参照するようになります。

この状態で$var2に「Hello PHP」を代入すると、リファレンスを経由しているため$var1の内容も連動して書き換わります。その後に実行されるunset($var1)は、あくまで関数内の変数名と値との結び付きを解除しているだけです。グローバル空間にある$var1そのものは削除されないため、関数の外で出力すると値がそのまま残っていることが確認できます。

実行結果

Hello World, Hello World
Hello PHP, Hello PHP
Hello PHP

このように、unset()によるリファレンスの解除は元の変数に影響を与えず、グローバル変数$var1は無事に保持されています。

debug_zval_dump()で参照を調べる

ある変数に対して他の変数からのリファレンスがいくつ張られているか(参照カウント:refcount)を確認したい場合は、debug_zval_dump()関数を使用すると便利です。リファレンスの挙動が意図したとおりにならない場合のデバッグや、PHP内部の参照の仕組みを理解する際に役立ちます。


  1. PHPのnamespaceキーワードと__NAMESPACE__定数の使い方を徹底解説

    はじめにPHPでは、namespace キーワードを使って名前空間を定義します。同時にこのキーワードは演算子としても機能し、現在の名前空間に属する要素へ明示的にアクセスしたい場合にも利用できます。さらに、__NAMESPACE__ 定数は、現在の名前空間の名前を文字列として返します。本記事では、これら2つの機能の基本的な使い方から実践的な活用例まで、サンプルコード付きでわかりやすく解説します。__NAMESPACE__ 定数とは__NAMESPACE__ 定数は、名前が付けられた名前空間の中で参照すると、その名前空間の名前を返します。一方、グローバル空間(名前空間が宣言されていない状態)では、

  2. 【PHP入門】preg_replaceで句読点・不要な記号を削除する方法

    PHPで文字列から句読点や不要な記号を削除したい場合は、preg_replace関数と正規表現を組み合わせるのが最も一般的です。「残したい文字」以外をすべて空白に置き換えることで、句読点をまとめて取り除けます。ここでは、目的別に3つのパターンを紹介します。 1. 英字と数字だけを残す方法 英字と数字以外のすべての文字(カンマ、ピリオド、記号など)を半角スペースに置き換える例です。 <?php $s = "Hello, my name is Bobby !? I am 8 years !"; print_r( preg_replace('/[^a-z0-9]+/