0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PHP】グローバル変数とglobalと$GLOBALS【PHP8初級試験対策】

Posted at

PHP8初級試験のためにまとめた内容を記載していきます。

global

基本的な仕様

グローバル変数(関数外の変数)と同名のローカル変数(関数内の変数)を変更しても、ローカル変数の値は変更されるがグローバル変数の値は変更されない。キホンのキ。

<?php
$val = "hoge";

function func01() {
    $val = "fuga";
    print "【A】".$val."\n"; 
}

func01();
print "【B】".$val."\n"; 
.Result
【A】fuga
【B】hoge

globalキーワードを使えば関数内からグローバル変数を変更できる。キホンのホ。

<?php
$val = "hoge";

function func01() {
    global $val;
    $val = "fuga";
    print "【A】".$val."\n"; 
}

func01();
print "【B】".$val."\n"; 
.Result
【A】fuga
【B】fuga

globalを宣言した時点で同名のローカル変数は参照されなくなる

globalキーワードを宣言した時点で、グローバル変数が参照されるようになり、同名のローカル変数は参照されなくなる。また、同一関数内でもglobalキーワードを宣言するまではローカル変数のほうが参照される。

<?php
$val = "hoge";

function func01() {
    $val = "fuga";    
    print "【A】".$val."\n";
    global $val;
    print "【B】".$val."\n";
}

func01();
print "【C】".$val."\n"; 
.Result
【A】fuga
【B】hoge
【C】hoge

globalで宣言した変数と同名のグローバル変数がまだ存在しない場合、新たにグローバル変数が作られる

値にはnullが代入される。エラーにはならない。

<?php
//$val = "hoge";

function func01() {
    $val = "fuga";
    global $val;
    print "【A】".$val."\n"; 
}

func01();      
$val = "hoge";  
func01();      
print "【B】".$val."\n"; 
.Result
【A】
【A】hoge
【B】hoge

globalは宣言した関数内でのみ有効

func01内では$valglobalで宣言しているので関数内の変更がグローバル変数に反映されているが、func02内ではglobalを宣言していないので関数内の変更はグローバル変数に反映されない。

<?php
$val = "hoge";

function func01() {
    global $val;
    $val = "fuga";
    print "【A】".$val."\n"; 
}

function func02() {
    $val = "piyo";
    print "【C】".$val."\n"; 
}

func01();
print "【B】".$val."\n";
func02();
print "【D】".$val."\n"; 
.Result
【A】fuga
【B】fuga
【C】piyo
【D】fuga

globalを使わずに関数内からグローバル変数は参照できない

厳密に言うと『globalまたは$GLOBALS』を使わずに参照することはできない。「ローカル変数に無ければ同名のグローバル変数を参照する」みたいな仕様は無い。

<?php
$val = "hoge";

function func01() {
    // $val = "fuga";
    // global $val;
    print "【A】".$val."\n"; 
}

func01();
print "【B】".$val."\n"; 
.Result
PHP Warning:  Undefined variable $val in /workspace/Main.php on line 7

globalを関数の外部で使ってもエラーにはならない

コード単体では特に意味はないが、このコードが外部から呼ばれた際に効力を発揮する。

<?php
$val = "hoge";

function func01() {
    $val = "fuga";
    print "【A】".$val."\n"; 
}

global $val;
func01();
print "【B】".$val."\n"; 
.Result
【A】fuga
【B】hoge

$GLOBALS

基本的な仕様

関数内からグローバル変数を参照できる。キホンのキ。特別何もしなくても関数外で宣言した変数は$GLOBALSの連想配列の中に自動で入る。

<?php
$val = "hoge";

function func01() {
    $val = "fuga";
    print "【A】".$GLOBALS['val']."\n"; 
}

func01();
print "【B】".$val."\n"; 
.Result
【A】hoge
【B】hoge

関数内からグローバル変数の変更もできる。キホンのホ。

<?php
$val = "hoge";

function func01() {
    $GLOBALS['val'] = "fuga";
    print "【A】".$GLOBALS['val']."\n"; 
}

func01();
print "【B】".$val."\n"; 
.Result
【A】fuga
【B】fuga

$GLOBALSはローカル変数に干渉しない

globalと異なり同名のローカル変数があっても干渉しないので、ローカル変数をそのまま使うことができる。

<?php
$val = "hoge";

function func01() {
    $val = "fuga";
    $GLOBALS['val'] = "piyo";
    print "【A】".$val."\n"; 
}

func01();
print "【B】".$val."\n"; 
.Result
【A】fuga
【B】piyo

$GLOBALSで存在しないグローバル変数に代入すると、グローバル変数が新たに作られる

代入した値をセットしたグローバル変数が新たに作られる。この辺りは通常の変数の仕様と同じ。

<?php
// $val = "hoge";

function func01() {
    $GLOBALS['val'] = "piyo";
    print "【A】".$GLOBALS['val']."\n"; 
}

func01();
print "【B】".$val."\n"; 
.Result
【A】piyo
【B】piyo

下の例の場合、func01でグローバル変数$valを作成しているので、その前に$valを参照しようとするとエラーになる。

<?php
// $val = "hoge";

function func01() {
    $GLOBALS['val'] = "piyo";
    print "【A】".$GLOBALS['val']."\n"; 
}

print "【B】".$val."\n"; 
func01();
print "【C】".$val."\n"; 
.Result
PHP Warning:  Undefined variable $val in /workspace/Main.php on line 9

$GLOBALSで存在しないグローバル変数を参照すると、エラーになる

これも通常の変数の仕様と同じ。「グローバル変数に無ければ同名のローカル変数を参照する」みたいな仕様も無い。

<?php
//$val = "hoge";

function func01() {
    $val = "fuga";
    print "【A】".$GLOBALS['val']."\n"; 
}

func01();
.Result
PHP Warning:  Undefined global variable $val in /workspace/Main.php on line 6

なので、こちらのコードもエラーになる。globalキーワードの宣言と混同しないように。

<?php
//$val = "hoge";

function func01() {
    $GLOBALS['val'];
}

func01();
.Result
PHP Warning:  Undefined global variable $val in /workspace/Main.php on line 5

実行環境

paiza.IOにて確認。執筆時点のバージョンは以下の通り。

PHP 8.1.31 (cli) (built: Nov 21 2024 13:09:45) (NTS)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?