Diese Version gammelt nun schon seit weit über einem Monat auf meinem PC herum, hat aber erst heute ihre Vollendung gefunden dank dem Kommentar von Phil. Er hat mich darauf gebracht zwei magische Methoden einzubauen, mit denen die Möglichkeiten der Klasse enorm gestiegen sind.
Neue Features
Da dieses Release neue Features beinhaltet und nicht nur Bugs und Optimierungen enthält verdient es auch den Sprung von Version 1.0.1 auf 1.1.0. Welche Features das genau sind werde ich jetzt versuchen zu erläutern.
String erweitern
Es gibt jetzt gleich vier neue Methoden einen String zu erweitern: add()
, addMore()
, insert()
, insertMore()
.
Mit der add()
-Methode ist es möglich einen anderen String oder auch ein String-Objekt an das bisher bestehende anzufügen oder voranzustellen. Man kann auch mit einem Parameter angeben, was zwischen den Strings stehen soll. Mit addMore()
kann man im Grunde genommen genau das Gleiche machen, nur kann man hier ein Array aus Strings oder String-Objekten übergeben.
Mittels insert()
kann man einen String oder auch hier wieder ein String-Objekt in das bisherige String-Objekt einfügen. Dabei gibt man über einen Parameter den Offset an. Hier macht insertMore()
auch wieder das Gleiche, nur dass es die in einem Array übergebenen Strings nacheinander einfügt.
String kopieren
Es ist nun auch möglich ein String-Objekt zu kopieren mittels der Methode copy()
. Zurückgegeben wird ein neues String-Objekt, welches den gleichen Inhalt hat, wie das, welches kopiert wurde.
Magische Methoden
Mit PHP 5 wurden magische Methoden in Objekten eingeführt. Wie eingangs erwähnt habe ich heute erste die beiden Methoden __call()
und __toString()
eingebaut.
Erstere ist dafür zuständig die Möglichkeiten dieser Klasse enorm zu erweitern, da man dadurch jede beliebige String-Funktion aufrufen kann und diese dann auf das Objekt angewendet wird. Beispiel:
// Gibt 'is is the new st' aus $string = new String('This is the new string.'); $string->substr(2, 16)->show();
Wie man sieht ist diese Methode ein wirklich mächtiges Werkzeug und auch Simon sollte jetzt zufrieden gestellt sein
Die Methode __toString()
sorgt dafür, dass das Objekt direkt ausgegeben werden kann. Normalerweise würde eine Warnung auftreten, doch jetzt wird schlicht und ergreifend der String zurückgegeben. Das kann dann so aussehen:
// Gibt 'This is the new string.' aus $string = new String('This is the new string.'); echo $string;
Vererbbarkeit
Als letzte gravierende Änderung ist es nun möglich von der String-Klasse abzuleiten, um eigene Erweiterungen dafür zu schreiben. Man kann in den abgeleiteten Klassen jede Methode verwenden, die die String-Klasse selbst hat, da alles entweder von außen zugänglich, also public
ist oder geschützt (protected
).
Diese Möglichkeit habe ich mir auch direkt zunutze gemacht und eine Ableitung geschrieben: JavascriptString. Mit dieser Klasse ist es möglich viele String-Funktionen, die in Javascript zur Verfügung stehen auch in PHP zu nutzen.
Dokumentation
Dieser Artikel ist nicht allzu ausführlich und das soll er auch gar nicht sein. Ich muss nicht jede einzelne Zeile oder Methode ausführlich erklären, denn die Klasse selbst ist ausführlichst dokumentiert und mit Beispielen versehen. Wer jedoch einen schnellen Blick riskieren will findet hier eine ausführliche Dokumentation, die mit phpDocumentor erstellt wurde.
Subversion
Da ich inzwischen Subversion auch privat nutze war es nur logisch das Projekt auch damit zu versionieren. Den aktuellen Entwicklungsstand findet man ab sofort immer unter dieser URL: http://dbsvn.agitos.de/public/string/trunk/
Committen darf momentan nur ich, aber um den aktuellen Stand auschecken zu können gibt es den User anonymous mit dem gleich lautenden Passwort.
Download
Zu guter Letzt kommt schließlich noch der Download der aktuellen Version. Download.
Wer auch hier Subversion nutzen möchte kann dies über den von mir angelegten Tag erledigen:http://dbsvn.agitos.de/public/string/tags/1_1_0/
Ich finde die String Klasse für PHP wirklich sehr gelungen, das Fluent-Interface Konzept ermöglicht eine einfache und schnelle Verwendung – passt voll zur PHP Philosophie.
Allerdings sollte man meiner Meinung nach die Verwendung ausschließlich auf String Manipulationen beschränken. Eine grundsätzliche Typisierung aller „Strings“ in einem Projekt sollte nicht vorangetrieben werden (z.B. Typisierung aller Methoden Parameter als „String“ Typ) … das würde eher nicht zur PHP Philosophie passen (Performance, Handling, …), obwohl mir persönlich als Java-Entwickler die „nicht Typisierung in PHP“ schon einige Kopfschmerzen bereitet hat…
Ein paar Anregungen hätte ich noch:
1. Gibt es vergleichbare PHP Projekte (Extensions, SPL, …?)
2. Im Java-Bereich gibt es bereits etwas vergleichbares: Das Apache Commons Projekt bietet eine „StringUtil“ Klasse an: http://commons.apache.org/lang/apidocs/index.html
Vielleicht könnte man die Funktionalitäten nachbauen und die „String“ Klasse als „PHP Apache-Commons StringUtil Klon“ bezeichnen? Wäre für „Java to PHP“ Entwickler super…
3. Könnte man vielleicht eine Projekt-Seite anlegen? z.b.: http://trac.edgewall.org/wiki/CommercialServices
vom Prinzip her zwar schön, aber „Strings“ objektieren unter PHP? Dann zumindest mit UTF-8 Unterstützung
Hallo Base,
die Klasse unterstützt UTF-8, nur was genau verwendet wird (normale Stringfunktionen oder die Multibyte-Entsprechungen) kommt halt auf die Servereinstellung an.
Bin jetzt grad zum zweiten mal über den Artikel gestoßen und hab mittlerweile folgende Meinung dazu:
– Die „String erweitern Methoden“ gehören in eine „StringBuilder“ Klasse und nicht zu String selbst (Single Responsibility Principle). Oder?
– String kopieren besser mit „__clone()“?!
– ein String Objekt sollte „immutable“ (nicht veränderbar sein) – jede „edit“ Methode sollte ein neues String Objekt zurückgeben. Ich bin mir nicht sicher ob das bei PHP einen Sinn ergibt, aber so ist es zumindest bei Java. Dann würden z.B. auch die (unschönen) Methode set, reset und get wegfallen (get und __toString sind ja eigentlich identisch)
– ist Vererbung wirklich notwendig? Den Namen „JavascriptString“ finde ich jedenfalls irreführend. Die ganzen Methode daraus würd ich in die String Klasse einlagern (obwohl es dadurch wiederum Doppelungen gibt: z.B. substr und substring).
– cool finde ich aber auf alle Fälle die „callFunction“ Methode bzw. die verweisenden Methode darauf
Das ganze nur als Anregung … ich hab noch keine String Klasse eingesetzt … vielleicht komm ich später mal darauf zurück. *g*
Hallo Rudwig Brown,
Danke für die Anregungen. Sollte ich mal wieder dazu kommen an der Klasse weiterzuentwickeln werde ich deine Vorschläge berücksichtigen.
Wirklich ein toller Blog hier bei euch. Komme gerne wieder
Wäre schön, wenn sich hier mal wieder ein paar Leute einfinden könnten, bevor wir ständig alleine schreiben.
Ich kann das bei mir nicht auf UTF-8 umstellen. Weiß jemand warum das nicht geht?
Sagt mal, schreibt ihr eigentlich hier noch aktuell oder seit ihr umgezogen….?