PHP 7: Typsichere Arrays von Objekten

Mit PHP 7 kann man sich dazu entscheiden, typsichereren Code zu schreiben als zuvor, dank skalaren Type Hints und Rückgabetypen.

function repeat(string $text, int $times) : string;

Aber was ist mit Arrays? Es gibt immer noch nur den generischen “array” Type Hint, man kann nicht spezifizieren was das Array enthält. Für die IDE kann man PhpDoc Kommentare hinzufügen:

/**
 * @return User[]
 */
function allUsers() : array;

Jetzt können IDEs wie PhpStorm mit Code-Vervollständigung für Elemente des zurückgegebenen Arrays helfen. Aber wir können nicht von Prüfungen zur Laufzeit profitieren, wie mit echten Type Hints.

Für Argumente gibt es einen partiellen Workaround mit variadischen Argumenten. Nehmen wir die folgende Funktion:

/**
 * @param User[] $users
 */
function deleteUsers(array $users);

Mit variadischen Argumenten können wir sie umschreiben zu:

function deleteUsers(User ...$users);

Die Benutzung ändert sich auch, zu deleteUsers(...$users); Bei diesem Aufruf wird das Argument $users in einzelne Variablen “unpacked”, und in der Methode selbst wieder in ein Array $users “packed”. Jedes Element wird dabei auf den Typ User validiert. $users kann auch ein Iterator sein, er wird dann beim Aufruf in ein Array konvertiert.

Leider gibt es keinen entsprechenden Workaround für Rückgabetypen, und es funktioniert nur mit dem letzten Argument.

Siehe auch: Type hinting in PHP 7 – array of objects

Ich nutze diese Technik oft in PHP 7 Code, aber es gibt noch eine andere, die die genannten Schwächen nicht hat:
Continue reading “PHP 7: Typsichere Arrays von Objekten”

Die Woche auf StackExchange #12 / 2016

Hier kommt das nächste Update, dieses Mal nur mit neuen, hoffentlich interessanten, Antworten auf Magento StackExchange.

Magento 2

Magento 1

Design Patterns für Framework-agnostische Extensions/Plugins – Autoloading

Teil 5 meiner Blog-Reihe auf integer-net.com über Framework-unabhängigen Code ist draußen: Using Advanced Autoloading. Dieser ist allerdings nur für die Anbindung von Legacy-Anwendungen relevant, die noch kein Composer-Autoloading nutzen (Magento 1).

Vorige Teile

  1. Introduction: Shared Code For Magento 1 and Magento 2 Extensions
  2. Accessing Configuration Data
  3. Using Dependency Injection
  4. Building Bridges
  5. Preparing Data For Output

Die Woche auf StackExchange #9 / 2016

Ich versuche mich an einem neuen wöchentlichen Format im Blog mit einer Zusammenfassung von neuen Fragen und Antworten auf StackExchange rund um PHP und Magento. Mal sehen, was daraus wird, und los geht’s:

Neue Antworten

Offene Fragen

Zum Thema Magento 2 wird es in den kommenden Wochen sicher noch mehr geben, da ich da gerade tiefer in die Entwicklung einsteige.