工場モードによるPHPの静的遅延バインディングの認識
PHPの静的遅延バインディングを単純なファクトリモードで認識する
多くのクラスに独自のメンバー関数をインスタンス化する必要がある場合は、ファクトリ設計モード+静的遅延バインドのプロパティを使用して、階層化クラスでインスタンス化コンテキストクラスを作成する方法を使用します.次に、サブクラスが直接このメソッドを呼び出して自分をインスタンス化することができます.self()は、コンテキストに基づいて切り替えられずに自分のクラスを定義します.static()はコンテキストに基づいて解析され、現在呼び出されている自分のクラスを指します.
注意抽象クラスのselfInstanceメソッドは誤りであり,内部で使用されるreturn new self()は解析コンテキストであり,すなわちこのメソッドを呼び出して最初に定義した場所であり,最初は抽象クラスで自然にインスタンス化してエラーを報告する.
クラスではnew self()new static()はクラスオブジェクトをインスタンス化できますが、selfは解析コンテキスト、すなわちインスタンス化によって自分のクラスを定義し、staticは現在のコンテキストがどのクラスが自分を呼び出しているかに基づいて自分を指します.
静的遅延バインド
new self();
独自に定義されたクラスのオブジェクトをインスタンス化
new parent();
自分の親オブジェクトをインスタンス化
new static();
自分の現在のクラスを呼び出すオブジェクトをインスタンス化
多くのクラスに独自のメンバー関数をインスタンス化する必要がある場合は、ファクトリ設計モード+静的遅延バインドのプロパティを使用して、階層化クラスでインスタンス化コンテキストクラスを作成する方法を使用します.次に、サブクラスが直接このメソッドを呼び出して自分をインスタンス化することができます.self()は、コンテキストに基づいて切り替えられずに自分のクラスを定義します.static()はコンテキストに基づいて解析され、現在呼び出されている自分のクラスを指します.
<?php
abstract class Demo
{
public static $name = 'sallency';
//error
public static function selfInstance() {
//self
//
//
return new self();
}
public static function staticInstance() {
//static
// ( )
//
return new static ();
}
}
class StaticDemo extends Demo
{
public function __construct() {
echo "i am construct of " . __CLASS__ . '<br/>';
echo self::$name;
}
}
var_dump(StaticDemo::staticInstance());
var_dump(Demo::$name);//
?>
注意抽象クラスのselfInstanceメソッドは誤りであり,内部で使用されるreturn new self()は解析コンテキストであり,すなわちこのメソッドを呼び出して最初に定義した場所であり,最初は抽象クラスで自然にインスタンス化してエラーを報告する.
クラスではnew self()new static()はクラスオブジェクトをインスタンス化できますが、selfは解析コンテキスト、すなわちインスタンス化によって自分のクラスを定義し、staticは現在のコンテキストがどのクラスが自分を呼び出しているかに基づいて自分を指します.
静的遅延バインド
new self();
独自に定義されたクラスのオブジェクトをインスタンス化
new parent();
自分の親オブジェクトをインスタンス化
new static();
自分の現在のクラスを呼び出すオブジェクトをインスタンス化