BinSpeak

dev@blog

Archive for the 'general' Category

PDT on Eclipse – Short Review

November 4th, 2008 by Frobenius

Vor kurzem habe ich für die Entwicklung an einem PHP-Projekt meine Umgebung von Text-Editor (PSPad) auf Eclipse mit den PHP Development Tools (PDT) umgestellt. Als erstes Fazit folgt hier eine kleine Liste von Dingen die mir aufgefallen sind.

  • Gleich zu Beginn viel mir eins der größten Manko’s auf: man kann keine Dateien mit Eclipse aus dem Explorer öffnen. Weder mit einem Doppelklick (natürlich nachdem ich das Standardprogramm auf Eclipse gestellt habe), noch “öffnen mit..” oder “senden an…” funktioniert. Ich habe auch mit Googles Hilfe bisher keine Lösung dafür gefunden, falls jemand eine (einfache) hat, immer her damit.
    Dieses Problem führt dazu, das man nur vernünftig mit Eclipse arbeiten kann, wenn man ein Projekt anlegt, in dem alle Dateien verwaltet werden.
  • Mit Hilfe von Subclipse ist das anlegen eines Projekts durch einen Checkout aus Subversion ziemlich einfach und praktisch.
  • Eins der tollsten Features einer anständigen IDE ist natürlich die kontextsensitive Code-Vervollständigung. Das klappt auch ziemlich gut (wenn alle Dateien Teil des Projekts sind) , sowohl Methoden von Klassen (inkl. Oberklassen) als auch die Anzeige von Funktions-Parametern erleichtern das arbeiten enorm. die Vervollständigung von Funktionsnamen mit STRG+Leer finde ich etwas unhandlich, da ist z.B. PSPad besser, da kann man mit dem Mausrad arbeiten.
    Das ganze funktioniert natürlich nur gut, wenn der Code anständig mit PHPDoc-Code dokumentiert wurde, weil Eclipse aus diesen Angaben Parameter- und Rückgabetypen zieht. Die fehlende Typsicherheit in PHP ist an der Stelle natürlich (wie immer) ein Problem.
  • Super ist es, mit F3 direkt zur Definition der am Maus-Cursor geschriebenen Funktion zu springen.
  • Etwas Schade finde ich es, das man mit F1 nicht eine Hilfe für die aktuelle Funktion bekommt.
  • Die Refactoring-Punkte (z.B. Rename) funktionieren bei mir leider nicht.
  • Die Suche fand ich in Eclipse noch nie gut gelungen, irgendwie sucht man immer erstmal falsch. Wenn ich nach einem Text in mehreren Dateien suche, bekomme ich nur eine Liste der Dateien, nicht der einzelnen Fundstellen. Da ist PSPad auch besser, der zeigt mir alle Zeilen an, die den Text enthalten.
  • Navigator, Outline der aktuellen Datei und auch die anderen Sidebars sind recht gut zu bedienen, und man will sie schnell nicht mehr hergeben.
  • Wie in Eclipse üblich, ist es immer etwas kompliziert, alles so einzustellen wie man es will (Formatierung, Coding Style etc), aber man findet irgendwann (fast) jede Option die man braucht.

Alles in allem werde ich wohl in Zukunft mit Eclipse arbeiten, wenn ich ein PHP-Projekt umzusetzen habe. Nur wenn schnell mal in eine einzelne Datei schauen will, und nicht gleich ein Projekt anlegen, ist es ziemlich schlecht, das man das per Drag & Drop machen muss. Mittlerweile ist jedenfalls PSPad bei mir wieder Standardprogramm für PHP-Files.
Demnächst werde ich das einrichten eines Debuggers testen und auch die Subclipse-Funktionen muß ich noch genauer testen. Darüber  also bald mehr.

Category: general | No Comments »

Elemente eines Arrays löschen

November 4th, 2008 by Frobenius

Gerade hatte ich mal wieder ein kleines Problem bei dem Versuch mehrere Elemente in einer Iteration aus einem Array zu löschen. Den Fehler hab ich schon öfters gemacht und doch denke ich im ersten Moment nie daran. Folgendes (vereinfacht) habe ich gemacht (hier in PHP):

    $a = array(2,2,1);
    $cnt = count($a);
    for($i = 0; $i < cnt; $i++) {
        if($a[$i] == 2) {
            array_splice($a, $i, 1);
        }
    }
    var_dump($a);
 
/*  Ausgabe:
array(2) {
   [0] =>
   int(2)
   [1] =>
   int(1)
}
*/

