PHP 5.5 hat eine neue dynamische Klassenkonstante ::class
eingeführt, die die Wartbarkeit des Codes deutlich verbessern kann.
Funktionsweise
Um an den vollständig qualifizierten Klassennamen – also mit Namespace – zu gelangen gab es bisher die Möglichkeiten __CLASS__
und get_class()
.
Klassenkonstante __CLASS__
Diese liefert ohne Probleme den Klassennamen, aber funktioniert nur innerhalb der Klasse selbst.
1 2 3 4 5 6 7 8 9 10 |
namespace Acme; class SomeClass { public function method() { echo __CLASS__; } } (new SomeClass())->method(); |
>> Acme\SomeClass
Workaround mit get_class()
Außerhalb der Klasse musste man sich vor PHP 5.5 mit get_class()
behelfen.
1 2 3 4 5 |
namespace Acme; class SomeClass {} echo get_class(new SomeClass()); |
>> Acme\SomeClass
Das größte Problem dabei ist die Tatsache, dass man eine Instanz der Klasse genötigt.
Vereinfachung mit ::class
Den Klassennamen ohne eine Instanz können wir für PHP >= 5.5 mit SomeClass::class
abfragen.
1 2 3 4 5 |
namespace Acme; class SomeClass {} echo SomeClass::class; |
>> Acme\SomeClass
Nutzen für Testing und Restrukturierung
Bleibt noch die Frage warum das überhaupt erwähnenswert ist. Gerade bei Unittests kommt es häufig vor, dass eine Klasse simuliert werden soll. Wir wollen also keine Instanz der Klasse erzeugen, womit die get_class() Variante nicht verwendet werden kann.
Für PHP < 5.5 musste der Klassenname als String übergeben werden:
1 2 3 4 5 |
public function testSomething() { $mock = $this->getMock('Acme\SomeClass'); // ... } |
Die IDE kann hier die Verwendung der Klasse nicht erkennen.
Mit PHP 5.5 kann der Code so geschrieben werden.
1 2 3 4 5 |
public function testSomething() { $mock = $this->getMock(SomeClass::class); // ... } |
Damit ist das eine echte Verwendung der Klasse und die IDE erkennt es als solche. Umstrukturierungen, bei denen sich der Name oder der Namespace der Klasse ändert, werden damit zum Kinderspiel.