Facebook
Twitter
Google+
Kommentare
13
Willkommen bei "the web hates me". Mittlerweile hat unser Team ein tolles neues Monitoringtool für Agenturen gelauncht. Unter dem Namen koality.io haben wir einen Service geschaffen, der er Agenturen ermöglicht mit sehr geringen Kosten alle Ihre Webseiten zu überwachen.

Starke Typisierung in PHP

Ich hatte ja mal einen Ansatz für starke Typisierung von Max Horváth vorgestellt. Die schwache Typisierung von PHP ist vielen Anwendern ein Dorn im Auge und sie wünschen sich hier Gesinnungswechsel bei den Machern von PHP. Ich finde das Handling der primitiven Typen eigentlich ganz angenehm, da man einfacher vergleichen kann und man nicht immer und überall Casten muss. Ich kann es aber auch verstehen, wenn jemand mal an eine Stelle kommt, an dem ihm die schwache Typisierung auf die Nerven geht.

Die SPL, also die Standard PHP Library, schafft hier Unterstützung. Diese kann man im experimentellen Umfeld schon einmal antesten. Wichtig dabei ist, dass es sich wirklich nur um ein Experiment handelt. Baut also nicht eure geschäftskritischen Prozesse drauf aus.

Schon so viel geschrieben, aber noch gar nichts gesagt. Fangen wir also an. Die SPL bietet eine Sammlung von Klassen, die einfache Typen repräsentieren. Integer, String, Boolean und Float sind alle abgedeckt. Wie haben also eine Klasse, die SplInt heisst. Diese kann dafür verwendet werden, Integers zu typisieren. In einem Beispiel würde die Anwendung wie folgt aussehen:

function multiply( SplInt $a, SplInt $b )
{
  $c = new SplInt( 0 );
  for( $i = 0; $i < $a; $i++ ) {
    $c = $c + $b;
  }
  return $c;
}

Wie ihr sehen könnt, verwende ich die Integer Objekte, als ob es sich hierbei um ganz normale Zahlen handelt. Ist natürlich ein wenig aufwendiger, wenn jedes mal ein Objekt erstellen muss, sobald man mit Zahlen oder Strings hantieren will. Ich kann jedem nur empfehlen mal ein wenig mit den neuen Klassen rumzuspielen, ich selbst hatte leider noch nicht die Gelegenheit. Lasst uns also von euren Erfahrungen profitieren.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

13 Comments

  1. @Sebastian: Vielen Dank. Ich hatte ja geschrieben, dass ich es noch nie verwendet hatte. Hab’s dann wohl auf der php.net Seite überlesen. Trotzdem schön dich als Leser zu haben 😉

    Reply
  2. Sieht nach dem Versuch aus die aus Java bekannten Wrapper-Klassen für primitive Datentypen in PHP zu implementieren.

    Der Ansatz ist gut, aber ohne den AutoBoxing-Mechanismus ist das Ganze sinnlos, finde ich =(

    Reply
  3. man könnte die Typisierung einführen, ich hätte da sogar einen guten Ansatz:

    public function foo(int $bar)
    -> hier müsste es definitiv ein integer datentyp sein

    public function foo(intval $bar)
    -> hier kann es eine Zahl sein, die auch in einem String stecken kann, is_numeric mit einem Ausschluss von Floats/Doubles könnte da helfen.
    Da es nun nur Ganzzahlen sein können, könnte man die Variable einfach nach int casten und gut ist.
    Bei intval könnte man auch direkt Get/Post-Vars übernehmen (die ja Strings sind).

    Leider interessiert sich bei PHP niemand wirklich für optionale starke Typisierung.

    Reply
  4. @Nils: Objekte zu erstellen ist aus Programmierersicht erstmal ein sehr großer Aufwand, Auto-Boxing wie in Java seit J2SE5 würde helfen.
    JEDOCH sollte man auch betrachten, wie PHP intern den Speicher verwaltet und durch die ganzen ZVAL-Einträge usw. für JEDEN abgelegten Datentyp würde der Speicherverbrauch enorm steigen. Echte Integers sind nicht gerade speicherschonend, aber Objekte setzen dem noch die Krone auf.

    Reply
  5. ich hab die strikte Typisierung mit der SPL auch schonmal ausprobiert, das ist mir aber zu umständlich. Prinzipjell würde es schon stark weiter helfen wenn man bei übergabewerten für Funktionen oder Methoden auch die einfachen Datentypen nutzen kann, was ja bis jetzt nur für Klassen und Array möglich ist. Ansonsten hate ich eine strikte Typisierung für PHP eher für umständlich als hilfreich.

    Reply
  6. @Sebastian: Hoffen wir mal, dass es mit PHP6 kommt. Mich würde es freuen. Johannes Schlüter meinte damals: „Das Return-Type-Hints kommen halte ich für ein Gerücht“. Aber ich hoffe, dass du recht hast 😉

    Reply
  7. Wir werden sehen ob skalare Type-Hints wirklich kommen. Etwas in dieser Richtung habe ich allerdings auch läuten hören.

    Class-Casts wären auch auf meiner Wunschliste, aber man soll ja nicht unverschämt werden 😉

    Ein paar magische __toInt(), __toFloat() oder __toBool() Funktionen wären auch nicht verkehrt. Eine echte Variablendeklaration mit Warnung bei doppelter Verwendung (shadow/overwrite) wäre auch eine begrüßenswerte Maßnahme.

    Die experimentelle SPL-Erweiterung kannte ich allerdings schon. Ein netter „Workaround“ aber keine endgültige Lösung.

    Problematisch bleibt aber die Frage des Auto-Boxing. Wenn dieses Problem nicht wäre könnte man es sogar direkt in PHP lösen.

    Solange es keine finale Lösung und skalares Type-Hinting gibt verwende ich weiterhin einfach Zusicherungen (assert()). Das funktioniert obendrein prima in Verbindung mit Unit-Tests.

    Reply
  8. Apropos Zusicherung!

    Variablendeklaration mit Warnung: assert(‚!issert($i);‘); $i = 0;
    Skalares Type-Hinting mit Warnung:

    /**
    * @param int $i
    */
    public function foo($i) {
    assert(‚is_int($i);‘);
    }

    Für die Entwurfsphase sehr hilfreich und bedeutet keinen Performance-Verlust auf dem Livesystem, weil man es dort gezielt wieder abschalten kann.

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen