591 Stimmen

Neues Selbst vs. neue Statik

Ich konvertiere eine PHP 5.3-Bibliothek, um sie mit PHP 5.2 zu verwenden. Das Haupthindernis ist die Verwendung von späten statischen Bindungen wie return new static($options); wenn ich dies in return new self($options) werde ich die gleichen Ergebnisse erzielen?

Was ist der Unterschied zwischen new self y new static ?

1047voto

BoltClock Punkte 660640

werde ich die gleichen Ergebnisse erzielen?

Nicht wirklich. Ich kenne allerdings keinen Workaround für PHP 5.2.

Was ist der Unterschied zwischen new self y new static ?

self bezieht sich auf die gleiche Klasse, in der die new Schlüsselwort tatsächlich geschrieben wird.

static bezieht sich in den späten statischen Bindungen von PHP 5.3 auf die Klasse in der Hierarchie, in der Sie die Methode aufgerufen haben.

Im folgenden Beispiel, B erbt beide Methoden von A . El self Aufruf ist gebunden an A weil sie definiert ist in A die Implementierung der ersten Methode, während static ist an die aufgerufene Klasse gebunden (siehe auch 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

26voto

Marius Balčytis Punkte 2551

Wenn die Methode dieses Codes nicht statisch ist, können Sie in 5.2 eine Abhilfe schaffen, indem Sie 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()));

Die Ergebnisse:

string(1) "B"
string(1) "B"

13voto

Rain Punkte 2566

Zusätzlich zu den Antworten der anderen :

static:: wird anhand von Laufzeitinformationen berechnet.

Das heißt, Sie können nicht verwenden static:: in einer Klasseneigenschaft, weil Eigenschaftswerte :

Muss zur Kompilierzeit ausgewertet werden können und darf nicht von Laufzeitinformationen abhängen.

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

}

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

Verwendung von self::

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

}
$Foo = new Foo;
echo $Foo->name; // Foo

Bitte beachten Sie, dass der Fatal error Kommentar in dem Code, den ich gemacht habe, nicht angibt, wo der Fehler passiert ist, der Fehler ist früher passiert, bevor das Objekt instanziert wurde, wie @Grapestain in den Kommentaren erwähnt hat

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X