am 24. Februar 2010
Als erstes gibt’s heute noch mal eine Erinnerung an unser Gewinnspiel. Für einen Backlink könnt ihr noch ein Planungspokerspiel gewinnen, Es sind noch ein paar von unseren 50 da. So genug der Eigenwerbung. Wieder zurück zum Thema.
Ich habe heute kurz mit Frank Bültge, meinem WordPress Guru, gesprochen, weil ich wissen wollte, wie er ein bestimmtes Plugin umsetzen würde. Natürlich hatte er auch gleich ein Beispiel zur Hand. Davon werdet ihr die nächste Zeit bestimmt auch noch hören, denn da habe ich noch was schönes vor. Was mir aber aufgefallen ist, ist dass ganz häufig in WordPress Plugin Quellen so was wie
if ( function_exists( 'doSth' ) { doSth( $arg1, $arg2 ); }
vorkommt. Das ist auf jeden Fall der saubere Weg, denn man möchte ja nicht, dass der Blog kaputt ist, nur weil ein Plugin ausgeschaltet wurde und ich eine Methode davon einbinde. Irgendwie ist das aber trotzdem duplizierter Code und das mögen wir ja gar nicht.
Spontan kam mir da heute eine Idee, wie man das testen für solche einfachen Fälle, wie oben beschrieben, machen könnte, ohne dass mir PHP da wild Fehler wirft. Das soll hier nur ein Proof of Concept sein. Keine Ahnung, ob ich oder jemand anderes es mal produktiv einsetzen wird. Seht es einfach als Denkanstoß.
Was müssen wir also machen? Eigentlich nicht viel, denn dank der magischen Methoden und PHP 5.3 wird einem eigentlich schon das meiste Out-of the-box geliefert. Wie würde ich mir einen nicht-doppelten Code vorstellen? So:
ifExists::doSth( $arg1, $arg2 );
Der Trick daran ist, dass man eine ifExists Klasse bastelt, die wie folgt aussieht:
class ifExists
{
public static function __callStatic( $functionName, $args )
{
if ( function_exists( $functionName ) ) {
call_user_func_array( $functionName, $args );
}
}
}
Das ganze funktioniert nach folgendem Schema. Da die statische Methode doSth in der Klasse ifExists nicht existiert, wird die magische Methode __callStatic aufgerufen, um den „Fehler“ abzufangen. Was wir jedoch machen ist den Aufruf an die global gültige Funktion weiterzuleiten, falls diese existiert. Fertig. Was anderes müssen wir gar nicht mehr machen, Außer vielleicht die Klasse dem System bekannt machen, aber dass könnte ja WordPress übernehmen, die sind ja eh ein Freund von so Dingen.