Hinweis: Die Lösung unten ist für PHP 5.3 und unten. Ab PHP 5.4 können Sie auch do it via Reflection as shown elsewhere on this page.
Dies ist in der Tat möglich.
Geändert von PHPUnit_Framework_MockObject_Generator
1 $myClass = unserialize(
2 sprintf(
3 'O:%d:"%s":0:{}',
4 strlen('MyClass'), 'MyClass'
5 )
6 );
Bitte denken Sie daran, dass Code wie das alles gut und gerechtfertigt in einem Rahmen wie PHPUnit. Aber wenn Sie Code wie diesen in Ihrem Produktionscode haben müssen, tun Sie wahrscheinlich etwas sehr merkwürdiges.
Da Sie nach einer Erklärung gefragt:
Wenn Sie Sie eine String-Darstellung des Objekts erhalten serialize an Object. Zum Beispiel
echo serialize(new StdClass) // gives O:8:"stdClass":0:{}
Die O
bedeutet Objekt. 8
ist die Zeichenfolgenlänge des Klassennamens. "stdClass"
ist offensichtlich der Klassenname. Das serialisierte Objekt hat die Eigenschaften 0
(mehr dazu später), angezeigt durch die leeren geschweiften Klammern. Die :
sind nur Trennzeichen.
Jede serialisierte Zeichenfolge kann mit der Funktion unserialize in ihrem ursprünglichen "Live" -Wert wiederhergestellt werden. Dadurch wird der Konstruktor umgangen. Wie Charles richtig darauf hingewiesen hat, wird die magic method __wakeup()
aufgerufen, wenn sie definiert ist (genau wie __sleep()
wird bei der Serialisierung aufgerufen werden).
In Zeile 3 sehen Sie eine Zeichenfolge, die für die Verwendung mit sprintf (Zeile 2) vorbereitet wurde. Wie Sie sehen können, ist die String-Länge des Klassennamens %d
und der Klassenname ist %s
. Dies dient dazu, sprintf mitzuteilen, dass es das erste Argument in Zeile 4 als Ziffer und das zweite Argument als Zeichenfolge verwenden soll. Daher ist das Ergebnis der sprintf Anruf
'O:7:"MyClass":0:{}'
Sie würden beide Vorkommen von „MyClass“ in Zeile 4 mit der gewünschten Klassennamen ersetzen, um eine serialisierte Zeichenfolge der Klasse, die Sie ohne Berufung auf den Controller instanziiert erstellen möchten.
Diese Zeichenfolge wird dann in Zeile 1 in eine MyClass-Instanz unserialisiert, wobei der Konstruktor umgangen wird. Die unserialisierte Instanz wird alle Methoden ihrer Klasse und auch alle Eigenschaften haben. Wenn in MyClass Eigenschaften vorhanden sind, haben diese ihre Standardwerte, es sei denn, Sie fügen der serialisierten Dummy-Zeichenfolge andere Werte hinzu.
Und das ist es schon. Nichts Magisches daran.
Oder, wie andere gezeigt haben, kann eine statische Methode Ihren Anforderungen am besten entsprechen, je nachdem, was Sie versuchen zu tun. –
+1 für die Erweiterung der Klasse. Vielleicht ist es eine Klasse von einer Drittanbieter-Bibliothek, die nicht geändert werden sollte ... –
+1 für die guten alternativen Lösungen. – Yacoby