Ankündigung

Einklappen
Keine Ankündigung bisher.

1,58: I DEspair, ID Est IDEal?!

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 1,58: I DEspair, ID Est IDEal?!

    1,58:
    Wer aus der streng typisierten Entwicklungswelt kommt, wird sich bei PHP sicher zuerst über die sehr lasch gehandhabte Typisierung ärgern. Das ist sicher gerechtfertigt, da so die Möglichkeit zur statischen Code-Analyse stark behindert wird. Zum anderen macht dieser Umstand PHP auch zu einer sehr beliebten Skript- und Entwicklungs-Sprache die ein sehr breites Einsatzgebiet abdeckt. Nicht ohne Grund ist die Verbreitung von PHP wie sie heute ist.

    Dieses Türchen möchte sich deshalb mit den Type-Hinting- und Code-Completion-Möglichkeiten unter PHP beschäftigen. Hierzu nutzen wir die Netbeans-PHP-IDE, die gerade in jüngster Vergangenheit starken Zuspruch erfahren hat.

    1. Type-Hinting mit PHP

    Die Skript-Sprache PHP reift mit den Jahren immer mehr zu einer Entwicklungs-Sprache heran. Das lässt sich schlicht daran erkennen, dass immer mehr Features aus der Objektorientierten Entwicklung Einzug halten. Dies ist insbesondere für die Produkt-Hersteller von Objektorientierten Entwicklungs-Werkzeugen interessant, da die API so deutlich klarer und dabei noch weniger Fehler-anfällig gestaltet werden kann. Ein- und Ausgabe-Typen sind klar definiert und explizite Prüfungen zur Absicherung der gekapselten Funktionaliät können entfallen.

    Ab dem Release 5.0.0 wurde die Möglichkeit eingeführt, nicht-trivialen Datentypen mit einem expliziten Hint zu versehen. Damit können z.B. Interfaces genutzt werden um beim Aufruf einer Methode den erlaubten Datentypen zu restriktieren. Bei der Übergabe von Listen kann das Schlüsselwort "array" genutzt werden. Dies sorgt dafür, dass lediglich eine Liste von Werten (assoziatives oder numerisches Array) als Parameter zulässig ist. Nicht möglich ist es seither, String- oder Integer-Datentypen explizit zu fordern.

    Die Netbeans IDE für PHP versteht diese Hints und bietet im Rahmen der Code-Completion die Methoden des Datentyps an, der für das Argument definiert wurde. In der Methode

    PHP-Code:
    public function setDocument(Document &$document){
       
    $document->|


    wird die eingeblendete Code-Completion die Methoden der Klasse "Document" auflisten. Diese erscheint entweder automatisch nach einer eingestellten Zeit, sofern der Cursor (hier durch "|" markiert) "lange genug" an der gekennzeichneten Stelle verweilt oder durch die Tasten-Kombination STRG + SPACE.

    2. Type-Hinting per Kommentar

    Um auch return-Werte, interne Klassen-Variablen und primitive Datentypen mit für Netbeans verwertbaren Hinweisen auszustattet, können Code-Kommentare genutzt werden. Diese werden von

    PHP-Code:
    /**
     * ...
     */ 

    umschlossen und enthalten ein oder mehreren Annotationen, die einer bestimmten Syntax folgen. Der Datentyp einer return-Anweisung lässt sich wie folgt beschreiben:

    PHP-Code:
    /**
     * @return Document The root DOM node of the current page.
     */
    public function getDocument(){ ... } 

    Bei Aufruf der Methode weiß Netbeans nun genau, welche Methoden das zurückgegebene Objekt hat und kann diese in der Code-Completion-Liste inkludieren.

    Seit Netbeans 6.9 ist es zudem möglich, mehrere durch "|" getrennte Typen als mögliche Rückgabe-Werte zu definieren:

    PHP-Code:
    /**
     * @return Coffee|Tee
     */
    public function createHotDrink(){ ... } 

    In der Code-Completion-Liste werden dann alle
    Attribute und Methoden der beiden Typen angeboten.

    Interne Klassen-Variablen lassen ebenfalls sich sehr einfach mit der @var-Annotation mit einem Typ belegen. Dies geschieht bei der Deklaration der Variable durch die Angabe des Typs und einer optionalen Beschreibung:

    PHP-Code:
    /**
     * @var Document The root DOM node of the current page.
     */
    private $rootDocument null

    Es existieren noch eine Reihe alternativer Methoden, die jedoch ebenfalls dem Annotations-Mechanismus von Variablen nutzen.

    3. "Generics" mit PHP oder explizite Code-Hints

    Da PHP keine generischen Typen (a.k.a. Generics) unterstützt, kann ein Interface-Typ dazu genutzt werden um eine Typisierung der API zu erzeugen und dabei trotzdem die Freiheit zuzulassen, unterschiedliche Implementierungen einzusetzen. Dadurch lässt sich zwar keine vollständige Unterstützung von Generics erreichen, trotzdem führt die Übergabe eines falschen Typs wenigstens zu einem Compile- und zu keinem Laufzeit-Fehler.

    Wird ein Interface-Typ als Type-Hint genutzt, innerhalb der Methode soll jedoch mit den Methoden der Implementierung gearbeitet werden, kann eine Variable auch dort explizit mit einem Typ versehen werden. Nehmen wir folgendes Code-Beispiel:

    PHP-Code:
    $service $this->getServiceObject('...','...');
    $service->| 

    Die Signatur der Methode getServiceObject() liefert einen generischen Interface-Typ zurück. Damit werden bei der Auflistung der verfügbaren Attribute und Methoden nur diejenigen des Interfaces angezeigt. Um die vollständige Liste einsehen zu können, kann die Variable $services mit einem expliziten Hint versehen werden:

    PHP-Code:
    $service $this->getServiceObject('...','...');
    /* @var $service MyService */
    $service->| 

    Diese Vorgehensweise kann beispielsweise auch innerhalb von Schleifen genutzt werden:

    PHP-Code:
    foreach($entries as $entry){
       
    /* @var $entry Entry */
       
    $entry->|


    Die Definition von mehreren Rückgabe-Typen kann bei der Methode getServiceObject() dazu genutzt werden, um die konkret zurückgegebenen Daten-Typen zu "hinten". Dies ist allerdings nur dann sinnvoll, wenn die Methode eine begrenzte Anzahl von Sub-Typen aufweist und diese ein Interface implementieren. Unterscheiden sich die Typen sehr stark, ist die Code-Completion mehr Verwirrung als Hilfe.

    4. Erweiterung der Code-Completion

    Sofern die Anforderungen damit nicht erfüllt werden können, bietet Netbeans eine sehr einfache Möglichkeit, die Features zu erweitern. Das Tutorial unter http://platform.netbeans.org/tutoria...ompletion.html beschreibt eine einfache Anwendung der Code-Vervollständigung in HTML-Dateien.

    5. Code Templates

    Eine weitere Option sind Code-Templates bzw. die Control-Paletten. Diese sind ebenso Teil der Code-Completion-Features von Netbeans. Der Unterschied zu "normalen" Type-Hints ist, dass diese vom Benutzer über die Palette angepasst und erweitert werden können. Einziger Nachteil: die Elemente sind Dateityp-gebunden.

    Die Palette lässt sich jedoch insbesondere für das Templating sehr schön nutzen um gängige Konstrukte schnell zur Hand zu haben. Mit einem Paletten-Eintrag können dann nicht nur die relevanten Code-Zeilen eingefügt, sondern auch Abhängigkeiten mitgeliefert werden.

    Um Beispielsweise ein APF-Formular samt Einbindung des Tags zu generieren, kann innerhalb einer HTML-Datei durch Eingabe der ersten Buchstaben des Namens des Tags und der Tasten-Kombination STRG + SPACE die Anzeige der verfügbaren Tags aktiviert werden.



    Durch bestätigen per ENTER-Taste oder Maus-Klick wird der Inhalt des Paletten-Eintrags eingefügt.

    Code:
    <core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" />
    <html:form name="">
    
    </html:form>

    Sofern eine Code-Snippet noch nicht in der Palette vertreten ist, kann dieses durch Markieren der Code-Stelle und Drag&Drop erzänzt werden.



    Anschließend kann der Snippet konfiguriert und mit weiteren Attributen (z.B. Tooltip) versehen werden:



    Bei der nächsten Implementierung eines Formulars steht dann der Tag durch Eingabe der ersten Buchstaben und der Tasten-Kombination STRG + SPACE zur Verfügung:



    6. Fazit

    Code-Vervollständigung ist lange kein Feature von streng typisierten Sprachen und ihren IDEs, sondern hat schon lange Zeit auch in die PHP-Welt Einzug gehalten. Mit den Möglichkeiten der Netbeans-IDE lassen sich sogar Palette erstellen und exportieren, damit diese von anderen Entwicklern genutzt werden können.

    Happy coding!


  • #2
    zum Thema generische Typen: experimentell veranlagte Charaktere dürfte die Extension SPL_Types (z.Zt. Version 0.3 via PECL) interessieren, mit der man auch Integer, Floats, Booleans und Enums via Type-Hinting prüfen kann.

    Kommentar

    Lädt...
    X