usort

usort war mir zwar bisher schon bekannt, wirklich benutzt habe ich es aber nicht – was ich jetzt rückblickend bereue. Kurz gefasst ist usort die Waffe der Wahl, wenn man Arrays sortieren möchte die entweder heftig verschachtelt sind oder für die es keine trivialen Sortierkriterien gibt (wie etwa größer / kleiner). Für beides kommen später Beispiele. Bisher kam ich zwar auch ohne usort um die Runden, habe aber ersatzweise dann ziemlich aufwändige Ersatzkonstruktionen bauen müssen, für die usort die eindeutig bessere Wahl gewesen wäre.

Ein Beispiel

Man nehme folgendes Array:

$data = array(
"P1915" => array("name" => "Manfred Schmidt", 
				 "work" => array("income" => 61000, 
				 "pos" => "Abteilungsleiter")),
"P2193" => array("name" => "Wilfried Mueller", 
			     "work" => array("income" => 42300, 
				 "pos" => "Entwickler")),
"P0813" => array("name" => "Herbert Mann", 
			     "work" => array("income" => 93500, 
				 "pos" => "Chef")),
"P3913" => array("name" => "Klaus Kaiser", 
			     "work" => array("income" => 42700, 
				 "pos" => "Entwickler")),
"P2881" => array("name" => "Juergen Koenig", 
			     "work" => array("income" => 43300, 
				 "pos" => "Marketing")));

Dabei haben wir eine Zuordnung der Personalnummer zu einem Unterarray, welches den Name beinhaltet und weitere Verzweigung auf ein „work“-Unterarray mit Position und Gehalt hat.… Den ganzen Post lesen

Veröffentlicht unter php, webdev | Hinterlasse einen Kommentar

Reflection – Teil 4: ReflectionProperty

Vorangegangene Teile:

Nun sind also die Properties dran, womit dann der vierteilige Reflection-Ausflug auch schon beendet ist. Wie bekannt beginnen wir wieder mit einem Mustercode

class D
{
	/**
	 * this is a property
	 */
	public $prop = array("a","b","c");
}

Property erhalten

Der Weg um an das ReflectionProperty – Objekt zu kommen führt uns über das ReflectionClass – Objekt der Klasse.

$refclass = new ReflectionClass("D");
$refprop = $refclass->getProperty("prop");

DocBlock – Kommentar

print_r($refprop->getDocComment());
/**
 * this is a property
 */

Property-Name

print $refprop->getName(); 
//prop

Property-Value

Hierbei erwartet getValue eine Instanz der Klasse als Parameter.… Den ganzen Post lesen

Veröffentlicht unter php, webdev | 7 Kommentare

Reflection – Teil 3: ReflectionParameter

Vorangegangene Teile:

Wie im letzten Teil 2 über die ReflectionMethod und die ReflectionFunction angedroht soll es nun um die Parameter gehen, die man ebenfalls reflecten kann. Ob es sich dabei um die Parameter einer Funktion oder um die Parameter einer Methode handelt, spielt keine Rolle. Wie in allen anderen Teilen muss mal wieder ein Beispielcode herhalten:

class C
{
	public function fct($a,$b,array $c = array(1,2,3))
	{}
}

Default-Wert des Parameters

Erstmal müssen wir uns ein ReflectionParameter – Objekt ergattern. Das geht im – hier geschilderten – umständlichsten Fall von der Klasse über die Methode zu den Parametern.… Den ganzen Post lesen

Veröffentlicht unter php, webdev | 3 Kommentare

Reflection – Teil 2: ReflectionMethod und ReflectionFunction

Hier nun also der zweite Teil, nachdem im letzten die ReflectionClass behandelt wurde. Doch nicht nur Klassen und Objekte kann man reflektieren, sondern auch Methoden und Funktionen . Das soll nun hier das Thema sein.

Beispielcode

Wie im letzten Beispiel muss folgender Code für alle weiteren Zwecke herhalten:

class Calculator
{
	/**
	 * This method adds the first two parameters or multiplies
	 * them depending on the value of the third param
	 */
	public function AddOrMultiply($a, $b, $c = true)
	{
		static $someUselessVar = "123";
		return $c ? $a+$b : $a*$b;
	}
	
	private function IamPrivate()
	{}
}

Generelle Informationen

Um erstmal an ein ReflectionMethod – Objekt zu kommen, um dieses dann abfragen zu können müssen wir den Weg über das ReflectionClass – Objekt der beinhaltenden Klasse gehen.… Den ganzen Post lesen

Veröffentlicht unter php, webdev | 4 Kommentare

Reflection – Teil 1: ReflectionClass

Was ist Reflection

Eines der coolsten Features in PHP, was leider so gut wie ohne Dokumentation dasteht. Reflection ist eine Möglichkeit, Meta Informationen über so ziemlich alles in PHP herauszubekommen. Welche Interfaces implementiert eine Klasse? Welche Methoden hat sie? Wieviele Parameter hat eine Funktion / Methode, davon wieviele optionale? Was ist der Default-Wert eines Parameters? Dies und einiges mehr ist wohl nur mit der Reflection herauszubekommen.

Arten der Reflection

