ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
static method と static property の基本
class Counter {
public static int $count = 0;
public static function increment(): void {
self::$count++;
}
public static function reset(): void {
self::$count = 0;
}
}
// インスタンス化せずに使う
Counter::increment();
Counter::increment();
echo Counter::$count; // 2
Counter::reset();
呼び出し方:
ClassName::method()— 通常self::method()— 記述したクラス内からstatic::method()— 呼び出し元クラス基準 (Late Static Binding)parent::method()— 親クラスの static を呼ぶ
self:: と static:: の違い (Late Static Binding)
class Animal {
public static function create(): static {
return new self(); // ← Animal 固定
}
public static function createV2(): static {
return new static(); // ← 呼び出したクラス (子も含む)
}
}
class Dog extends Animal {}
var_dump(Animal::create()); // Animal
var_dump(Dog::create()); // Animal (self だから)
var_dump(Dog::createV2()); // Dog (static だから)
| キーワード | 指すもの | 用途 |
|---|---|---|
self:: | 記述したクラス (Early Binding) | 子クラスでも親の挙動を維持したい |
static:: | 呼び出し元クラス (Late Static Binding, PHP 5.3+) | 子クラスで挙動を上書きしたい |
parent:: | 親クラス | 親の static メソッドを呼ぶ |
Static Factory パターン
class User {
private function __construct(
public string $name,
public string $email,
) {}
public static function register(string $name, string $email): static {
// バリデーション
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException();
}
return new static($name, $email);
}
public static function fromArray(array $data): static {
return new static($data['name'], $data['email']);
}
}
$u = User::register('taro', 'taro@example.com');
$u = User::fromArray(['name' => 'jiro', 'email' => 'j@example.com']);
Singleton (推奨しない例)
class DBConnection {
private static ?self $instance = null;
private PDO $pdo;
private function __construct() {
$this->pdo = new PDO(/* ... */);
}
public static function getInstance(): self {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}
DBConnection::getInstance()->pdo->query('SELECT 1');
// ❌ 問題: テストでモック化不能、グローバル状態
// → DI コンテナ (Laravel Service Container) の使用を推奨
関数内 static 変数 (関数呼出間で値を保持)
function counter(): int {
static $count = 0; // 初回のみ初期化
return ++$count;
}
counter(); // 1
counter(); // 2
counter(); // 3
// → 関数を抜けても値が消えない
// 用途: メモ化
function expensiveCalc(int $n): int {
static $cache = [];
if (isset($cache[$n])) return $cache[$n];
return $cache[$n] = /* 重い計算 */ $n * $n;
}
static の問題点とテスト
// ❌ 静的依存はテストしにくい
class OrderService {
public function place(Order $o): void {
$now = DateTime::now(); // ← 直接呼び出し
Mailer::send($o->email); // ← 静的呼び出し → モック不能
}
}
// ✅ DI でインスタンス注入
class OrderService {
public function __construct(
private ClockInterface $clock,
private MailerInterface $mailer,
) {}
public function place(Order $o): void {
$now = $this->clock->now();
$this->mailer->send($o->email);
}
}
// → テストで Clock / Mailer のモックを差し替え可能
戻り値型としての static (PHP 8+)
// Fluent Builder で便利
class QueryBuilder {
private array $wheres = [];
public function where(string $col, $val): static {
$this->wheres[] = [$col, $val];
return $this;
}
}
class CustomQueryBuilder extends QueryBuilder {
public function newMethod(): static { /* ... */ return $this; }
}
// 子クラスで連鎖しても型が CustomQueryBuilder に推論される
(new CustomQueryBuilder())->where('id', 1)->newMethod();
定数 const と static の使い分け
class Config {
// 定数: 不変
public const MAX_RETRY = 3;
// static property: 変更可
public static int $timeout = 30;
}
Config::MAX_RETRY; // 3
Config::$timeout = 60; // 変更可
// 定数は ::CONSTANT、static は ::$variable
よくあるエラー
| エラー | 原因 | 対処 |
|---|---|---|
Using $this when not in object context | static method 内で $this 使用 | self / static / new self() を使う |
Non-static method ... cannot be called statically | 通常メソッドを ::method() で呼んだ | static にするか new でインスタンス化 |
Cannot access static:: when no class scope is active | クラス外で static:: | クラス内/メソッド内で使う |
FAQ
Q: static を使うべきか避けるべきか?
A: ユーティリティ関数 (純粋関数) なら OK。状態を持つもの (DB 接続 / 設定) は DI 推奨。
Q: self と static、どっち書けばいい?
A: 継承を考慮するなら static:: (LSB)、固定なら self::。最近は static 派が増加。
Q: static メソッドはなぜテストしにくい?
A: モックライブラリの多くがインスタンスメソッドにしか対応しないため。回避するには「静的呼び出しをラップするインスタンスメソッドを作る」or「DI で差し替える」。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子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
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 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
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 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
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?