New self vs. new static

Konwertuję bibliotekę PHP 5.3 do pracy na PHP 5.2. Główną rzeczą stojącą mi na drodze jest użycie późnych wiązań statycznych, takich jak return new static($options); , czy jeśli przekonwertuję to na return new self($options), uzyskam takie same wyniki?

Jaka jest różnica między new self a new static?

Author: Mike, 2011-03-04

3 answers

Czy dostanę takie same wyniki?

Nie bardzo. Nie znam obejścia dla PHP 5.2.

Jaka jest różnica między new self A new static?

self odnosi się do tej samej klasy, w której słowo kluczowe new jest rzeczywiście napisane.

static, w późnych wiązaniach statycznych PHP 5.3 odnosi się do dowolnej klasy w hierarchii, na której wywołałeś metodę.

W poniższym przykładzie B dziedziczy obie metody z A. Wywołanie self jest związane z A, ponieważ jest zdefiniowane w A implementacji pierwszej metody, podczas gdy static jest związane z wywołaną klasą (Zobacz też get_called_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
 725
Author: BoltClock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-20 19:12:16

Jeśli metoda tego kodu nie jest statyczna, możesz uzyskać obejście w 5.2 używając get_class($this).

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()));

Wyniki:

string(1) "B"
string(1) "B"
 15
Author: Marius Balčytis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-18 15:45:38

Oprócz odpowiedzi innych:

Wartość Static:: zostanie obliczona przy użyciu informacji runtime.

Oznacza to, że nie można używać static:: w właściwości klasy, ponieważ wartości właściwości:

Musi być możliwe do oceny w czasie kompilacji i nie może zależeć od informacji o czasie wykonania.

class Foo {
    public $name = static::class;

}

$Foo = new Foo;
echo $Foo->name; // Fatal error

Using self::

class Foo {
    public $name = self::class;

}
$Foo = new Foo;
echo $Foo->name; // Foo
 0
Author: FatalError,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-24 09:07:04