PHP + PDT: Probleme mit Autocomplete unter Eclipse Helios und PDT 2.2

Veröffentlicht am 10. Juni 2010 um 13:26 by Fabian Martin Permalink

Wer derzeit das neue PDT Paket testet, wird vielleicht unter dem gleichen Problem leiden. Autocomplete will nicht richtig funktionieren. Ich drücke STRG+Leertaste und kriege nur eine leere Liste.

Sascha hat in seinem Software-Entwickler Blog eine Lösung veröffentlicht, mit der man das Problem beheben kann. Wie jedoch dem verlinkten Beitrag im Zend Forum zu entnehmen ist, klappt das nicht bei jedem.

Links:

String, Float, Int und Object in Array casten

Veröffentlicht am 17. Mai 2010 um 23:00 by Fabian Martin Permalink

Schon gewusst das man, in PHP, Variablen ganz einfach in ein Array wandeln kann?

String, Float, Integer
Der Wert wird zur ersten Position im Array

$strTest = "Test";
$arrTest = (array)$strTest;
var_dump($arrTest);

/**
 * array(1) {
 *  [0]=>
 *  string(4) "Test"
 * }
 */

$intTest = 123;
$arrTest = (array)$intTest;
var_dump($arrTest);

/**
 * array(1) {
 *  [0]=>
 *  int(123)
 * }
 */

$fltTest = 1.23;
$arrTest = (array)$fltTest;
var_dump($arrTest);

/**
 * array(1) {
 *  [0]=>
 *  float(1.23)
 * }
 */

Objekte
Die Eigenschaften des Objekts finden sich im Array als Werte wieder. Je nach Sichtbarkeit, hat der Schlüssel einen Prefix, oder auch nicht.

class TestClass
{
	public $intPublicVar = 1;

	protected $intPortectedVar = 2;

	private $intPrivateVar = 3;
}

$objTest = new TestClass();
$arrTest = (array)$objTest;
var_dump($arrTest);

/**
 * array(3) {
 *  ["intPublicVar"]=>
 *  int(1)
 *  ["*intPortectedVar"]=>
 *  int(2)
 *  ["TestClassintPrivateVar"]=>
 *  int(3)
 * }
 */

Python: Verzeichnis rekursiv leeren

Veröffentlicht am 3. Mai 2010 um 22:56 by Fabian Martin Permalink

Mit dem folgenden Code Schnipsel kann man in Python ein Verzeichnis rekursiv leeren. Abhängig davon ob es sich um eine Datei, ein Verzeichnis oder eine Verknüpfung handelt, wird die entsprechende Methode zum entfernen aufgerufen.

for pathentry in os.walk('/path/to/dir', False):
	for dir in pathentry[1]:
		path = os.path.join(pathentry[0], dir)
		if os.path.islink(path):
			os.unlink(path)
		else:
			os.rmdir(path)

	for file in pathentry[2]:
		path = os.path.join(pathentry[0], file)
		os.unlink(path)

Möchte man das Hauptverzeichnis anschließend auch noch löschen, reicht ein simples

os.rmdir('/path/to/dir');

Arbeiten nach dem Scotty Prinzip

Veröffentlicht am 30. April 2010 um 21:24 by Fabian Martin Permalink

Bei der Arbeit eines Softwareentwicklers ist nichts wichtiger wie das Einhalten der Termine. Schafft er das nicht, wird der Kunde schnell säuerlich.

Wie ermittelt man aber Termine die man einhalten kann? Ich nutze dafür gern das Scotty Prinzip, benannt nach seinem Erfinder Montgomery Scott von der USS Enterprise (ja, Star Trek).

Man schätzt hierzu die Zeit ab die man wirklich braucht. Je länger man als Softwareentwickler arbeitet, desto besser wird man. Auf diese Zeit legt man nochmal 25% bis 50% drauf. Die daraus resultierende Zeit kommuniziert man gegenüber dem Kunden. Ist die genannte Zeit zu lang, kann man die Zeitspanne reduzieren bis alle zufrieden sind. Aber immer darauf achten das man die wirklich benötigte Zeit nicht unterbietet.

