0Pricing
PHP Academy · レッスン

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

PHPが関数のスコープを分離する仕組みと、globalキーワードの使い方を学びます。

「変数のスコープ:ローカルとグローバル」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。

PHPの変数スコープ

PHPでは、すべての変数にスコープ、つまりその変数にアクセスできるコードの範囲があります。

  • 関数の外で作成した変数はグローバルスコープに属します
  • 関数の中で作成した変数はローカルスコープに属します
  • PHPには、CやJavaScriptとは異なり、ブロックスコープはありません

ローカルスコープ

関数内の変数はローカル変数であり、関数が戻ると破棄されます。

<?php
function compute(): void {
    $result = 42;  // local variable
    echo $result;  // 42
}

compute();
echo $result ?? 'undefined';  // undefined — $result is gone

グローバル変数は自動的には見えません

多くの言語とは異なり、PHPの関数からはデフォルトでグローバル変数を参照できません。明示的に取り込む必要があります。

<?php
$message = 'Hello';

function printMessage(): void {
    echo $message ?? 'not visible';  // 'not visible'
    // $message from global scope is not accessible here
}

globalキーワード

関数内でglobal $varNameを使うと、グローバル変数にアクセスできます。

<?php
$counter = 0;

function increment(): void {
    global $counter;
    $counter++;
}

increment();
increment();
echo $counter;  // 2

$GLOBALSスーパーグローバル

$GLOBALSはすべてのグローバル変数を保持する配列であり、globalキーワードを使わずにどこからでもアクセスできます。

<?php
$total = 100;

function addTax(): void {
    $GLOBALS['total'] *= 1.18;  // 18% tax
}

addTax();
echo $total;  // 118

globalを避ける理由

globalを使いすぎると、隠れた依存関係が生まれ、関数のテストやデバッグが難しくなります。値は引数として渡すことを優先してください。

<?php
// Bad
$db = new PDO(/* ... */);
function getUsers(): array {
    global $db;
    return $db->query('SELECT * FROM users')->fetchAll();
}

// Good
function getUsers(PDO $db): array {
    return $db->query('SELECT * FROM users')->fetchAll();
}

static変数

static変数は関数呼び出しの間で値を保持しますが、関数内のローカル変数であることに変わりはありません。

<?php
function callCount(): int {
    static $count = 0;
    return ++$count;
}

echo callCount();  // 1
echo callCount();  // 2
echo callCount();  // 3

クロージャと変数のキャプチャ

クロージャ(無名関数)は、useを使って外側の変数をキャプチャできます。

<?php
$prefix = 'Mr';

$greet = function(string $name) use ($prefix): string {
    return "$prefix. $name";
};

echo $greet('Smith');  // Mr. Smith

参照によるキャプチャ

use (&$var)を使って参照でキャプチャすると、クロージャから外側の変数を変更できます。

<?php
$total = 0;

$add = function(int $n) use (&$total): void {
    $total += $n;
};

$add(10);
$add(5);
echo $total;  // 15

アロー関数

PHP 7.4のアロー関数(fn =>)は、外側のスコープを値で自動的にキャプチャするため、useは必要ありません。

<?php
$multiplier = 3;
$nums = [1, 2, 3, 4];

$result = array_map(fn($n) => $n * $multiplier, $nums);

print_r($result);  // [3, 6, 9, 12]

ネストした関数

PHPでは関数の中に別の関数を定義できますが、外側の関数を呼び出した後は、内側の関数もグローバルからアクセスできるようになります。

<?php
function outer(): void {
    function inner(): void {
        echo 'inner called';
    }
}

// inner(); // Fatal: undefined before outer() is called
outer();
inner(); // works now

クイックチェック

PHP関数内のstatic変数は何をしますか。

まとめ:変数スコープ

PHPにおけるスコープの主なルール:

  • 関数には独自のローカルスコープがあります
  • グローバル変数はglobalで取り込む必要があります
  • 代わりに$GLOBALS['name']を使うこともできます
  • static変数は、関数内で呼び出しをまたいで値を保持します
  • クロージャはuseで外側の変数をキャプチャします
  • アロー関数は値によるキャプチャを自動的に行います

よくある質問

「変数のスコープ:ローカルとグローバル」レッスンは無料ですか?

はい。「変数のスコープ:ローカルとグローバル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。

「変数のスコープ:ローカルとグローバル」で何を学びますか?

PHPが関数のスコープを分離する仕組みと、globalキーワードの使い方を学びます。 ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

PHP Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「変数のスコープ:ローカルとグローバル」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPHP Academyレッスンでコードを書いて実行できますか?

はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 関数の定義と呼び出し
  2. デフォルトパラメーターと可変長パラメーター
  3. 変数のスコープ:ローカルとグローバル
  4. 匿名関数とクロージャ
← PHP Academyに戻る