変数のスコープ:ローカルとグローバル
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; // 118globalを避ける理由
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 関数の定義と呼び出し
- デフォルトパラメーターと可変長パラメーター
- 変数のスコープ:ローカルとグローバル
- 匿名関数とクロージャ