Martin Lantzsch
Software Entwickler
19. Februar 2014

Getter und Setter mit Netbeans generieren

19. Februar 2014 - Geschrieben von Martin - Keine Kommentare

Netbeans Getter und Setter generieren

Da ich eine Apple Tastatur an meinem Windows Rechner nutze konnte ich bisher nie die Tastenkombination ALT + EINFÜGEN nutzen um bei PHP Klassen Getter und Setter in Netbeans automatisch generieren zu lassen. Da mich das ziemlich störte habe ich nun einfach mal das Menü abgegrast und tatsächlich einen Punkt gefunden, der auf genau diese Funktion verweist:

Source -> Insert Code… anschließend Getter and Setter wählen, ein paar Properties markieren, ggf. noch ein Häkchen beim Chaining und zack sind die Methoden generiert. Nice Code!

Achja, die Stelle an der sich der Cursor befindet entscheidet wo die Methoden eingefügt werden ;-)

20. Januar 2014

Domain Driven Design mit PHP umsetzen

20. Januar 2014 - Geschrieben von Martin - Keine Kommentare

In der Planungsphase meiner Anwendungsplattform für Geschäftsprozesse habe ich festgestellt, dass es relativ wenig Leute gibt, die sauberes DDD mit PHP umsetzen. Wobei wir gar nicht mal zu solch „ausgefallenen“ Sprachen greifen müssen. Selbst die Paradebeispiele in Java aus Lehrbüchern sind oftmals unsauber umgesetzt.

Beim DDD sollte man eigentlich auf jegliche Abhängigkeiten zwischen Framework + Bibliotheken und der eigentlichen Domain Logik (Entities, Value Objects, Repository Interfaces, etc.) verzichten. Es sollte in keiner Domain Klasse eine Referenz beispielsweise zu einem Validator aus einem Framework enthalten sein. Zumindest meiner Auffassung nach halte ich das für unschön, da der Code so nicht mehr sauber portierbar und wiederverwendbar ist.

Was nun PHP auch im Speziellen angeht wollte ich anmerken – Doctrine Entities sind keine Domain Entities. Schließlich haben diese einen Verweis auf das ORM und obendrein sind die Entities direkt mit Implementierungsdetails verbunden. Dementsprechend gehören Doctrine Entities in die Infrastruktur.

Bei Residata handhaben wir es so, dass Doctrine unsere Domain Entities über ein vordefiniertes, auf jeden Entiy übertragbares Schema in der Infrastruktur Schicht mappt. Die Domain Entities wiederrum sind einfache PHP Klassen ohne Referenzen, lediglich mit einem PHPDoc Kommentar versehen um die Datentypen kenntlich zu machen.

Das Repostiory wird als Interface definiert und ebenso von Doctrine oder jeder anderen gegen die Schnittstellen der Plattform implementierten Persistenzschicht automatisch „befüllt“. Ausgefallene Abfragen die nicht automatisch bereitgestellt werden kann man in einem AbstractRepository oder einem Service über einen extra Builder bauen, der auch von der Persistenzschicht in eine Abfragesprache übersetzt wird.

Wie genau das alles nun in Code ausseht, das werde ich in den kommenden Tagen hier veröffentlichen. Ob die ganze Plattform unter einer Open Source Lizenz veröffentlich wird weiß ich allerdings noch nicht.

25. August 2013

Standard PHP Library (SPL) Beispiele

25. August 2013 - Geschrieben von Martin - Keine Kommentare

Ich habe festgestellt das viele Leute kaum Bestandteile aus der SPL (Standard PHP Library) nutzen. Wahrscheinlich weil die Dokumentation auf php.net ein wenig zu wünschen übrig lässt. Aus diesem Grund habe ich vorhin begonnen ein paar Beispiele zu schreiben, die den korrekten Einsatzzweck von SPL Klassen nicht nur erahnen lassen sondern auch an teilweise Real World Szenarien zu verstehen helfen.

Das ganze ist auf GitHub in meinem Repository SPL-Examples zu finden.

29. Oktober 2012

Bitfelder/Bitfields mit PHP

29. Oktober 2012 - Geschrieben von Martin - Keine Kommentare

Heute beschäftigte ich mich damit Bitfelder in PHP abzubilden. In meinem Fall wurde eine Variable mit verschiedenen Flags befüllt. Am altbekannten
OOP Beispiel Auto könnten diese Flags zum Beispiel Ausstattungsmerkmale sein:

  • Panoramadach? Ja/Nein
  • Navigationssystem? Ja/Nein
  • Alufelgen? Ja/Nein

Um diese Werte nun besondern Speicherplatzschonend zu sparen, wollen wir nun alles in ein Bitfeld speichern. Ein Bitfield mit Flags ist eigentlich nur eine Folge von Nullen, auf der Bits gesetzt (0 –> 1) werden können.

Beispielsweise hat unser Auto die Merkmale Panoramadach und Alufelgen, dann sieht dieses Bitfield so aus:

101

Gelesen wird die Ausstattungsmerkmalliste von oben nach unten und das Bitfeld von rechts nach links. Die erste 1 sagt, ja wir haben ein Panoramadach, die 0 sagt Nein wir haben kein Navigationssystem und die zweite 1 ganz links verrät Ja wir haben Alufelgen.

Mit PHP können wir dieses Bitfield so erzeugen:

$bitfield;
$bitfield |= 1 << 0; // An die erste (also 0te) Stelle im Bitfield eine 1 setzen
$bitfield |= 0 << 1; // An die zweite eine 0
$bitfield |= 1 << 2; // Und an die dritte eine 1

