遅延静的束縛

概要

静的継承のコンテキストで呼び出し元のクラスを参照できる

※ここはまだ検証中なのでとりあえず、途中までのソースサンプルのみ配置


サンプル

既存のselfキーワードの場合は定義された範囲のメソッドを参照

ソース
<?php
/***************************************
 * 遅延静的束縛
 ***************************************/
 
// サンプル1
class SuperClass01{
	// メソッド定義
	public static function testMethod(){
		echo __CLASS__ . "\n";
	}
 
	// メソッド定義
	public static function test(){
		// testMethodを呼び出す:selfキーワードである
		self::testMethod();
	}
}
 
// 継承
class SubClass01 extends SuperClass01{
	// スーパークラスと同名のメソッドを定義
	public static function testMethod(){
		echo __CLASS__ . "\n";
	}
}
 
/***********************************************
 * 呼び出したのはSuperClass01のtestメソッドだが、
 * selfキーワードでは定義元のtestMethodを参照する
 ***********************************************/
// 確認
SubClass01::test();	// スーパークラスのtestメソッドを呼び出し:結果は「SuperClass01」となる
 
 

staticキーワードを使用した場合は継承先のメソッドを参照する

ソース
<?php
/***************************************
 * 遅延静的束縛
 ***************************************/
 
// サンプル1
class SuperClass01{
	// メソッド定義
	public static function testMethod(){
		echo __CLASS__ . "\n";
	}
 
	// メソッド定義
	public static function test(){
		// testMethodを呼び出す:staticキーワードである
		static::testMethod();
	}
}
 
// 継承
class SubClass01 extends SuperClass01{
	// スーパークラスと同名のメソッドを定義
	public static function testMethod(){
		echo __CLASS__ . "\n";
	}
}
 
/***********************************************
 * 呼び出したのはSuperClass01のtestメソッドだが、
 * staticキーワードにすることでSubClass01の
 * testMethodに変更される
 ***********************************************/
// 確認
SubClass01::test();	// スーパークラスのtestメソッドを呼び出し:結果は「SubClass01」となる
 
 
 

中間にクラス名::メソッドのようにクラス名を指定した場合はそのクラスのものとなる

ソース
<?php
/***************************************
 * 遅延静的束縛
 ***************************************/
 
// サンプル1
class SuperClass01{
	// メソッド定義
	public static function testMethod(){
		echo __CLASS__ . "\n";
	}
 
	// 中間呼び出し
	public static function testMarginMethod(){
		static::testMethod();
	}
 
	// メソッド定義
	public static function test(){
		// testMarginMethodをクラス名を指定して呼び出す
		SuperClass01::testMarginMethod();
	}
}
 
// 継承
class SubClass01 extends SuperClass01{
	// スーパークラスと同名のメソッドを定義
	public static function testMethod(){
		echo __CLASS__ . "\n";
	}
}
 
/***********************************************
 * 呼び出したのはSuperClass01のtestメソッドだが、
 * test内でSuperClass01::testMarginMethod()と
 * することで直接クラス名を指定したので
 * その中でよびだされるtestMethodはstaticだが、
 * SuperClass01のものとなる
 ***********************************************/
// 確認
SubClass01::test();	// スーパークラスのtestメソッドを呼び出し:結果は「SuperClass01」となる
 
 
 


staticが定義されている場合はselfやparentがあってもstaticと同じ場所を参照する

ソース
<?php
class AAA {
    public static function foo(){
        static::who();
    }
    public static function foo2(){
        self::who();
    }
 
    public static function who(){
        echo __CLASS__."\n";
    }
}
 
class BBB extends AAA{
	public static function test(){
		/************************************************************
		 * staticキーワードが存在する foo()メソッドへの呼び出しを以下のように
		 * 三種の方法で定義しておく
		 *************************************************************/
		AAA::foo();
		parent::foo();
		self::foo();
	}
 
	public static function test2(){
		/************************************************************
		 * staticキーワードが存在する foo2()メソッドへの呼び出しを以下のように
		 * 三種の方法で定義しておく
		 *************************************************************/
		AAA::foo2();
		parent::foo2();
		self::foo2();
	}
 
	public static function who(){
		echo __CLASS__."\n";
	}
}
class CCC extends BBB{
	public static function who(){
		echo __CLASS__."\n";
	}
}
 
// テスト
echo "--------------\n";
CCC::test();
echo "--------------\n";
CCC::test2();
 
 


最終更新:2012年11月25日 21:46