PHP8初級試験のためにまとめた内容を記載していきます。
global
基本的な仕様
グローバル変数(関数外の変数)と同名のローカル変数(関数内の変数)を変更しても、ローカル変数の値は変更されるがグローバル変数の値は変更されない。キホンのキ。
<?php
$val = "hoge";
function func01() {
$val = "fuga";
print "【A】".$val."\n";
}
func01();
print "【B】".$val."\n";
【A】fuga
【B】hoge
global
キーワードを使えば関数内からグローバル変数を変更できる。キホンのホ。
<?php
$val = "hoge";
function func01() {
global $val;
$val = "fuga";
print "【A】".$val."\n";
}
func01();
print "【B】".$val."\n";
【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";
【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";
【A】
【A】hoge
【B】hoge
global
は宣言した関数内でのみ有効
func01
内では$val
をglobal
で宣言しているので関数内の変更がグローバル変数に反映されているが、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";
【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";
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";
【A】fuga
【B】hoge
$GLOBALS
基本的な仕様
関数内からグローバル変数を参照できる。キホンのキ。特別何もしなくても関数外で宣言した変数は$GLOBALS
の連想配列の中に自動で入る。
<?php
$val = "hoge";
function func01() {
$val = "fuga";
print "【A】".$GLOBALS['val']."\n";
}
func01();
print "【B】".$val."\n";
【A】hoge
【B】hoge
関数内からグローバル変数の変更もできる。キホンのホ。
<?php
$val = "hoge";
function func01() {
$GLOBALS['val'] = "fuga";
print "【A】".$GLOBALS['val']."\n";
}
func01();
print "【B】".$val."\n";
【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";
【A】fuga
【B】piyo
$GLOBALS
で存在しないグローバル変数に代入すると、グローバル変数が新たに作られる
代入した値をセットしたグローバル変数が新たに作られる。この辺りは通常の変数の仕様と同じ。
<?php
// $val = "hoge";
function func01() {
$GLOBALS['val'] = "piyo";
print "【A】".$GLOBALS['val']."\n";
}
func01();
print "【B】".$val."\n";
【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";
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();
PHP Warning: Undefined global variable $val in /workspace/Main.php on line 6
なので、こちらのコードもエラーになる。global
キーワードの宣言と混同しないように。
<?php
//$val = "hoge";
function func01() {
$GLOBALS['val'];
}
func01();
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)