Restrukturierungen vereinfachen mit ::class

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.

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.

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.

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:

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.

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.