In der zweiten Codezeile gibt die 1 an, dass das Bit gesetzt ist, das „<<" setzt dann diesen Vorrausgehenden Wert auf die nachfolgende Stelle (in dem Fall 0) im Bitfeld.

0 << 0 // erstes Bit ist Null
0 << 1 // zweites Bit ist Null
0 << 2 // drittes Bit ist Null
1 << 3 // viertes Bit ist Eins
1 << 4 // fünftes Bit ist Eins

Nun können wir uns mit folgender Funktion die Binärzahl ausgeben lassen:

echo base_convert($bitfields, 10, 2);

Dieser Funktionsaufruf konvertiert die Zahl von der Basis 10 zur Basis 2 und gibt sie aus:

101

Passt. Nun können wir noch prüfen, ob z.B. das erste Bit gesetzt ist:

if($bitfield & 1 << 0)
    echo 'Das erste Bit ist gesetzt.';

Hier wird geprüft, ob das gesetzte Bit in der Bitfield Variable und „1 << 0" gleich sind. Wenn ja ergibt der Ausdruck true. Damit das ganze halbwegs dynamisch bleibt und man nicht immer die Bitzuweisung von Hand tippen muss, so können wir diese auch in einer Varibale oder Konstante speichern:

define('MERKMAL_PANORAMADACH', 1 << 0);
define('MERKMAL_NAVIGATIONSSYSTEM', 0 << 1);
define('MERKMAL_ALUFELGEN', 1 << 2);
 
$bitfield;
$bitfield |= MERKMAL_PANORAMADACH;
$bitfield |= MERKMAL_NAVIGATIONSSYSTEM;
$bitfield |= MERKMAL_ALUFELGEN;
 
if($bitfield & MERKMAL_ALUFELGEN)
    echo 'Jep, das Auto hat Alufelgen.';

22. August 2012

Nach Angriff alle .htaccess von einem Webspace löschen

22. August 2012 - Geschrieben von Martin - Keine Kommentare

Viele Bots platzieren auf Webspaces, die gekapert wurden .htaccess Dateien, in denen Redirects stehen, um die Besucher der jeweiligen Webseite auf dubiose andere Seiten zu leiten. Da man bei einem CMS System durchaus mehrere hundert Verzeichnisse hat, in das die .htaccess rekursiv reingeschrieben wurden, ist der Aufwand natürlich sehr hoch diese einzeln zu löschen.

Ich habe mir hierzu folgendes *zwei Minuten muss unbedingt die .htaccess schnell löschen* Script geschrieben, da doch immer wieder Webspaces bereinigt werden müssen, wenn deren Eigentümer zu einfache Passwörter verwendet oder diese weitergegeben haben.

<?php
function deleteHtaccess($dir) {
	$files = scandir($dir);
	$files[0] = null;
	$files[1] = null;
	foreach($files as $f) {
		if($f != null) {
			if(is_dir($dir.'/'.$f)) {
				deleteHtaccess($dir.'/'.$f);
			} else if($f == '.htaccess') {
				chmod($dir.'/'.$f, 777);
				unlink($dir.'/'.$f);
				echo 'delete '.$dir.'/'.$f.'<br>';
			}
		}
	}
}
deleteHtaccess('./');

19. Juli 2012

PHP – Array zu Excel

19. Juli 2012 - Geschrieben von Martin - Keine Kommentare

Eine Excel Datei generiert man wohl am besten mit „PHPExcel„, hat am meisten Funktionen, unterstützt sehr viele Excel Eigenschaften – aber, genau da liegt der Hund begraben. Es ist für viele Projekte und einfache Exporte einfach zu viel.

Deshalb verwende ich für solche Fälle immer die „php-excel“ Klasse.

Diese hat keine 200 Zeilen Code, ist extrem schnell und wandelt ganz einfach verschachtelte Array’s in Excel Tabellen um.

<?php
require 'php-excel.class.php';
$data = array(
	array('Spaltenüberschrift 1', 'Spaltenüberschrift 2', 'Spaltenüberschrift 3'),
	array('Wert A2', 'Wert B2', 'Wert C2'),
	array('Wert A3', 'Wert B3', 'Wert C3')
);
$xls = new Excel_XML('UTF-8', false, 'Name der Arbeitsmappe');
$xls->addArray($data);
$xls->generateXML('Dateiname');

Dies wird nun dem Browser eine Excel Datei namens „Dateiname.xls“ zum Download anbieten, welche wie folgt aufgebaut ist:

Spaltenüberschrift 1 Spaltenüberschrift 2 Spaltenüberschrift 3
Wert A2 Wert B2 Wert C2
Wert A3 Wert B3 Wert C3
3. Mai 2012

Wie man Parameter ordentlich verkackt

3. Mai 2012 - Geschrieben von Martin - Keine Kommentare

Eben musste ich das lesen:

$import->sArticle($article_data, array("update", false));

Es wird ein Array als Parameter verwendet, allerdings kann man dort nur einen Wert übergeben. Und zwar ist Key 1 der Name des Parameters und Key 2 der Wert. Wie bekloppt ist das bitte?
Wenn später an der Stelle noch ein, zwei weitere Parameter benötigt werden, so muss man das Design Grundlegend ändern. Und zwar zur einzig richtigen Schreibweise:

$import->sArticle($article_data, array("update" => false, 'destination' => 'testNode'));

Also Kinders daran denken – Wenn ihr Array Parameter einsetzt, dann bitte erweiterbare, denn nichts ist schlimmer als wenn man später wieder etwas dran hin Pfuschen muss um kompatibel zu bleiben!