My Photo

« WordPressでsession_start()など初期化処理をしたい | Main | ディレクトリ・トラバーサル脆弱性 »

February 02, 2014

PHPメモ036:グローバル変数のクリア

PHPのグローバル変数のクリアについて、基本的なことなのにわかってなかったのでまとめた。
まあグローバル変数を多用すること自体どうかと思うが、大人の事情でグローバル変数を使わざるを得ないので。

関数内でグローバル変数をunset() した場合、そのローカル変数のみが破棄される。呼び出し側の変数は前と同じ値を保持する。

コードでの例をあげる。PHPのバージョンは5.2.17。古いな。
下記 global_func.php のグローバル変数を参照・変更する関数が定義されている。

<?php
function setGVar() {
	global $gVar;
	
	$gVar = 1;
}

function unsetGVar() {
	global $gVar;
	
	unset($gVar);
}

function printGVar() {
	global $gVar;
	
	print "gVar=" . var_export($gVar, TRUE);
}

例1: コード

<?php
include 'global_func.php';

func1();
print ":gVar=" . var_export($gVar, TRUE) . "\n";
exit;


function func1() {
	global $gVar;
	
	setGVar();
	
	$gVar = NULL;
	
	printGVar();
	print "func1:gVar=" . var_export($gVar, TRUE) . "\n";
}

結果

printGVar:gVar=NULL
func1:gVar=NULL
:gVar=NULL

例2: コード

<?php
include 'global_func.php';

func2();
print ":gVar=" . var_export($gVar, TRUE) . "\n";
exit;


function func2() {
	global $gVar;
	
	setGVar();
	
	unset($gVar);
	
	printGVar();
	print "func2:gVar=" . var_export($gVar, TRUE) . "\n";
}

結果

printGVar:gVar=1
func2:gVar=NULL
:gVar=1

例3: コード

<?php
include 'global_func.php';

func3();
print ":gVar=" . var_export($gVar, TRUE) . "\n";
exit;


function func3() {
	global $gVar;
	
	setGVar();
	
	unset($GLOBALS['gVar']);
	
	printGVar();
	print "func3:gVar=" . var_export($gVar, TRUE) . "\n";
}

結果

printGVar:gVar=NULL
func3:gVar=1
:gVar=NULL

例4: コード

<?php
include 'global_func.php';

func4();
print ":gVar=" . var_export($gVar, TRUE) . "\n";
exit;


function func4() {
	global $gVar;
	
	setGVar();
	
	unsetGVar();
	
	printGVar();
	print "func4:gVar=" . var_export($gVar, TRUE) . "\n";
}

結果

printGVar:gVar=1
func4:gVar=1
:gVar=1

結構複雑だ。
例1の "=" で代入した結果はどのスコープに対しても有効。
例3のunset($GLOBALS['<グローバル変数名>']) は例1と同じかと思っていたが、unset() を実行したスコープでは効いていなかった。
例2と例3は真逆の結果だ。

参考サイト:
PHP: unset - Manual グローバル変数の扱い

« WordPressでsession_start()など初期化処理をしたい | Main | ディレクトリ・トラバーサル脆弱性 »

PHP」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/59056358

Listed below are links to weblogs that reference PHPメモ036:グローバル変数のクリア:

« WordPressでsession_start()など初期化処理をしたい | Main | ディレクトリ・トラバーサル脆弱性 »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof