新的自我與新的靜態

我正在轉換PHP 5.3庫以在PHP 5.2上工做。 阻礙個人方式是使用後期靜態綁定,如return new static($options); ,若是我將其轉換爲return new self($options)我會獲得相同的結果嗎? this

new selfnew static什麼區別? spa


#1樓

若是此代碼的方法不是靜態的,則能夠使用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"

#2樓

我會獲得相同的結果嗎? get

並非的。 不過,我不知道PHP 5.2的解決方法。 string

new selfnew 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

#3樓

除了別人的答案:

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
相關文章
相關標籤/搜索