Der Versuch alle Elemente, die 2 sind zu löschen ging schief, weil man das Array selbst während der Iteration geändert hat. Nachdem man den ersten Eintrag gelöscht hat, steht $i auf 1, an Index-Position 1 des Array ist jetzt aber nicht die zweite 2, sondern die 1, weil ja das Array nur noch zwei Elemente hat. Die Lösung für das Problem ist ganz einfach (auch ohne foreach). Man geht einfach rückwärts durch das Array:

    $a = array(2, 2, 1);
    for($i = count($a)-1; $i >= 0; $i--) {
        if($a[$i] == 2) {
             array_splice($a, $i, 1);
        }
    }

    var_dump($a);
/* Ausgabe:
array(1) {
  [0] =>
  int(1)
}
*/

Diesmal geht alles gut, weil wir nach dem löschen eines Elements nur Indizies betrachten, die vor dem gelöschten liegen, und damit nicht von dessen Löschung beinflusst werden.

Als zweite Variante bietet sich an, in der ersten Schleife anstatt array_splice die Funktion unset zu verwenden, die löscht nämlich den Wert im Array, passt aber die Indizes nicht an. Das ist imho ein ziemlich bescheuertes Verhalten, aber in diesem Fall nützlich. Nach dem löschen muß man dann allerdings aufpassen, weil es gibt kein $a[0] Element mehr, sondern nur noch ein $a[2] Element.

Category: general | 152 Comments »

eval ist böse

Oktober 31st, 2008 by admin

Heute habe ich mal wieder einen eval-Ausdruck in dem PHP-Code an dem ich gerade arbeite gefunden, der in etwa folgendermaßen aussah (stark vereinfacht dargestellt):

<?
    function calc($a, $b, $sign) {
        eval ('$z = $a ' . $sign . ' $b;');
        return $z;
    }

    $x    = 5;
    $y    = 3;
    echo calc($x, $y, '+') . "\n";
    echo calc($x, $y, '-');

    // Output:
    // 8
    // 2
?>

Das Ziel der Funktion ist klar, man will abhängig von einem Vorzeichen entweder addieren oder subtrahieren. Nun ist eval ja böse, ist hier aber auch gar nicht nötig, weil man das ganze auch mit einem intlösen kann, der 1 oder -1 ist.

<?
    function calc($a, $b, $sign) {
        return $a + $sign * $b;
    }

    $x    = 5;
    $y    = 3;
    echo calc($x, $y, 1) . "\n";
    echo calc($x, $y, -1);

    // Output:
    // 8
    // 2
?>

Ab und zu hatte ich schon einen bool-Wert der festlegte, wie zu rechnen ist, auch den kann man direkt an die Funktion übergeben, das ganze sieht dann so aus:

<?
    function calc($a, $b, $sign) {
        return $a + ((2*$sign)-1) * $b;
    }

    $x    = 5;
    $y    = 3;
    echo calc($x, $y, true) . "\n";
    echo calc($x, $y, false);

    // Output:
    // 8
    // 2
?>

Hier macht man sich zunutze, das true bei Berechnungen zu 1 ausgewertet wird. 2*$sign-1 ergibt dann eben 1 wenn $sign=true (also 1) ist, und es ergibt -1 wenn $sign=false (also 0) ist. So man kann die Variable Sign in einem Bit (z.B. in einer Datenbank) speichern.

Category: hint | 217 Comments »

Eclipse Projekt in PHP Projekt umwandeln

Oktober 28th, 2008 by admin

Heute habe ich zum ersten mal ein neues Eclipse-Projekt mit Hilfe der Checkout-Funktion von Subclipse erstellt. Das hat auch alles wunderbar geklappt, allerdings hat Eclipse nicht automatisch ein PDT/PHP-Projekt erstellt, was dazu geführt hat, das er die einzelnen PHP-Files des Projekts nicht geparst, und somit auch keine Code-Vervollständigung angeboten hat. Da man den Typ des Projekts anscheinend nicht in Eclipse einstellen kann, musste ich direkt in der .project-Datei Änderungen vornehmen.Die beiden Blöcke BuildSpec und Natures müssen so angepasst werden, das folgendes Schema entsteht:

<projectDescription>
  <buildSpec>
    <buildCommand>
      <name>org.eclipse.php.core.PhpIncrementalProjectBuilder</name>
      <arguments>
      </arguments>
    </buildCommand>
    <buildCommand>
      <name>org.eclipse.wst.validation.validationbuilder</name>
      <arguments>
      </arguments>
    </buildCommand>
  </buildSpec>
  <natures>
    <nature>org.eclipse.php.core.PHPNature</nature>
  </natures>
</projectDescription>

Nach einem Neustart war das Projekt ein PHP Projekt (zu erkennen an dem kleinen P im Icon)
und Eclipse hat sofort alle Files geparst und mir alle Klassen und Funktionen angezeigt.

Category: hint | 1,772 Comments »