SwLib PHP
SwLib PHP
This PHP Software-Library is a collection of classes that I extend and improve since 2006 -
that means since the "timestamp" when I realized that PHP supports object oriented programming.
Before this time I did not use PHP because I could not get used to the mixed HTML/PHP4 script
style like "<?... if(...) : ?> <HTML> <? else ... ?>
" . As a migrant from the lands of C/C++,
Java, and VB6, I needed a properly split "algorithm-view", good maintainability, polymorphism
and something like std::exception
. Hence, I had to wrap existing PHP functions with classes,
which are now more elaborated, under one hood called SwLib
and make life easier
(and since published hopefully the world a better place for the community ;-} ).
Meine PHP Software-Library ist eine Sammlung von Klassen, die ich seit 2006 (als ich bemerkt habe,
dass PHP Objektorientierung unterstützt) kontinuierlich erweitere. Als Migrant von C/C++, Java und
VB6 konnte ich mich zuvor wegen der damals üblichen gemischten Schreibweise
"<?... if(...) : ?> <HTML> <? else ... ?>
" einfach nicht mit PHP anfreunden, die Sprache war
mir zu unorganisiert. Was ich brauchte waren sauber getrennte Algorithmen- und Ausgabeblöcke,
Wartbarkeit, Polymorphie und etwas wie std::exception
. Daher musste ich die existierenden
PHP-Funktionen mit Klassen "wrappen". Diese Klassen wurden nach und nach elaborierter und sind
nun alle unter einer Haube namens SwLib
. Das macht mir das Leben definitiv leichter, und
seitdem ich die Library veröffentlicht habe hoffentlich auch das der Community.
Core features
The library core consists of classes that are implicitly loaded when the initialization method
swlib::start(array $config)
is called. However, you can switch off these implicit used features
in the configuration array. In short the main advantages are:
Pre-defined class autoloading: The library main
class swlib
can scan multiple (configurable) directories for PHP-files and saves the contained classes in an index file. Hence, the folder structure is no more important for the autoloading of the organized classes. If a class is not known yet, the library will regenerate the class-index or throws anexception
if the class is still not found. Furthermore, if there is more then one class with the same name, the library will throw an exception after the class indexing. This ensures that you do not have duplicates or redundant classes.Advanced exception handling and generation: The
class EException
generates exceptions from PHP errors, failed assertions and warnings (if appropriate), and provides a global uncaught-exception handler. Exception handling is switched on by default. E.g. the division by zero is only a warning in PHP. In this critical caseEException
catches the warning and throws aMathException
, so that you are sure that your script does not calculate with invalid numbers.Session management: Automatically initializes the
class Session
, which handles the session management. Session system can be changed to MySql/file/RAM/remote by overloading this class.Output buffering using the class
OutputBuffer
. The library enables the output buffering at startup (default), and handles the shutdown or error exit conditions likedie()
.Tracing capability: The library can be started with the
class Tracer
, which allows to generate additional logging output with trace levels (message priorities). To add trace messages you can use the methodsTracer::trace()
,Tracer::trace_r()
(likeprint_r()
) orTracer::traceException()
in your code. The tracer is capable to send an email to the administrator if an uncaught exception occurs.GPC-magic-quote-sanatizing: Because gpc magic quotes are more confusing than useful (and server settings dependent), the input variables
$_GET
,$_POST
,$_FILES
etc. are stripped, just as gpc-magic-quotes would always be switched off.
Other package classes
Advanced ZIP file handling: Class
ZipFile
can be used for recursive compression, inspection and extraction of files and folders. ThrowsZipException
s on error.UTC and local dates: The classes
UtcDate
andLocalDate
can be used to represent GMT based and local dates. InterfaceIDate
is used to put both classes under one hood.Shell process execution with
stdout
andstderr
capturing: Using theShellProcess
class you can execute console programs, pass command line arguments andstdin
(like typing in the console). To save CPU time, you can decide if the shell process shall be terminated ("killed") if your the client browser disconnects. By overloading the event methods you can implement your own on-the-fly-processing of thestdout
andstderr
output.Elaborated uploading and downloading management with class
ResourceFile
. Helps you to move uploaded files easily and organizes the various download use cases, includingETAG
,If-Modified-Since
andHTTP Range
(partial download). For large file you can slow down the download to save bandwidth.EMail (SMTP) sending: Easy handling of generating and sending emails to multiple recipients using
class Mailer
. This class uses theinterface IEMailContact
(which just forces that user or address book classes provide a method calledtoEMailAddressString
). A standard email contact class allows a direct use of the class without changing already implemented user classes.Gregorian month and day calendar with events: The feature consists of the classes
GregorianCalendar, GregorianMonthCalendarRenderer, GregorianDayCalendarRenderer, GregorianCalendarEvent and GregorianCalendarEventController.
. The month calendar looks like a normal table-style calendar, where you can select the days. The day calendar is a timesheet, where the events are shown - and arranged as optimal as possible if they overlap. Each event has an ownDIV
block that you can fill with an event view as you want. All you have to do is to extend the event controller (e.g. to load events from a database or file) and the event renderer (to specify how the events shall look like). The rest only depends on you CSS (an example is published here ).Ini file parsing and manipulation: Can parse an Initialization file into an associative array and write an array back to a INI file. The class to do this is
class IniFile
LaTeX formula rendering: Provides rendering a LaTeX formula text into a transparent image (
class LaTeXRenderer
). All already existing formula-images are cached into files, there using the MD5 checksum of the formula. Returns the file path to the image file, so that the script can directly return the binary file contents. With this system it is possible to define a formula as an image reference:<img src="LaTex formula (URL encoded)" />
. For security reasons, a protected functiononTexFilter()
can be overloaded to filter the LaTex text (either to check if a trusted user is logged in or check if there are shell commands embedded in the formula). Note: This class only works if LaTeX is installed on your server. A "web space" does normally not have this feature.File system operations with exceptions:The
class FileSystem
is principally only a wrapper for the normal PHP filesystem functions, "except" that there are more detailed error messages if something goes wrong (using exceptions of cause). Furthermore the (static) functions are more elaborated, e.g. instead of using the PHP integrated functionglob
you can useFileSystem::find()
, which can search for files/patterns recursively in subdirectories and apply advanced pattern filters.HTTP Request:
HttpRequest
allows to send requests to other HTTP servers and fetch the content inclusive response headers. The headers are parsed and sanatized. The class can optionally throw an exception if the response is an error (e.g. 404).- Versioning:
Versioning
. This class provides methods to scan PHP files for javadoc style comments, collect readme files and version files to generate a unified published module in a destination folder. This target directory will then contain a zip file of the source directory, as well as the readme file, description, version, SHA1 checksum, MD5 checksum and a JSON encoded "contents file" with all contained classes and functions with their individual versions and other JavaDoc tags. The class can be also used to check published module for updates via HTTP request.
- Versioning:
Kern-Features
Der Librarykern besteht aus (meist kleinen) Klassen, die implizit geladen werden, wenn die
Initialisierungsmethode swlib::start(array $config)
aufgerufen wird. Es ist jedoch möglich
die einzelnen Features in der Klassenkonfiguration explizit auszuschalten. Im Kern enthalten
ist:
Vordefiniertes Klassen-Autoloading: Die Library-Haupklasse
class swlib
kann mehrere (konfigurierbare) Verzeichnisse nach PHP-Dateien durchsuchen und die enthaltenen Klassen in einer Index-Datei speichern. Folglich ist die Verzeichnisstruktur nicht mehr ausschlaggebend für das Autoloading der registrierten Klassen. Wenn eine Klasse noch nicht im Index bekannt ist, so indiziert dieswlib
automatisch die Verzeichnisse neu. Ist die neue Klasse danach immer noch nicht im Index, so wird eine Exception nach dem Scannen geworfen. Werden beim Indizieren Klassennamen-Duplikate gefunden, so wird ebenfalls eine Exception nach der Indizierung geworfen. Damit ist immer sichergestellt, dass keine redundanten Klassen existieren.Erweitertes Handling und Generierung von Exceptions: Die Klasse
class EException
generiert Exceptions aus PHP-Fehlern, fehlgeschlagenen Assertions und Warnungen (falls das angebracht ist), und stellt weiterhin einen globalen "Uncaught-Exception"-Handler zur Verfügung. Beispielsweise wird die Warnung "Division durch Null" in eineMathException
umgewandelt (weil das einfach eine unterbewertete aber kritische Sache ist). Dadurch hast Du eine höhere Sicherheit, dass Dein Skript nicht mit falschen Zahlen rechnet und schlussendlich"NaN"
in der Datenbank steht.Session-Management: Automatisch wird die
class Session
initialisiert, welche die Nutzer-Session verwaltet. Durch die Nutzung einer Klasse ist es einfacher, das Session-Management vom PHP-Standard auf Datenbank, eigene Dateien oder RAM (memcache) umzustellen - außer dieser Klasse muss nichts geändert werden.Output-Buffering mit der
OutputBuffer
. Die Library schaltet die Ausgabepufferung beim Start automatisch ein (default), und behandelt die Ausgabe der gepufferten Daten beim Beenden des Skripts (auch im Falle eines eines Fehlers bzw. uncaught Exception, wie z.B. beidie()
.)Tracing: Die Bibliothek kann mit der
class Tracer
gestartet werden. Diese Klasse ermöglicht es, zusätzliche Log-Informationen mit Trace-Levels (Messageprioritäten) auszugeben. Das Trace-Log enthält immer die Zeit seit dem Skriptstart, die Quelldatei und die Zeile (bei Exceptions auch ein Backtrace). Um Traceausgaben hinzuzufügen, werden die statischen KlassenfunktionenTracer::trace()
,Tracer::trace_r()
(wieprint_r()
) oderTracer::traceException()
verwendet. Der Tracer kann bei einer Exception dem Administrator eine eMail senden.GPC-magic-quote-Retouchierung: Weil GPC-Magic-Quotes mehr verwirren als einen wirklichen Nutzen bringen (und noch Server-abhängig sind), werden sie beim Start der Library in
$_GET
,$_POST
,$_FILES
, usw. entfernt - jeder sollte selbst entscheiden können wann und wie er die "Sanatizing" der Eingabe macht. Hiermit werden die Server-Abhängigkeiten kompensiert.
Weitere Klassen im Paket
Erweitertes ZIP-Datei Handling: Die Klasse
ZipFile
hat statische Funktionen, um Dateien und Verzeichnisse (rekursiv) zu packen, entpacken und zu inspizieren. WirftZipException
s, wenn Fehler auftreten.UTC und lokale Zeiten: Die Klassen
UtcDate
andLocalDate
representieren (und ermöglichen auch das Rechnen mit) UTC-Zeiten ("GMT") und lokalen Zeitangaben. Die Schnittstelleinterface IDate
bringt beide unter eine Haube, so dass Du in Funktionen, die als Parameter ein Datum / eine Zeit haben, das Interface verwenden kannst - egal ob die Zeit lokal oder UTC ist.Shell-Prozesse mit Erfassung der
stdout
undstderr
-Ausgaben: Mit derShellProcess
können Konsolenprogramme auf einfache Weise ausgeführt und Kommandozeilenargumente (und auchstdin
, wie eintippen im Shell-Window) übergeben werden. Um Rechenleistung einzusparen kannst Du angeben, ob das Programm beendet werden soll ("terminate"/"kill"), falls der Nutzer das Browserfenster schließt oder die Verbindung abbricht. Durch Ableiten und überladen der Eventmethoden ist es auch möglich, eine eigene On-The-Fly-Verarbeitung derstdout
undstderr
Ausgabe zu implementieren.**Elaboriertes Upload und Download-Management ** mit der Klasse
ResourceFile
. Diese stellt nicht nur Wrappers zum Verschieben hochgeladener Dateien zur Verfügung, sondern ermöglicht implizit auch Datei-Downloads mitETAG
,If-Modified-Since
undHTTP-Range
(partielles Herunterladen oder Fortfahren mit einem Download nach Zusammenbrechen der Verbindung). Weiterhin ist es möglich, die Downloads (z.B. für große Dateien) zu verlangsamen.**EMails (SMTP) senden: ** Eine einfache Art, Emails zu erstellen und an mehrere Empfänger zu versenden kann mit dem
class Mailer
bewerkstelligt werden. Die Klasse verwendet dasinterface IEMailContact
, welches lediglich sicherstellt, dass User- oder Adressbuchklassen die benötigte MethodetoEMailAddressString()
enthalten. Mit einer Standard-Implementierung dieser Schnittstelle (class EMailContact
) können ohne Änderungen von bereits existierenden Nutzerklassen eMails verschickt werden.Gregorianischer Monats- und Tageskalender mit Events: Dieses Feature besteht aus den Klassen
GregorianCalendar, GregorianMonthCalendarRenderer, GregorianDayCalendarRenderer, GregorianCalendarEvent and GregorianCalendarEventController.
. Der Monatskalender sieht wie ein gewöhnlicher tabellarischer Kalender aus. Er dient in meinem Anwendungsfall in erster Linie zum Anwählen des Datums für den Tageskalender. Wenn Events an einem Tag eingetragen sind, ist eine entsprechende Markierung im Monatskalender sichtbar. Der Tageskalender ist ein Timesheet, in dem Ereignisse angezeigt werden. Die Ereignisse werden bei Überschneidung automatisch möglichst platzsparend angeordnet. Jedes Ereignis ist in einem eigenen DIV-Block dargestellt, deren Inhalt Du komplett selbst bestimmen kannst. Alles, was dazu nötig ist, ist den Event-Controller zu überladen (um die Ereignisse aus einer Datenbank etc. zu laden) und den Event-Renderer zu überladen (Um die Ereignisse darzustellen). Der Rest wird von den genannten Klassen erledigt, so dass nur noch eine Formatierung über CSS gemacht werden muss. Ein Beispiel-CSS steht im Artikel des Features mit dabei.INI-Datei Parsing und Manipulation: Kann Initialisierungsdateien in ein assoziatives Array lesen und von einem solchen Array eine Ini-Datei schreiben. Die entsprechende Klasse heißt
class IniFile
.LaTeX-Formel-Rendering: Hiermit können LaTeX-Formeln in ein transparentes Bild gerendert weden (
class LaTeXRenderer
). Alle bereits gerenderten Formeln werden in Bilddateien gecached, wobei die MD5-Checksumme der Formel als Dateiname verwendet wird. Zurückgegeben wird der (interne) Cachedatei-Pfad einer Formel, so dass das Bild direkt in Binärform zum Browser gesendet werden kann. Damit kann gemäß<img src="LaTex formula (URL encoded)" />
eine Formel direkt im Bild-Link angegeben werden. Aus Sicherheitsgründen gibt es eine Methodeprotected onTexFilter()
. Damit kann nochmals überprüft werden, ob ein vertrauenswürdiger Nutzer eingeloggt ist, oder es können Shell-Befehle, die in LaTeX möglich sind, herausgefiltert werden. Beachte: Diese Klasse funktioniert nur dann, wenn auch LaTeX auf dem Server installiert ist, dies ist bei einem "normalen" Webspace nicht der Fall.Dateisystem-Operationen mit Exceptions: Die
class FileSystem
ist prinzipiell nur ein Wrapper für die integrierten Dateisystem-Funktionen in PHP - mit der Besonderheit, dass Exceptions mit detaillierten Fehlermeldungen geworfen werden. Weiterhin beinhaltet die Klasse erweiterte Funktionen, z.B. kann anstatt der integrierten Funktionglob
die FunktionFileSystem::find()
verwendet werden. Diese durchsucht Verzeichnisse auch rekursiv mit erweiterten Filtern/Patterns.HTTP-Request:
HttpRequest
dient zum Absenden von GET/POST requests an andere Webserver. Abgefangen und aufbereitet werden neben dem Response-Inhalt auch die Headerinformationen.Package Publishing und Versionsprüfung:
Versioning
scannt angegebene "Package"-Verzeichnisse nach.class.php
-Files, liest die Dokumentationskommentare heraus und erstellt Code-Checksummen über die alle Dateien im Package für eine Versionsprüfung. Weiterhin enthält die Klasse statische Funktionen, die mithilfe dieser Methoden ein "Repository" erstellen können, und für ein Package eine Versionsprüfung über HTTP-Lookup (auf ein solches Repository) durchführen können.
Download
The libeary is available as http GIT repository here
Download
Die Bibliothek kann mit GIT heruntergeladen werden, das HTTP-Repository ist here