我正在轉換PHP 5.3庫以在PHP 5.2上工做。 阻礙個人方式是使用後期靜態綁定,如return new static($options);
,若是我將其轉換爲return new self($options)
我會獲得相同的結果嗎? this
new self
和new static
什麼區別? spa
若是此代碼的方法不是靜態的,則能夠使用get_class($this)
在5.2中進行解決。 code
class A { public function create1() { $class = get_class($this); return new $class(); } public function create2() { return new static(); } } class B extends A { } $b = new B(); var_dump(get_class($b->create1()), get_class($b->create2()));
結果: 繼承
string(1) "B" string(1) "B"
我會獲得相同的結果嗎? get
並非的。 不過,我不知道PHP 5.2的解決方法。 string
new self
和new static
什麼區別? io
self
指的是實際寫入new
關鍵字的同一個類。 編譯
static
,在PHP 5.3的後期靜態綁定中,指的是您調用方法的層次結構中的任何類。 function
在如下示例中, B
繼承了A
兩種方法。 self
調用綁定到A
由於它在A
的第一個方法的實現中定義,而static
綁定到被調用的類(也見get_called_class()
)。 class
class A { public static function get_self() { return new self(); } public static function get_static() { return new static(); } } class B extends A {} echo get_class(B::get_self()); // A echo get_class(B::get_static()); // B echo get_class(A::get_self()); // A echo get_class(A::get_static()); // A
除了別人的答案:
static ::將使用運行時信息計算。
這意味着你不能在類屬性中使用static::
由於屬性值:
必須可以在編譯時進行評估,而且不能依賴於運行時信息。
class Foo { public $name = static::class; } $Foo = new Foo; echo $Foo->name; // Fatal error
使用self::
class Foo { public $name = self::class; } $Foo = new Foo; echo $Foo->name; // Foo