Da hat sich wieder jemand einige Gedanken gemacht, wie man es einem erleichtern kann, in AJAX Applikationen, mit Zend_Db_Table zu arbeiten. Dieser Jemand ist war und ist Maurice Fonk. In seinem Blog beschreibt er sein JsTable getauftes Projekt, wie folgt:
JsTable is a Prototype class that allows you to work with Zend_Db_Table objects directly from Javascript. It has mechanisms for basic communication with a server that holds the ‘real’ models. It gets it’s information in Json, either synchronously or asynchronously.
Ich finde dieses Projekt sehr interessant, jedoch hat es, wie schon im Artikel beschrieben und im ersten Kommentar von Greg noch einige Sicherheitsprobleme, wodurch ich derzeit noch jedem davon abrate es zu nutzen. Testen kann man es aber für den öffentlichen Einsatz ist es meiner Meinung noch nicht geeignet. Ich habe mir das für das Projekt mal ein Lesezeichen angelegt und ich werde auch die Diskussion in der Zend Framework Mailinglist verfolgen.
Gestern musste ich aufgrund einer kleineren Umstrukturierung ein Skript von $_POST auf $_GET umschreiben, da die PHP Datei nicht mehr direkt sondern nurnoch indirekt eingebunden wurde (durch ein <embed>). Also suchte ich etwas, womit ich einen POST Request schnell in einen GET Request umwandeln kann und da fand ich pecl_http. Ich muss sagen, dass diese Extension super ist. Mit http_build_str konnte ich einfach meinen POST Request in eine GET URL umwandeln. Sehr nett finde ich auch die 7 HTTP*-Klassen, denn mit ihnen kann man einiges einfacher handhaben und man muss sich nicht mehr um die Formatierung des Requests kümmern. Meiner Meinung nach eine sehr gute Extension, aber leider ist es noch eine Extension und muss so nachträglich installiert werden.
Ich weiss nicht wieso, aber irgendwie bin ich heute morgen aufgestanden, habe geduscht und mich fertig gemacht und schau dann auf die Uhr und sehe, dass ich normal um diese Uhrzeit noch nicht mal wach bin. Keine Ahnung, wieso ich heute so früh wach bin und nichtmal auf die Uhr geschaut habe.
Naja ich habe die Zeit genutzt und nochmal zwei Tests von Zend_XmlRpc_Server zu machen und habe diese an die Zend Framework Mailinglist geschick, damit Matthew Weier O'Phinney sich diese anschauen kann, denn laut seiner letzten Mail zu dem Thema laufen meine Codes bei ihm, aber komischerweise nicht bei mir.
Gute Frage, aber derzeit habe ich nicht viel zu erzählen und ich arbeite grade öfters an einer neuen Version des Blogs und versuche den Blog in den nächsten 1-2 Monaten auf einen Stand zu haben, dass man ihn auch mal Live testen kann. Derzeit sitze ich an einem XML-RPC Backend für die Administration, jedoch will die Zend_XmlRpc_Server Klasse meine Requests nicht so handhaben, wie ich es will und von daher hakt es da ein wenig. Zudem musste ich vor paar Tagen Anpassungen an meinem Code machen, da z.B. Zend_Filter::Int() nun zu Zend_Filter_Int::filter() geworden ist und das musste erstmal ausgebessert werden.
Ich werde mal schauen, ob ich in nächster Zeit vielleicht mal öfters über die Neuerungen an meinen Blog berichte, denn da sind doch schon einige spannende Sachen bei.
Seit gestern gibt es ein neues Release des [url=http://framework.zend.com/]Zend Frameworks[/url]. Wenn man sich mal die [url=http://framework.zend.com/changelog]Changelog[/url] anschaut, dann sieht man mal wie da derzeit reingehauen wird um bald endlich die Version 1.0 zu präsentieren. Diese soll, laut Roadmap, Ende März kommen und dann wird das Zend Framework sicherlich nochmal einen großen Schub bekommen, denn dann ist das Framework endlich auf einen Stand, mit dem man produktiv arbeiten können soll. Das wird dahingehend noch sehr viele hinzuziehen, die sich bisher noch nicht getraut haben was damit zu machen, da sich noch zu oft was ändert.
Wenn man sich mal meinen eingesetzte Version des Zend Frameworks anschaut, dann sieht man mal wie alt die Version ist. Ich nutze noch die Version 0.2.0 mit Revision 1478 und aktuell gibt es nun Version 0.8.0 mit Revision um 3500.
Stolz auf diesen Release bin ich auch, da zwei meiner Reports für diese Version beachtet wurden und sogar geschriebener Patch (#ZF-728) für Zend_Log_Adapter_Db eingespielt wurde. Somit gehört mir zumindest schonmal eine Zeile im Code des Zend Frameworks.
Hinweis: Dieser Artikel bezieht sich auf Privates mal ganz Öffentlich.
Aus dem deutschen Zend Framework Forum ging die Diskussion nun in die Mailinglist des Zend Frameworks und das eigentliche Problem hat sich herausgefiltert. Der Fehler ist nicht, dass man private Eigenschaften, die Objekte beinhalten, manipulieren kann, sondern dass bei einem Array-Typecast die protected und private Eigenschaften auch rüberkommen. Bei dem Typecast sollten theoretisch nur als public deklarierte Eigenschaften in einen Array umgewandelt werden, dann würde sich das genauso verhalten wie folgender Code:
<?php
class ForeachTest {
public $a = 'test_a';
protected $b = 'test_b';
private $c = 'test_c';
}
$oForeachTest = new ForeachTest;
foreach ($oForeachTest as $sKey => $mValue) {
echo $sKey . ' => ' . $mValue;
}
?>
Bei diesem Code werden nur die öffentlichen (public) Eigenschaften beachtet. Ein Array-Typecast soll sich also genau verhalten und nur die public Eigenschaften beinhalten. Mal schauen was draus wird. Ich hoffe jedoch, dass das anerkannt wird.
a => test_a
Hinweis: Dieser Artikel wird weitergeführt in Privates mal ganz Öffentlich II.
Programmierern die sich schonmal mit der Objektorientierten Programmierung auseinandergesetzt haben, wissen sicherlich was der Unterschied der verschiedenen Sichbarkeiten (public, protected, private) ist. Diese Sichbarkeiten wurden aus dem Grunde geschaffen um den Zugriff auf einzelne Eigenschaften und Methoden nur für bestimmte Zwecke freizugeben. Für die, die nun noch nicht wissen, was die Sichbarkeiten genau sind, nochmal ein kleiner Exkurs.
Es gibt in PHP und vielen anderen Sprachen drei Sichbarkeiten (andere Sprachen können auch mehr haben). Zu diesen Sichtbarkeiten zählen public (öffentlich), protected (geschützt) und private (privat). Alle Methoden und Eigenschaften in Klassen die als public deklariert sind können innerhalb der Klasse sowie von ausserhalb durch eine Instanz genutzt werden. Sie sind für alle öffentlich verfügbar. Ist eine Methode oder eine Eigenschaft als protected deklariert, so ist sie nur aus der eigentlichen Klasse und allen erbenden Klassen verfügbar. Der Zugriff von aussen ist somit nicht mehr möglich. Als private deklarierte Methoden und Eigenschaften gelten nur in der Klasse, in der sie deklariert wurden.
Bei PHP gab es hinsicht auf die Sichtbarkeit schon einige Diskussionen, aber nun habe ich vor einigen Wochen durch Zufall herausbekommen, wie man an protected und private Eigenschaften kommt. Wenn man nun ein wenig zurückdenkt, so habe ich erklärt, dass sie nur für die eigentliche Klasse und alle erbenden Klassen verfügbar sind. Aufgefallen ist mir dies beim Arbeiten mit der Zend_Config-Klasse bei der ich ein Objekt zu einem Array umwandeln wollte und einfach mal einen Array-Typecast genutzt habe. Primär war mir dabei aufgefallen, dass mir bei einer Ausgabe mittels Zend::dump() bzw. var_dump() irgendwelche Zeichen untergekommen waren, die es sogar verhinderten die Ausgabe in den Zwischenspeicher zu kopieren. Erst dachten wir, dass es an einem falschen Zeichensatz liegt, aber es wird wohl mitunter ein Sicherheitsaspekt sein. Trotz dessen habe ich weitergeschaut und herausgefunden, wie man an, als protected und private deklarierte, Eigenschaften kommt. Am besten kann ich das mit einem Beispiel erklären.
<?php
class Visibility
{
private $privProp;
public function __construct() {
$this->privProp = new stdClass;
$this->privProp->bImportant = true;
}
public function isImportant() {
return $this->privProp->bImportant;
}
}
?>
Hier haben wir die Visibility (engl. Sichtbarkeit) Klasse, die eine private Eigenschaft beinhaltet. Beim Erzeugen einer Instanz der Klasse wird im Konstruktor die private Eigenschaft privProp mit einem Objekt der Klasse stdClass gefüllt. Diesem Objekt geben wir dann ebenfalls noch eine Eigenschaft (public) namens bImportant. Sie beinhaltet einen boolschen Wert und ist wichtig für den weiteren Verlauf. Okay, in diesem Beispiel ist diese Eigenschaft eher unwichtig aber wir stellen uns nun einmal vor, dass dort ein wichtiger Status gespeichert wurde, der unbedingt für den weiteren Verlauf benötigt wird. Die Methode isImportant() macht nichts als den Wert der Eigenschaft bImportant zurückzugeben. Wir erwarten nun also, dass die Methode true zurückgibt. Hier nun ein weiteres Beispiel:
<?php
$oVisibility = new Visibility;
var_dump($oVisibility->isImportant()); // true
?>
Das hat ja bis dahin super geklappt, die Methode gibt, wie erwartet true zurück. Laut der Definition der Sichtbarkeit müsste man sich in diesem Fall voll und ganz darauf verlassen können, denn solange der Code der Klasse nicht geändert wird, kann da auch nichts passieren. Falsch gedacht, denn genau das können wir nicht. Wir können uns noch nicht mal bei private Eigenschaften darauf verlassen, dass drin steht, was vorher mal drin stand. Man nimmt also die Variable $oVisibility und wandelt das beinhaltete Objekt in einen Array:
$aProperties = (array) $oVisibility;
Eine Ausgabe von $aProperties spare ich mir nun, da es genau bei dieser Ausgabe vorkommt, dass da irgendwelche kryptischen Zeichen drin sind, die es verhindern die Ausgabe im Zwischenspeicher zu speichern. Dies tritt aber nur bei private und protected Eigenschaften auf. Soweit sogut, jetzt müssen wir an die Eigenschaft kommen und sie manipulieren. Einen direkten Zugriff haben wir durch die kryptischen Zeichen nicht, also müssen wir alle Eigenschaften durchlaufen und prüfen, ob wir ein Objekt finden, das eine Instanz der Klasse stdClass ist. Haben wir es gefunden, können wir es manipulieren.
<?php
foreach ($aProperties as $mProperty) {
if (is_object($mProperty) && ($mProperty instanceof stdClass)) {
$mProperty->bImportant = false;
}
}
?>
So, das wärs schon. Haben wir die Eigenschaft gefunden überschreiben wir die Eigenschaft bImportant durch ein false. Fügen wir diesen Codeblock nun in unser Beispiel ein haben wir ein komplett anderes Bild:
<?php
$oVisibility = new Visibility;
foreach ($aProperties as $mProperty) {
if (is_object($mProperty) && ($mProperty instanceof stdClass)) {
$mProperty->bImportant = false;
}
}
var_dump($oVisibility->isImportant()); // false
?>
Wieso ist denn nun die Ausgabe von isImportant() nicht mehr true? Ja, wie kommt das wohl? Wir haben sie von aussen manipuliert, ohne die eigentliche Klasse zu verändern. Nun ist die Frage, ob dies wirklich im Sinne der PHP Entwickler ist, dass man trotz der Sichtbarkeit, als private und protected deklarierte Eigenschaften manipulieren kann. Meiner Meinung nach ist das ein Bug und sollte behoben werden.
Heute stiess ich beim Zend Framework auf kleinere Probleme, die jedoch einen umständlichen Workaround erforderten. Aufgrund einer falschen Benutzung der Zend_Db_Adapter_Abstract::insert()-Methode konnte man die Zend_Log_Adapter_Db::write()-Methode nicht benutzen und musste sich bisher immer einen Workaround schreiben. Nach einer kleinen Diskussion im deutschen Zend Framework Forum habe ich dies gemeldet und einen Patch geschrieben, der diese Probleme löst.
Mal schauen was sich draus entwickelt.
Seit einigen Wochen gibt es nun für das Zend Framework, ein kleines deutsches Forum für Anfänger bis ZF-Entwickler, in dem man sich über Neuerungen und Ideen zum Zend Framework unterhalten kann, aber auch seine eigenen Projekte, welche mit dem Zend Framework entwickelt werden, planen und diskutieren kann.
Dieser meinige Blog war Anfangs nur ein erster Test des Zend Frameworks und hat bisher auch noch nicht viel andrang bekommen an Lesern und daher kann ich es mir erlauben meinen Blog nochmal neu aufzubauen. Diese Neustrukturierung werde ich anfangs mit den Benutzern im Forum durchdiskutieren, damit die neue Version des Blogs in Sachen Programmierung auch sehr viel eleganter und übersichtlicher wird. Es wird einige neue Sektionen geben, ich werde ein wenig aufräumen und Funktionalitäten des Blogs ausbessern und stabiler gestalten.
Heute habe ich einen kleinen Bug in PHP entdeckt, welcher in späteren Versionen jedoch schon gefixed wurde. Fehler ist nur auf Microsoft Windows XP Prof. SP2 getestet.
<?php
$test = array(
'data' => array(
'persons' => array(
array(), array(), array()
)
)
);
foreach($test->data->persons as $aPerson) {
// ...
}
?>
Wird also versucht auf einen Array zuzugreifen, als wäre es ein Objekt, so stürzt sich PHP mit folgender Meldung über den Jordan:
Die Anweisung in "0x10008f4a" verweist auf Speicher in "0x00000000". Der Vorgang "written" konnte nicht auf dem Speicher durchgeführt werden.
Ich habe diesen Bug in den Versionen 4.4.0, 5.1.4 und 5.2.0 getestet und es scheint ein Fehler in der Version 5.1.2 zu sein. Ein Update hilft also.
Aufgrund eines, mir noch nicht bekannten Fehlers, kann derzeit die Suche nicht benutzt werden. Aus irgend einem Grund, kann der Lucene Index nicht erstellt werden (auch nicht als root).
Update: Komischerweise geht es nun wieder. Wird wohl ein temporäres Problem gewesen sein. Konnte auch nach langem Suchen keinen Fehler finden, denn am Skript selbst habe ich schon lange Zeit nichts gemacht und nach dem Update, des Zend Frameworks, lief das Skript ja auch noch. Naja, nun läuft wieder alles so, wie es soll.
Nach langem rumprobieren habe ich es endlich geschafft PHP5.2 zu installieren. Ich habe bei der Installation auch noch einige Extensions, die ich nicht benötige rausgenommen. Zusätzlich habe ich die Extension Suhosin installiert. Auf der Internetseite wird Suhosin wie folgt beschrieben:
Suhosin is an advanced protection system for PHP installations. It was designed to protect servers and users from known and unknown flaws in PHP applications and the PHP core. Suhosin comes in two independent parts, that can be used separately or in combination. [...]
Weitere Informationen können auf der Internetseite von Suhosin nachgesehen werden.
So, ich habe nun mal wieder die aktuellste Version des Zend Frameworks eingespielt, da vor kurzem die Version 0.2 veröffentlicht wurde. Bisher habe ich keine Fehler finden können, wie beim letzten Update. Mal schauen ob es da irgendwas gibt, was nicht mehr so läuft wie zuvor. In der ChangeLog konnte ich auch nichts direkt finden, was mich betreffen könnte bzw. sich schecht auswirken könnte.
Mein Administrationsbereich wurde nun ein wenig verbessert und das Eintragen von neuen Einträgen um einiges vereinfacht. Ich habe auf der Seite eines Freundes einen kleinen Editor gefunden und diesen habe ich, ein wenig angepasst, in meine Administration dieses Blogs eingebaut. Es gibt einige andere Editoren auf Javascript-Basis, aber die meisten sind komplex oder nur schwer anzupassen. Der Editor von q-rios ist klein, leicht anpassbar und einfach in die eigene Seite zu implementieren.
Heute habe ich mein erstes Zitat bekommen. Im IRC-Channel #php.de (Quakenet) wurde heute über eine kleine Anpassung einer Webseite diskutiert und da kam dann folgendes Zitat raus, welches auch hier betrachtet werden kann.
< eYo`awy> wie gesagt, 100eur und ich machs :D
< jumpy^afk> dafür geh ich mir lieber ne frau kaufn
< freq9> die kann aber ned programmieren
In diesem Zitat bin ich "freq9".
Ich habe mich heute rangesetzt und ein Skript geschrieben, welches ab heute immer Nachts ausgeführt wird und den Index der Suchmaschine neu indiziert. Also wird der Index ab heute alle 24 Stunden wieder komplett aktuell sein. Das erste indizieren passiert heute Nacht und ich werde morgen früh direkt mal schauen, ob alles so funktioniert wie ich es mir vorstelle.
Ich saß gestern sehr lange dran eine geeignete Lösung zu finden, die Einträge in den Index zu packen, aber derzeit unterstützt der Index noch keine Umlaute, also versuchte ich das ganze irgendwie umzuwandeln, sodass es ANSI ist aber nicht wollte so richtig funktionieren. Also habe ich gestern Abend eine E-Mail in die Zend Framework Mailinglist geschrieben. Vor ca. 1 Stunde kam dann eine E-Mail von Natalie Kather, die für die NorthClick GmbH arbeitet. Die NorthClick GmbH arbeitet an einem CMS in das die Java Lucene Lösung des Zend Frameworks integriert werden soll und dabei hatten sie die selben Probleme wie ich. Sie hat darauf einen Artikel geschrieben, in dem sie erklärt, wie man die Einträge passend für den Index konvertiert. Diese habe ich gemacht und es funktioniert super. Ihr könnt ganz einfach einen nach einem Suchbegriff suchen. Falls ihr ein Suchebgriff in den Titeln der Einträge suchen wollt, dann müsst ihr dem Suchbegriff ein "title:" anhängen. Also:
title:umstellung
Dieser Suchstring findet dann alle Einträge, die im Titel den Begiff "umstellung" haben. Wenn ihr nach aktuellen Einträgen suchen wollt, muss ich euch vorerst noch sagen, dass ich mir noch über das automatische indizieren ein paar Gedanken machen muss. Bis dahin müsst ihr euch erstmal mit den Artikeln vor diesem Eintrag zufrieden geben.
Da mein Zend Studio seit gestern sehr langsam ist, für einen Dateiwechsel >5 Sekunden braucht und auch das Öffnen von Dateien nicht schneller ist, habe ich mir mal Eclipse 3.1 mit den Plugins phpEclipse und subclipse installiert. Also ich muss sagen, dass ich noch nie so schnell von einer IDE begeistert war, wie jetzt. Ein paar Einstellungen, sodass der Highlighter gut aussah, die 80 Zeichen Grenze rein, kleinere Anpassungen an der Schrift und schon kann man super mit Eclipse arbeiten. Auch sehr gut finde ich das SVN Plugin (subclipse) womit man super easy mit einem SVN Repository arbeiten kann. So macht es sehr viel Spaß zu arbeiten.
Durch mein neustes Buch Suchmaschinen entwickeln mit Apache Lucene und der gegebenen Funktionalität des Zend Frameworks werde ich heute oder in den nächsten Tagen eine Suchfunktion in diesen Blog einbauen. Heute morgen habe ich schon einige Tests vorgenommen und auch mal das Framework selbst auf den neusten Stand gebracht. All diese Änderungen werde ich in den nächsten Tagen mal online stellen und natürlich werde ich hier nochmal einige Informationen zu den Änderungen geben.
Ich habe soeben mal die Engine dieses Blogs, welche das Zend Framework 0.1.5 darstellt, aktualisiert. Bisher habe ich die Revision 924 genutzt, aber nun, wo ich ja Internet habe, habe ich es endlich geschafft auf eine neue Revision zu updaten. An der Revisionsnummer kann man auch erkennen, wie lange ich schon kein Internet hatte. Die aktuelle Version des Zend Frameworks hat nun die Revision 1021. Bisher habe ich noch keine Fehler finden können und ich hoffe auch, dass es keine gibt. Ich werd später dann mal testen, ob es irgendwo Fehler gibt und falls es wirklich welche gibt, wie ich sie fixe.
Heute erreichte die Zend Framework Developer Mailinglist eine E-Mail von Andi Gutmans in der er berichtete, dass Zeev Suraski in Japan sei und dort einen Vortrag über das Zend Framework gehalten hat. Anbei dieser E-Mail befanden sich zwei Fotos von diesem Vortrag. Eines dieser Bilder könnt ihr euch hier anschauen. Andi Gutmans bezeichnete diese Tüte als:
[...] one of the first pieces of Zend Framework "merchandise". Cool stuff.
Gestern hat Maik es endlich geschafft meinen vSERVER einzurichten. Okay es wurde ein Template installiert mit Fedora Core 3. Erschrocken habe ich mich direkt als ich die MySQL Version sah. Es war MySQL 3.23.xx drauf. Maik erklärte mir dann warum keine neuere Version drauf war und meinte, dass ich, wenn ich wollte mir eine neuere Version per rpm installieren kann. Dies tat ich kurz drauf auch. Nun rennt der vSERVER auf dem dieser Blog nun läuft mit folgender Konfiguration:
Es hat aber im großen und ganzen einige Stunden gedauert bis ich diesen Blog endlich im Internet betrachten konnte, da ich einige Dateien des Blogs beim letzten Kopieren nicht mitkopiert hatte und ich diese Dateien erstmal wieder schreiben musste. Dann hab ich noch feststellen müssen, dass ich mod_rewrite nicht geladen hatte und seit heute 13 Uhr läuft der Server. Ich habe bisher noch einige Änderungen vorgenommen aber nun sollte der vSERVER erstmal laufen.
Heute morgen habe ich einen Kollegen über ICQ angeschrieben und ihn wegen einem php5-fähigen Webspace gefragt. Denkt nun ja nicht, dass ich zu faul wäre zu ihm hin zu gehen. Normal sitzt er ja neben mir im Büro, aber seit einer Woche ist er in Bulgarien und von daher wäre das nun ein wenig schwer gewesen. Jedenfalls fragte er mich dann, was der Webspace für Features haben soll. Ich habe ihm dann meine Wünsche (php5, mysql5, gdlib, mysqli, ...) geäußert und er hat meinen Wunsch dann weitergeleitet. Soweit ist nun alles geklärt, nur muss ich nurnoch mit einem anderen Kollegen sprechen, dass er mir einen Account einrichtet. Heute habe ich es nicht mehr geschafft mit ihm zu sprechen, da er viel zutun hatte und ich ebenfalls noch einige zutun hatte.
Wenn ich nun endlich bald meinen Space bekomme, kann ich mir vllt. auch eine Domain registrieren und diesen Blog endlich ins Internet setzen. Ja, alle Einträge, die bis jetzt bestehen, sind alle offline verfasst worden, da ich keinen php5-fähigen Webspace habe. Aber bald ist es so weit.
Ich habe nun eine Woche hinter mir und es macht sehr viel Spaß bei der intergenia AG zu arbeiten. Mit meinen Arbeitskollegen komme ich super klar und es ist auch immer wieder lustig. Die Aufgaben, welche ich bekomme haben auch immer mehr an Gestalt. Anfangs musste ich noch kleinere Standalone-Anwendungen schreiben und nun kommt immer mehr hinzu. Nun muss ich mit Subversion arbeiten und muss mich auch im trac zurechtfinden und meine Tickets abarbeiten. Es waren anfangs wirklich noch so "geschlossene" Aufgaben, wo mir von Anfang bis Ende gesagt wurde, wie was am Ende aussehen soll, aber nun wird auch schon vieles mir überlassen. Ich tauche mit meinen Aufgaben immer mehr in die Hauptentwicklung ein, wobei das noch ein langer Weg sein wird.
Zusammengefasst macht es sehr viel Spaß, ich habe nette Mitarbeiter und lernen tut man auch sehr viel.