PHPのレイトスタティックバインディング(遅延静的束縛)とは?selfとstaticの違いを解説
レイトスタティックバインディングの基本概念
レイトスタティックバインディング(遅延静的束縛)の背後にある基本的な考え方は、「継承」という概念と「self」キーワードという概念が、同じルールには従っていないという点です。たとえば、親クラスに定義されたメソッドを子クラスから呼び出しても、期待に反して「self」は子クラスではなく親クラスを参照したままになります。
この問題を解決するために導入されたのが、新しいキーワード「static」です。「static」を使用すると、関数はコード上で定義されたクラスではなく、実行時のクラス、つまりその関数が最初に呼び出されたクラスにバインドされます。
さらに、静的な関数や変数は通常、コンパイル時ではなく実行時に評価されます。そのため、静的な変数へ値を動的に代入する必要がある場合も、その処理は実行時に行われます。このように実行時(遅い段階)に静的な参照を確定させる仕組みであることから、「レイト(遅延)スタティックバインディング」と呼ばれています。
サンプルコード
<?php
class Student
{
public static $my_name = 'Joe';
public static function getName()
{
return "学生の名前は : " . self::$my_name;
}
public static function getAge()
{
// static:: を使うことで、呼び出し元のクラスのgetName()が実行される
echo static::getName();
}
}
class Professor extends Student
{
public static function getName()
{
return "学生の名前は : " . self::$my_name . " (年齢は24歳です)";
}
}
Student::getAge();
echo "\n";
Professor::getAge();
?>
出力結果
学生の名前は : Joe 学生の名前は : Joe (年齢は24歳です)
コードの解説
「Student」クラスには、静的プロパティとして名前が定義されており、名前を取得するgetName()メソッドと、年齢情報を含めて出力するgetAge()メソッドが用意されています。そして「Professor」クラスはStudentクラスを継承し、getName()メソッドをオーバーライドしています。
ここでポイントになるのは、getAge()内の「static::getName()」という記述です。それぞれのクラスからgetAge()を呼び出した際の挙動は次のようになります。
- Student::getAge() を呼び出した場合:staticはStudentクラスにバインドされるため、StudentクラスのgetName()が実行されます。
- Professor::getAge() を呼び出した場合:staticはProfessorクラスにバインドされるため、オーバーライドされたProfessorクラスのgetName()が実行されます。
もしgetAge()内で「self::getName()」としていた場合は、どちらのクラスから呼び出してもStudentクラス側のgetName()が実行され、出力は常に1行目と同じになってしまいます。これこそが、冒頭で述べた「selfは継承のルールに従わない」という挙動の正体です。
self:: と static:: の使い分け
- self:: … コードが記述されているクラス自身に解決される(コンパイル時に固定される)
- static:: … 実際にメソッドを呼び出したクラスに解決される(実行時に決定される)
継承を前提としたクラス設計では、オーバーライドされる可能性のある静的メソッドや静的プロパティを参照する場面で「static::」を使うことで、柔軟で拡張性の高いコードを実現できます。逆に、必ず自クラスの定義を参照したい場合には「self::」が適しています。両者の違いを理解して使い分けることが、PHPのオブジェクト指向プログラミングにおいて重要です。
-
PHPファイルとは?開き方・編集・変換方法をわかりやすく解説
PHPファイルとは .phpという拡張子を持つファイルは、PHP(Hypertext Preprocessor)のソースコードが記述された「PHPソースコードファイル」です。主にWebページのファイルとして利用され、Webサーバー上で動作するPHPエンジンによってHTMLを生成します。 ブラウザに表示されるのは、PHPエンジンがコードから生成したHTMLコンテンツです。PHPコードはサーバー側で実行されるため、PHPページにアクセスしてもコードそのものは見えず、サーバーが生成したHTMLだけを受け取る仕組みになっています。 なお、PHPソースコードファイルの中には、.phtml、.php3、.
-
Pythonの静的メソッド(@staticmethod)とは?仕組みと使い方を解説
Pythonのクラスには、インスタンスメソッド、クラスメソッド、静的メソッド(スタティックメソッド)という3種類のメソッドを定義できます。それぞれ役割や呼び出し方が異なり、適切に使い分けることでコードの可読性と保守性が向上します。3種類のメソッドの違いインスタンスメソッド: 第1引数に self を受け取り、オブジェクト(インスタンス)の状態にアクセス・変更できます。クラスメソッド: @classmethod デコレータを付け、第1引数に cls を受け取り、クラス自体の状態にアクセスできます。静的メソッド: @staticmethod デコレータを付け、self も cls も受け取りません