webentwicklung-frage-antwort-db.com.de

Neues Selbst gegen neues Statik

Ich konvertiere eine PHP 5.3-Bibliothek, um an PHP 5.2 zu arbeiten. Die Hauptsache, die mir im Weg steht, ist die Verwendung einer späten statischen Bindung wie return new static($options);. Wenn ich diese in return new self($options) konvertiere, erhalte ich dieselben Ergebnisse?

Was ist der Unterschied zwischen new self und new static?

473
Mike

erhalte ich die gleichen Ergebnisse?

Nicht wirklich. Ich kenne jedoch keine Problemumgehung für PHP 5.2.

Was ist der Unterschied zwischen new self und new static?

self bezieht sich auf dieselbe Klasse, in der das Schlüsselwort new tatsächlich geschrieben wurde.

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

Im folgenden Beispiel erbt B beide Methoden von A. Der Aufruf von self ist an A gebunden, da er in der Implementierung der ersten Methode von A definiert ist, während static an die aufgerufene Klasse gebunden ist (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
826
BoltClock

Wenn die Methode dieses Codes nicht statisch ist, können Sie mit get_class($this) eine Umgehung in 5.2 erzielen.

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"
19

Zusätzlich zu den Antworten anderer:

static :: wird mit Hilfe von Laufzeitinformationen berechnet.

Das bedeutet, dass Sie static:: nicht in einer Klasseneigenschaft verwenden können, da die 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

self:: verwenden

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

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