Oben habe ich mit meinen Fragen bereits die Grundbereiche der Reflection erschlagen. Was ist nun wie reflektierbar?

  • ReflectionClass – Liefert Infos über Klassen
  • ReflectionObject – Im Prinzip wie die ReflectionClass, nur das der Angriffspunkt nicht die ganze Klasse, sondern eine Instanz dieser ist.
Den ganzen Post lesen
Veröffentlicht unter php, webdev | 3 Kommentare

Datenbank-Klasse (auf PDO basierend)

Es ist wohl eine der am häufigsten neu geschriebenen Klassen. Jedem Entwickler seinen Datenbank-Wrapper. PDO macht die Sache eigentlich schon sehr angenehm, trotz allem vermisst man hier und da ein paar Komfort-Features. Habe neulich meine Datenbank-Klasse auf Github hochgejagt.

Features

  • Kommt komplett mit Unit-Tests daher
  • Komfortables Handling mit Prepared Statements
  • Möglichkeit, das PDO DB-Handle aus der Datenbank herauszubekommen – volle Flexibilität
  • Unterstützt mehrere Datenbank-Verbindungen gleichzeitig
  • Komplett sauberes exceptionbasiertes Fehlerverhalten
  • Komfortfeatures (siehe unten)
  • Komplette Dokumentation

Einen Einblick in die Klasse erhaltet ihr in diesem kleinen howto auf github.… Den ganzen Post lesen

Veröffentlicht unter php, Datenbanken, webdev | 1 Kommentar

MySQL Views

Views sollten eigentlich jedem Webdeveloper bekannt sein, deswegen versteht sich der Post hier eher als kleiner „Reminder“. Legen wir doch direkt mit einem Beispiel los. Ich habe eine Tabelle pizzas:

Und eine Tabelle ingredients:

Klassische 1:n-Beziehung also. Ich habe eine wunderbare, normalisierte Datenhaltung (okay, man könnte auch den Zutaten noch eine Zutaten-ID geben aber das verkompliziert das Beispiel unnötig). Wenn ich jetzt allerdings häufig den Bezug der Pizza zu den Zutaten brauche, schreibe ich in vielen Funktionen joins von ingredients auf pizzas. Das geht schlauer! – mit Views.

CREATE VIEW pizzaingredients AS
	SELECT p.*, i.ingredient
	FROM pizzas p
	LEFT JOIN ingredients i ON i.pizzaid
Den ganzen Post lesen
Veröffentlicht unter Datenbanken, webdev | 1 Kommentar

YODA Conditions

Yoda dreht bekanntlich gern Satzbestandteile um. Das hat jetzt noch nichts direkt mit PHP zu tun. Zäumen wir das Pferd mal andersherum auf. Was fällt hier auf?

function doSomething()
{
    return false;
}

$res = doSomething();

if ($res = false)
{
    echo "1";
}
else
{
    echo "2";
}

Der geübte Debugger sieht sofort: Im if haben wir eine Zuweisung und keinen Vergleich. PHP findet das voll okay, IDEs geben in der Regel einen Warnhinweis. Raus kommt im Übrigen 2.

Was wäre jetzt, wenn wir frei nach Yoda geschrieben hätten:

if (false = $res)
{
    echo "1";
}
else
{
    echo "2";
}

Parse error: syntax error, unexpected ‚=‘.… Den ganzen Post lesen

Veröffentlicht unter php, Quicktips, webdev | 1 Kommentar

PHP WTF #2

Und weiter gehts mit den Kuriositäten (Teil 1).

$ar = array(1,2,3);
foreach ($ar as &$a) echo $a;
foreach ($ar as $a) echo $a;

Wenn 123123 rauskommen würde, wärs langweilig oder? Kommts auch nicht. 123122 lautet das Ergebnis.

Da ich unmöglich schöner erklären, was da intern vor sich geht als Herr Schlüter, sei an dieser Stelle elegant zu ihm übergeleitet.… Den ganzen Post lesen

Veröffentlicht unter php, PHP-WTF, webdev | 1 Kommentar

PHP WTF #1

Ohne viel Worte: was kommt bei dem Code raus?

class çåèäßäöü
{
	public static function weird()
	{
		function stuff()
		{
			return 123;
		}
	}
}

echo çåèäßäöü::wEiRd().sTuFf();
echo çåèäßäöü::weird().stuff();

Geballte „weirdness“. Wenn man jemandem so einen Schnippsel vorlegt und ihn laut nachdenken lässt (Bewerbungsgespräch), stellen sich folgende Fragen

  1. Unicode in Klassennamen? Kann das gehen?
  2. Sind Funktionsnamen case sensitive?
  3. Nested Functions?
  4. Warum sind es 2 Calls?

Und nun zu Auflösung:

  1. Das geht! Klassen, Funktionen und Variablen dürfen unicode-Zeichen beinhalten. (Richtigstellung: Wie Fabian per Kommentar angemerkt hat, ist es kein „wirklicher“ unicode, denn die verwendbaren Zeichen beschränken sich auf den regulären Ausdruck
    [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

    Natürlich ist das nicht empfehlenswert, aber prinzipiell möglich)

  2. Auch das haut hin.
Den ganzen Post lesen
Veröffentlicht unter php, PHP-WTF, webdev | 8 Kommentare