PHPの変数 グローバルスコープとローカルスコープ

今回は、PHPの変数に関する学習メモです。PHPも、ActionScriptやJavaScriptと同じようにグローバルスコープとローカルスコープが存在しますが、その扱い方には違いがあるようです。ActionScriptやJavaScriptに慣れている私にとっては、慣れるのにちょっと時間がかかりそうです。

PHPでは、変数を使う場合、先頭に$記号を付けます。変数名には識別子を使用し、識別子の大文字と小文字は区別されます。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p>
<?php
$foo = 1;
$bar = NULL;
echo 'isset($foo) is ';
var_dump(isset($foo));
echo '<br />';
echo 'isset($bar) is ';
var_dump(isset($bar));
echo '<br />';
echo 'isset($hoge) is ';
var_dump(isset($hoge));
echo '<br />';
?>
</p>
</body>
</html>

上記のソース内のisset()は変数がセットされていればtrueを返し、セットされていない、または値がNULLの場合falseを返します。また、var_dump()関数は、引数で渡した変数の型や値を出力してくれます。引数は、カンマで区切ることにより、複数渡すことが可能なようです。

可変変数

PHPでは、変数に格納された文字列を別の変数の識別子として使用することができるようです。これは、すごく便利が良さそうです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p>
<?php
$baz = 1000;
$bazName = 'baz';
echo '$baz is ';
var_dump(${$bazName});
?>
</p>
</body>
</html>

グローバルスコープ

PHPブロックのすぐ内側はグローバルスコープとなり、グローバルスコープで定義された変数は、別のPHPブロックからもアクセスできます。PHPには、Perlのようなブロックスコープ(ブロック変数)は、存在しないようです。

ローカルスコープ

関数やクラスのメソッド内では、ローカルスコープとなります。ローカルスコープ内で定義された変数は、外側からアクセスすることは出来ません。これはいいとして、なんとローカルスコープでは、グローバルスコープにアクセス出来ないようです。これには、ちょっとびっくり。しかし、後述するglobalキーワードを使用すれば可能なようです。

globalキーワード

ローカルスコープ内でグローバルスコープの変数にアクセスしたい場合は、globalキーワードを使用します。もちろん、書き換えることも可能なので、複数人で作業する時は、気をつけた方が良さそうです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p>
<?php
// グローバルスコープ
$foo = "hello";
?>
<?php
echo "$foo<br />", PHP_EOL;
?>
</p>
<p>
<?php
// グローバルスコープ
$bar = 100;
function hoge()
{
  // ローカルスコープ
  $bar = 1000;
  $baz = "world";
}
hoge();
echo '$bar is ' . $bar . '<br />', PHP_EOL;
echo 'isset($baz) is ';
var_dump(isset($baz));
echo '<br />', PHP_EOL;
?>
</p>
<p>
<?php
function hogehoge()
{
  // globalキーワードでグローバルスコープの変数にアクセス
  global $bar;
  $bar = 10000;
}
hogehoge();
echo '$bar is ' . $bar, PHP_EOL;
?>
</p>
</body>
</html>