解 説

変数を使う場合に、もし関数を使用しないならどこで変数を宣言しても、その変数の下であればどこでも使用することができます。
けれども、関数を使用した場合は決まり事があります。
関数の中で宣言した変数はその関数内だけでしか使用できません。また、注意すべき点として関数の外にある変数を直接読み込むこともできません。この後者の決まり事につまづく事が多いですからしっかりと覚えておきましょう。

関数内だけで使えるローカル変数

関数の中で宣言した変数は関数の中で使用します。
サンプル
PHPコード

hello();
function hello(){
  $str = "Hello!";
  echo $str;
}

次のように書くとエラーになります。
サンプル
PHPコード

hello();
function hello(){
  $str = "Hello!";
}
echo $str;

グローバル変数の使い方

関数の外で宣言された変数はグローバル変数といいます。
グローバル変数を関数内でそのまま読み込むことはできません。次の例はグローバル変数を関数に読み込んでエラーになる例です。

サンプル
PHPコード

$str = "Hello!";
hello();
function hello(){
  echo $str;
}

グローバル変数を関数に読み込む方法

グローバル変数を関数内で使用するにはglobalキーワードを使用します。
そうすることでグローバル変数をローカルスコープに持ち込むことが可能となり、関数内で使用することができるようになります。

サンプル
PHPコード

$str = "Hello!";
hello();
function hello(){
  global $str;
  echo $str;
}

もっと具体的な例として入力ボックスの値をsubmitして得た値を表示する仕組みをみてみましょう。

サンプル
PHPコード

if(isset($_POST["name"])){
  $name = htmlspecialchars($_POST["name"]);
  hello();
}else{
  echo <<< EOS
  <form method="post">
  <input type="text" name="name">
  <input type="submit">
  </form>
EOS;
}
function hello(){
  global $name;
  echo "ようこそ、{$name}さん";
}

次の例のように、globalキーワードを使用しなかった例はエラーになります。

エラーになるサンプル
PHPコード

if(isset($_POST["name"])){
  $name = htmlspecialchars($_POST["name"]);
  hello();
}else{
  echo <<< EOS
  <form method="post">
  <input type="text" name="name">
  <input type="submit">
  </form>
EOS;
}
function hello(){
  // global $name;
  echo "ようこそ、{$name}さん";
}

スーパーグローバル変数とは

スーパーグローバル変数は、globalキーワードを使用せずに、どこからでも呼び出すことが可能な特殊なグローバル変数です。
$_GETや$_POSTなどもスーパーグローバル変数で、どこからでもそのまま呼び出すことができます。

関数内に直接$_POSTを読み込むサンプルです。

サンプル
PHPコード

if(isset($_POST["name"])){
  hello();
}else{
  echo <<< EOS
  <form method="post">
  <input type="text" name="name">
  <input type="submit">
  </form>
EOS;
}
function hello(){
  $name = htmlspecialchars($_POST["name"]);
  echo "ようこそ、{$name}さん";
}