PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for Mai, 2011

Eine Rechenaufgabe lösen mit PHP

with 47 comments

Ich bastle gerade an einem kleinen Script, das aus einer Reihe Zahlen und arithmetischen Operatoren eine Rechenaufgabe erstellt und löst. Die Rechenaufgabe besteht nicht nur aus Additionen oder Subtraktionen, sondern enthält im einfachen Beispiel auch Multiplikationen, wobei dann auf die Punkt-vor-Strichrechung geachtet werden muss, was das ganze doch etwas erschwert.

Zuerst Beispielcode, damit ihr versteht was ich vorhabe:

<?php

$numbers = array(5, 19, 45, 6, 7, 21);
$operators = array('*', '+', '-', '*', '+');

// String bauen
$mathString = '';
foreach ($numbers as $id => $number) {
    if ($id < count($numbers)-1) {
        $mathString .= $number . $operators[$id];
    } else {
        $mathString .= $number;
    }
}
// $mathString ist nun '5*19+45-6*7+21'

Nun ist die Aufgabe, aus dem String $mathString das Ergebnis auszurechnen. Die einfachste und schnellste Lösung ist natürlich eval() (oder vergleichbare Funktionen wie create_function() oder assert() ). Folgender Code löst die Rechenaufgabe und gibt das Ergebnis aus:

eval('echo ' . $mathString . ';');

Wenn man nun eval() und Konsorten nicht benutzen möchte oder darf oder kann, wie lautet dann der PHP Code, um eine solche Rechenaufgabe zu lösen? Die beiden oben gezeigten Arrays sind natürlich nur Beispiele, der Algorithmus sollte auch mit anderen Zahlen funktionieren.

Folgende Dinge sind zu beachten:

  • $numbers ist ein Array aus unbekannt vielen Zahlen. Im einfachen Fall nur positive Zahlen, im etwas schwierigeren Fall auch negative
  • $operators beinhaltet so viele Operatoren wie nötig sind für die Rechnung (also  count($numbers)-1 viele). Um es nicht allzu komplex zu machen beschränken wir uns auf die Addition, Subtraktion und Multiplikation (+, – und *)
  • Es gilt die Punkt vor Strichrechung zu beachten
  • In unserem Fall hier kommen keine Klammern vor.

Wie sieht das ganze nun aus wenn auf die einfache, aber unschöne eval() Lösung verzichtet wird? eval() ist deshalb unschön weil die Zahlen und Operatoren oder gar der ganze $mathString aus Usereingaben kommen könnten, dann muss man sehr gut filtern um keine Sicherheitslücke beim Einsatz von eval() zu erstellen. Oder auf manchen Systemen ist eval() sogar verboten (disabled_functions).

Written by Michael Kliewe

Mai 30th, 2011 at 8:32 am

Posted in PHP

Tagged with , ,

create_function() genauso übel wie eval()?

with 19 comments

Heute mal eine Sonntagsfrage:

Ich überlege gerade wie ich ein Problem löse, bei dem ich wohl nur mit viel Aufwand drumherum komme, eval() zu benutzen. Auf der Suche nach einer Lösung fiel mir auch die Funktion create_function() ein, der man ähnlich wie eval() einen String übergeben kann, der dann beim Aufruf der erstellten Funktion ausgeführt wird.

Und nun meine Frage an euch: Sind die beiden Funktionen in der Gefährlichkeit gleichzusetzen wenn man beide mit einem String füllt, der zusammengesetzt wurde aus Usereingaben? Bei beiden kann böses passieren wenn man die Usereingaben nicht ordentlich filtert, sehe ich doch richtig oder? Seht ihr einen Vor- oder Nachteil von create_function() gegenüber eval()?

Ich frage weil eval() überall auf der Welt als böse angesehen wird, aber über create_function() redet niemand, und ich glaube bei unvorsichtiger Nutzung ist sie genauso gefährlich.

Written by Michael Kliewe

Mai 29th, 2011 at 12:54 pm

Posted in PHP

Tagged with , ,

Was ist phar und wie nutze ich es?

with 13 comments

Phar ist ein Applikations-Archiv-Format genauso wie Jar es für Java ist. Ein Phar-Archiv enthält Dateien und Ordnerstrukturen, und diese Dateien können dann genutzt werden ohne die Phar-Datei zu entpacken. Man kann so seine ganze Applikation oder auch Frameworks in Phar-Dateien packen und verteilen. Phar ist seit 5.2 als PECL Erweiterung verfügbar, seit 5.3 ist es fest eingebaut.

Die Tatsache dass es dann nur noch eine Datei ist hat mehrere Vorteile. Einerseits ist der Upload auf einen FTP schneller, aber auch beispielsweise der Download ist einfacher, anstatt einer zip/tar.gz Datei die danach noch entpackt werden muss lädt man einfach die Phar-Datei und kann loslegen. Viele kleine Dateien bedeuten auch viele Dateisystem-Zugriffe, und wie wir alle wissen ist die Festplatte langsam, Phar bringt also Performance. Wenn man bereits einen Byte-Code-Cache aktiviert hat ist der Performance-Vorteil nur noch gering, aber vorhanden.

Wenn ich beispielsweise in einer phar-Datei meine komplette Applikation habe, starte ich diese folgendermaßen:

php application.phar

Wenn ein Phar-File auf diese Weise gestartet wird, wird das sogenannte Stub-File aufgerufen, quasi der Einstiegspunkt. Das Stub-File ist eine normale PHP-Datei innerhalb des Phar-Archives.

Alternativ kann ich auch aus einem PHP-Script heraus ein Phar-Archiv inkludieren:

Weiterlesen »

Written by Michael Kliewe

Mai 26th, 2011 at 9:13 am

Posted in Allgemein,PHP

Tagged with

Slides vom phpDay 2011

without comments

Der 7. phpDay fand vom 12. bis zum 14. Mai, diesmal wieder in Verona, statt. Vor allem englische , aber auch drei italienische Talks wurden gehalten, hier die Liste:

12.Mai 2011

Caching on the Edge
Fabien Potencier

Testing LAMP Applications
Sebastian Bergmann

Any to any – Convert your documents!
Kore Nordmann

Building search applications with Apache Solr and PHP
Paul Borgermans

A generic PHP Application installer
Kore Nordmann

Security 202 – Are you sure your site is secure?
Arne Blankerts

Modular application architecture
Kore Nordmann

Weiterlesen »

Written by Michael Kliewe

Mai 23rd, 2011 at 8:34 am

Gewinner des Buches „Coders at Work“

with 8 comments

Hier möchte ich kurz den Gewinner der Aktion vom letzten Freitag preisgeben. Gewonnen hat das Buch Coders at Work Christian mit einer 2113 Bytes großen E-Mail, herzlichen Glückwunsch! Ich habe dich gerade angeschrieben zwecks Adresse.

Das wars auch schon für heute.

Written by Michael Kliewe

Mai 21st, 2011 at 1:19 am

Posted in PHP

Tagged with