ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
基本
class TextUtil
{
public static function slug(string $s): string
{
return strtolower(preg_replace('/[^a-zA-Z0-9]+/', '-', trim($s)));
}
public static function truncate(string $s, int $len = 20): string
{
return mb_strlen($s) <= $len ? $s : mb_substr($s, 0, $len) . '…';
}
}
echo TextUtil::slug('Hello World'); // hello-world
echo TextUtil::truncate('長い文章です', 3); // 長い文章…
// インスタンスを作る必要はない
$u = new TextUtil();
echo $u::slug('Hello'); // 呼べるが Class::method() と書くほうが明確
$this は使えない
class Sample
{
public int $count = 0;
public static int $total = 0;
public static function bad(): void
{
echo $this->count; // Error: Using $this when not in object context
}
public static function good(): void
{
echo self::$total; // static プロパティなら読める
echo self::helper(); // static メソッドも呼べる
}
private static function helper(): string { return 'ok'; }
}
static メソッドはインスタンスに属していないため、「どのインスタンスか」を表す $this が存在しません。逆に、インスタンスメソッドからは self::method() で static メソッドを呼べます。
self / static / parent の使い分け
class Base
{
public static function create(): static
{
return new static(); // 呼ばれたクラスのインスタンスを作る
}
public static function createSelf(): self
{
return new self(); // 常に Base を作ってしまう
}
public static function label(): string { return 'Base'; }
public static function show(): void
{
echo static::label(); // 子で上書きされたものが呼ばれる
echo self::label(); // 常に Base::label()
}
}
class Child extends Base
{
public static function label(): string { return 'Child'; }
}
var_dump(Child::create()); // object(Child)
var_dump(Child::createSelf()); // object(Base) ← 意図しないことが多い
Child::show(); // Child, Base
| 書き方 | 解決先 | 使う場面 |
|---|---|---|
self:: | 書かれているクラス | 絶対に差し替えさせたくないとき |
static:: | 呼び出されたクラス | 継承して上書きされる前提のとき |
parent:: | 親クラス | 親の実装も動かしたいとき |
ClassName:: | 指定したクラス | 他のクラスの static を呼ぶとき |
ファクトリメソッドでは new self() ではなく new static() を使うのが定石です。
ファクトリメソッドとして使う
class Money
{
private function __construct(
public readonly int $amount,
public readonly string $currency,
) {}
public static function yen(int $amount): static
{
return new static($amount, 'JPY');
}
public static function fromString(string $s): static
{
[$amount, $currency] = explode(' ', $s);
return new static((int)$amount, $currency);
}
}
$a = Money::yen(1000);
$b = Money::fromString('50 USD');
コンストラクタは 1 つしか作れないため、作り方が複数あるときは名前の付いた static メソッドで表現します。__construct を private にすれば、作り方を限定できます(コンストラクタ)。
static にしてよい処理・避けるべき処理
| 処理 | 判断 | 理由 |
|---|---|---|
| 文字列の整形・単位変換・バリデーション | 向く | 入力だけで結果が決まる |
| ファクトリメソッド | 向く | 生成方法に名前を付けられる |
| DB アクセス・HTTP 通信・ファイル操作 | 避ける | テストで差し替えられない |
| 現在時刻・乱数を直接使う処理 | 避ける | 結果が毎回変わり検証できない |
| アプリ全体の状態を持つ | 避ける | どこから変わるか追えない |
// テストしづらい書き方
class OrderService
{
public function total(array $items): int
{
$rate = TaxApi::fetchRate(); // 通信が固定されていて差し替えられない
return (int)(array_sum($items) * $rate);
}
}
// 差し替えられる書き方(依存注入)
class OrderService
{
public function __construct(private TaxRateProvider $tax) {}
public function total(array $items): int
{
return (int)(array_sum($items) * $this->tax->rate());
}
}
static 呼び出しは呼び出し先がコードに焼き付きます。テストで偽物に差し替えたい処理は、コンストラクタで受け取る形にしてください。
抽象クラス・インターフェースとの関係
interface Formatter
{
public static function format(string $s): string; // 宣言はできる
}
class Upper implements Formatter
{
public static function format(string $s): string { return strtoupper($s); }
}
function apply(string $class, string $s): string
{
return $class::format($s); // クラス名を変数で渡して呼べる
}
echo apply(Upper::class, 'abc'); // ABC
インターフェースに static メソッドを宣言することはできますが、ポリモーフィズムは効きません(呼び出し時にクラス名を決める必要がある)。差し替えを前提とするなら、インスタンスメソッドにするほうが素直です。
__callStatic による動的呼び出し
class Facade
{
public static function __callStatic(string $name, array $args): mixed
{
// 未定義の static メソッドが呼ばれたときに実行される
return (new Service())->$name(...$args);
}
}
echo Facade::greet('田中'); // Service::greet('田中') が実行される
Laravel のファサード(DB::table() Cache::get())はこの仕組みです。実体はインスタンスで、呼び出し口だけを static に見せているため、テストでの差し替えもできます。
関連
- staticについて — 親カテゴリ
- static変数
- コンストラクタ
- クラスとインスタンス
- 関数の定義と呼び出し方法
- 継承の構文
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- static変数
- static関数
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- 【django】ログイン 認証機能 2026-09-08 03:22:09
- MySQL ERROR 1063 Incorrect column specifier for column|原因と直し方 2026-09-08 03:11:09
- 【PHPエラー】Object of class stdClass could not be converted to string 2026-09-07 07:46:04
- Julia Genie ローカル開発サーバ起動完全ガイド 2026-09-07 07:46:04
- Wi-Fi とは|規格と世代(Wi-Fi 4〜7)・周波数帯・CSMA/CA・WPA3 NEW 2026-09-07 07:45:13
- set コマンドでシェルオプションと位置パラメータを操作 | bash 2026-09-07 07:45:13
- JPEG(.jpg/.jpeg)画像形式の完全ガイド — 仕様・マジックナンバー・他形式との比較・EXIF 2026-09-07 07:45:13
- UE5 Get Overlapping Actorsで特定クラスだけ処理|Class Filter・Cast To 2026-09-07 07:45:13
- Linuxで特定拡張子のファイルを再帰削除|find -deleteの安全手順 2026-09-07 07:45:13
- Django CBVでテンプレートに値を渡す|get_context_data・extra_context 2026-09-07 07:45:13
- Linuxで複数ファイルの文字列を一括置換|find・sed・xargsの安全手順 2026-09-07 07:45:13
- Laravelルートグループ|prefix・middleware・nameで一括管理 2026-09-07 07:45:13
- Linux whichコマンドの使い方|絶対パス取得とtype・command -vの違い 2026-09-07 07:45:13
- Linux catコマンドの使い方|行番号表示・複数ファイル連結 2026-09-07 07:45:13
- unable to execute 'gcc': No such file or directory 2026-09-07 07:45:13
コメントを削除してもよろしいでしょうか?