Im Idealfall seit ihr vor dem genannten Endzeitpunkt fertig und könnt dem Kunden das Ergebnis übergeben. Wenn ihr es an diesem Punkt geschickt macht, vermittelt ihr dem Kunden das Gefühl besonders wichtig zu sein, und ihr euch wegen ihm besonders angestrengt habt.

PHP: Welche Interfaces implementiert eine Klasse

Veröffentlicht am 11. April 2010 um 23:22 by Fabian Martin Permalink

Auf Phpmonkeys ist letzte Woche ein Artikel über Marker Interfaces erschienen, der einem kurz die Idee dahinter erläutert und wie man sie am Beispiel eines Caches nutzen kann.

Ich selber nutze Marker Interfaces in verschiedenen Projekten um darüber zu bestimmen, ob ein bestimmtes Feature für ein Objekt zur Verfügung steht. Ich vereinfache damit u.a. die Generierung des Administrations Oberfläche. Aber wie bekommt man heraus, welche Interfaces eine Klasse implementiert?

Wir haben die Möglichkeit über instanceof und is_a zu prüfen ob eine bestimmtes Interface implementiert wird, oder wir lassen uns von den Reflection Klassen, die seit PHP 5.0 zur Verfügung stehen, alle implementierten Interfaces zurückgeben.

Unsere Testobjekte

interface AdminFeature
{

}

class Admin implements AdminFeature
{

}

$objAdmin = new Admin();

Instanz der Reflection Klasse erzeugen

$objReflection = new ReflectionClass('Admin');

// Oder direkt vom Objekt
// $objReflection = new ReflectionClass($objAdmin);

Die Reflection Klasse enthält die Methoden getInterfaceNames und getInterfaces, die uns alle genutzten Interfaces zurückgeben. Möchten wir auf ein bestimmtes Interface prüfen, stehen uns die Methode implementsInterface bzw. die Prüfung mittels instanceof und is_a zur Verfügung.

getInterfaceNames
getInterfaceNames gibt uns ein Array mit den Namen der Interfaces zurück.

$arrResult = $objReflection->getInterfaceNames();

/*
array(1) {
  [0]=>
  string(12) "AdminFeature"
}
*/

getInterfaces
getInterfaces gibt uns ein Array mit allen Interfaces zurück. Die Elemente des Arrays enthalten für jedes Interface ein Objekt der Relection Klasse.

$arrResult = $objReflection->getInterfaces();

/*
array(1) {
  ["AdminFeature"]=>
  &object(ReflectionClass)#3 (1) {
    ["name"]=>
    string(12) "AdminFeature"
  }
}
*/

implementsInterface, instanceof und is_a
Haben wir ein Objekt der Klasse erzeugt, können wir instanceof und is_a nutzen um herauszufinden, ob die gewünschte Klasse implementiert wird. Der Weg über die Reflection Klasse ist hier nicht nötig.

Möchten wir vor der Erzeugung des Objekts herausfinden, ob ein Interface implementiert wird, können wir die Methode implementsInterface unseres Reflection Objekts nutzen.

$boolReturn = $objReflection->implementsInterface('AdminFeature');
// bool(true)
$boolReturn = $objAdmin instanceof AdminInterface;
// bool(true)
$boolReturn = is_a($objAdmin, 'AdminInterface');
// bool(true)

is_a ist seit PHP 5.3 übrigens nicht mehr als deprecated markiert.

Über Reflection kann man aber mehr als nur die Interfaces ermitteln. Wer möchte kann sich z.B. die Kommentare zurückgeben lassen und über diese z.B Annotations implementieren. Ein Blick ins PHP Handbuch lohnt sich.