Beiträge mit dem Stichwort ‘PHP’

PHP: Algorithmus-Wettbewerb: Spielplan errechnen

Veröffentlicht am 10. Juli 2010 um 07:37 by Fabian Martin Permalink

Vor etwa 2 Wochen hat der PHP Gangsta zu einem neuen Wettbewerb aufgerufen. Es sollen Spielpläne nach einem bestimmten Schema errechnet werden.

Folgende Regeln sind zu beachten:

  • Die Anzahl der Spieler muss gerade sein
  • Es gibt X/2 Bretter und Runden (bei 20 Spielern gibt es 10 Bretter die an 10 Runden bespielt werden)
  • Jede Spielpaarung darf nur einmal vorkommen
  • Jeder Spieler darf nur einmal in einer Runde und an einem Brett spielen (ähnlich Sodoku)

Wenn ihr euch den kompletten Beitrag anseht, findet ihr meine Lösung. Die Berechnung dauert zwischen 3 und 300 Sekunden, und hängt davon ab, wie gut der Zufall mitspielt. Wer das ganze gleich mal testen möchte, kann eines der Ausgabeskripte nehmen, die ihr unter dem Algorithmus findet.

Schaut euch den Code einmal an, vielleicht bekommt ihr ja Ideen für einen eigenen Algorithmus. Noch habt ihr Gelegenheit daran teilzunehmen, denn der PHP Gangsta hat seine Lösung noch nicht veröffentlicht.

weiterlesen »

PHP + PDT: Probleme bei der Installation des Zend Debuggers

Veröffentlicht am 18. Juni 2010 um 23:44 by Fabian Martin Permalink

Wer derzeit versucht den Zend Debugger über die Update Seite zu installieren, wird das Problem bereits bemerkt haben. Es funktioniert nicht.

Scheinbar haben sich vor einiger Zeit die Dateinamen/Versionen geändert, aber es wurde versäumt die Update Seite zu kontrollieren. Während der Installation versucht Eclipse Dateien herunterzuladen die es auf dem Server nicht (mehr) gibt.

Was kann man also machen?
Die Lösung des Problems ist eigentlich recht einfach. Das einzige was wir hierzu benötigen ist ein Apache Server mit aktiven mod_rewrite, ein Packprogramm und ein Texteditor.

Speichert die content.jar der Update Seite auf eurem PC und entpackt den Inhalt in einen Ordner eurer Wahl. Es sollte jeder handelsübliche Packer, der das ZIP Format versteht, möglich sein.
In dem Zielordner sollte sich jetzt eine content.xml befinden. Öffnet diese mit einem Textprogramm und ersetzt alle Vorkommnisse von 20091116 durch 20091124. Packt die content.xml nun wieder in eine ZIP Datei und nennt diese content.jar.

Erstellt eine .htaccess und fügt folgenden Inhalt ein:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.* http://downloads.zend.com/pdt/$0 [L]

Ihr habt jetzt eine .htaccess die jede Anfrage an eine nicht existierende Datei an die offizielle Update Seite weiterreicht.
Legt beide Dateien nun in ein Verzeichnis unterhalb eures Apache Web Roots und tragt die URL als Update Seite bei eclipse ein.

Ihr könnt nun ohne größere Schwierigkeiten den Zend Debugger installieren. Wer keine Lust hat die Änderungen selbst durchzuführen, oder den Text durchzulesen, der kann sich die geänderten Dateien auch herunterladen, oder er trägt http://a2.localdev.de/zend/ als Update Seite ein.

Downloads:

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)
 * }
 */

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.