ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
変数スコープの基本
PHP の変数は定義した場所によって参照できる範囲が決まる仕組みです。これをスコープと呼びます。
<?php
$globalVar = 'グローバル';
function testScope() {
// ❌ ここから $globalVar は見えない
echo $globalVar ?? 'undefined';
// → undefined (PHP 8+ は警告も出る)
$localVar = 'ローカル';
echo $localVar; // OK
}
testScope();
// ❌ 関数内の $localVar は外から見えない
echo $localVar ?? 'undefined';
// → undefined
global キーワード
関数内からグローバル変数を読み書きしたい場合に global を宣言します:
<?php
$config = ['debug' => true];
function showConfig() {
global $config; // ★ グローバルから取り込む
var_dump($config);
}
showConfig(); // ['debug' => true]
// 同じことは $GLOBALS でも可能
function showConfig2() {
var_dump($GLOBALS['config']);
}
// ⚠️ アンチパターン: グローバル変数は依存関係が見えなくなる
// 推奨は引数渡し or DI
function showConfigBetter(array $config) {
var_dump($config);
}
showConfigBetter($config);
static 変数: 関数呼び出しを跨いで保持
<?php
function counter() {
static $count = 0; // 初回のみ初期化、以降は前回値を保持
$count++;
return $count;
}
echo counter(); // 1
echo counter(); // 2
echo counter(); // 3
// クラスの static プロパティとは別物(こちらは関数ローカル)
class Singleton {
private static ?self $instance = null;
public static function get(): self {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}
関数引数: 値渡し vs 参照渡し
<?php
// 値渡し(デフォルト)
function addOneValue(int $n): void {
$n++;
// 関数内の変更は呼び出し元に影響しない
}
$x = 10;
addOneValue($x);
echo $x; // 10
// 参照渡し(& を引数前に)
function addOneRef(int &$n): void {
$n++;
}
$y = 10;
addOneRef($y);
echo $y; // 11
// 配列も同じ。配列は値渡しでもコピーされるので注意
function pushOne(array &$arr): void {
$arr[] = 'new';
}
$items = ['a'];
pushOne($items);
print_r($items); // ['a', 'new']
Closure と use 句
無名関数(Closure)は外側スコープを自動では取り込まないのが PHP の特徴。use で明示的に渡します:
<?php
$prefix = '[INFO] ';
// ❌ NG: $prefix は Closure 内では未定義
$logger = function ($msg) {
echo $prefix . $msg;
// → Undefined variable: prefix
};
// ✅ use で取り込む(値渡し)
$logger = function ($msg) use ($prefix) {
echo $prefix . $msg;
};
$logger('ok'); // [INFO] ok
// 参照渡し: Closure 内で外側変数を変更できる
$count = 0;
$inc = function () use (&$count) {
$count++;
};
$inc(); $inc(); $inc();
echo $count; // 3
// 値渡しと参照渡しのコンビ
$adder = function ($n) use ($prefix, &$count) {
$count += $n;
return $prefix . $count;
};
PHP 7.4+ Arrow Function は自動キャプチャ
<?php
$prefix = '[INFO] ';
// ✅ Arrow Function は use 不要、自動キャプチャ
$logger = fn($msg) => $prefix . $msg;
echo $logger('ok'); // [INFO] ok
// 1 式しか書けない(return が暗黙)
// 複数行 / 副作用が必要なら通常の Closure を使う
// 配列操作で重宝
$users = [['age' => 30], ['age' => 20], ['age' => 40]];
$ages = array_map(fn($u) => $u['age'], $users);
$adults = array_filter($users, fn($u) => $u['age'] >= 20);
// 注意: Arrow Function は値渡し(参照渡し不可)
$count = 0;
$inc = fn() => $count++; // 外側 $count は変わらない
$inc();
echo $count; // 0
クラスのスコープ修飾子
| 修飾子 | 意味 | アクセス |
|---|---|---|
public | 公開 | どこからでも |
protected | 保護 | 同クラス + 継承先 |
private | 非公開 | 同クラスのみ |
self:: | クラス自身 | 定義したクラス参照 |
static:: | 遅延静的束縛 | 呼び出し元クラスを参照 |
parent:: | 親クラス | 継承元参照 |
<?php
class Base {
public static function create(): self {
return new self(); // 常に Base
}
public static function createStatic(): static {
return new static(); // 呼び出し元のクラス
}
}
class Child extends Base {}
var_dump(Base::create()); // Base
var_dump(Child::create()); // Base ★ (self は静的束縛)
var_dump(Child::createStatic()); // Child ★ (static は遅延静的束縛)
ベストプラクティス
- グローバル変数は使わない: テスト困難・依存関係不明・並列実行で衝突
- 関数 / メソッドは引数で必要な値を受ける
- クラスはDI コンテナ (Container) 経由で依存を注入
- Closure はuse 句を最小限に(多すぎたら別関数化)
static変数はメモ化など限定用途のみ。状態を持つならクラス化
FAQ
Q: global $var と $GLOBALS["var"] どちらが推奨?
A: どちらも非推奨だが、止むを得ず使うなら $GLOBALS。理由は global 宣言を後で見落としやすいから。最善はどちらも使わず引数渡し。
Q: Arrow Function で複数行書きたい
A: 仕様上 1 式のみ。複数行が必要なら通常の function () use (...) {} を使ってください。
Q: self:: と static:: の使い分け
A: 継承先で挙動を上書きしたいなら static::(遅延静的束縛)。固定したいなら self::。ファクトリメソッドは static:: が一般的です。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?