Archiv der Kategorie: Quicktips

PHP WTF #3

Und ein neuer WTF-Teil (Teil 1, Teil 2)!

var_dump(1/3 + 4/3 == 5/3);

Ergebnis? false natürlich! Wie auch sonst, wär ja anderenfalls kein WTF. Genaugenommen hat das „Phänomen“ nichts mit PHP zu tun sondern mit Floating Point-Berechnungen und deren Präzision. Trotz allem hat mich der Spaß gerade eine Viertelstunde Debugging-Zeit gekostet, und zwar in C++. Deswegen mal kurz in PHP getestet – mit gleichem Ergebnis.

Und noch einer:

var_dump(19.99 + 19.99 == 49.98); //bool(false)

Richtigstellung: Schande über mein Haupt und danke an Enrico (siehe Kommentar). Grober Rechenfehler meinerseits. Das Ergebnis lautet natürlich nicht 49.98, sondern 39.98, was dann auch zu einem bool(true) führt.… Den ganzen Post lesen

Veröffentlicht unter php, PHP-WTF, Quicktips, webdev | 3 Kommentare

Objekte werden per Referenz übergeben – oder?

Beim Durchstöbern von Rudi’s PHP Labor bin ich auf diesen interessanten Artikel gestoßen, den ich hier gern nochmal aufwärmen möchte.

Etwas Code zum warmwerden:

<?php
function modify(StdClass $t)
{
	$t->foo = 321;
}

$instance = new StdClass;
$instance->foo = 123;
modify($instance);
print $instance->foo;

Und, was kommt raus? Richtig! 321! Schließlich wird eine Referenz des Objekts übergeben. Wenn ich nun aber in der modify-Funktion die Variable, überschreibe…

<?php
function modify(StdClass $t)
{
	$t = new StdClass;
	$t->foo = 321;
}

$instance = new StdClass;
$instance->foo = 123;
modify($instance);
print $instance->foo;

… lautet das Ergebnis auf einmal 123! Also doch nicht ganz so referenzig.… Den ganzen Post lesen

Veröffentlicht unter php, Quicktips, webdev | Hinterlasse einen Kommentar

Niemand soll wissen, dass die Webseite mit PHP läuft!

Kleines Easteregg: Einfach mal an eine beliebige URL

?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
anhängen, bei mir sieht das so aus.

Toll, oder? Weiterhin verraten die Response-Headers ungeniert, was los ist:

Wenn in der php.ini nun die Einstellung expose_php = Off getätigt wird, klappt weder das „Easteregg“ mit dem PHP-Bild, noch kriegt man über die Response-Header die PHP-Version mitgeteilt:

Wenn man nun noch die .php Extension „weg-modrewrite-d“, müsst ihr euch nicht mehr schämen, dass ihr PHP verwendet. Außer natürlich, display_errors ist an und offenbart all eure Programmierfehler ;).… Den ganzen Post lesen

Veröffentlicht unter php, Quicktips, webdev | 3 Kommentare

PHP-Includes visualisieren mit Inclued

Ich bin ja ein großer Freund von statischer Codeanalyse und optischer Aufbereitung (siehe auch Codevisualisierung mit pfff: PHP Frontend For Fun). Nun bin ich auf was neues aufmerksam geworden: Inclued. Mittels dieses coolen Tools lassen sich Includes zwischen Dateien einer Webanwendung visualisieren – sowas kann durchaus nützlich sein, wenn man sich in eine Anwendung reinschaffen möchte oder einen Überblick erhalten will.

Installationsanleitung

Ich gehe hier von Ubuntu aus, sollte aber mit kleinen Abwandlungen auch mit anderen Distributionen gut gehen.

  1. Wir brauchen phpize, um inclued zu installieren. Das ist im php-dev Paket enthalten.
    sudo apt-get install php5-dev
  2. Nun wird inclued selbst über pecl installiert:
    sudo pecl install inclued-alpha
  3. Zur php.ini
Den ganzen Post lesen
Veröffentlicht unter php, Quicktips, webdev | 2 Kommentare

PHP-Errors zu Exceptions konvertieren

Wie wir ja alle wissen, ist der @-Fehlerunterdrückungs-Operator gemeinhin böse. Was aber nun, wenn wir mit PHP-eigenen Funktionen arbeiten müssen, die im Fehlerfall eine Warning produzieren?
Was ich meine ist z.B. file_get_contents. Wenn die aufzurufende URL nicht erreichbar ist, heißt es

Warning: file_get_contents() [function.file-get-contents]: php_network_getaddresses: getaddrinfo failed: Der angegebene Host ist unbekannt

Unschön. Glücklicherweise kann man mittels eines eigenen Errorhandlers einen Workaround basteln, indem der Fehler zu einer Exception konvertiert wird:

function errorhandler($code, $error, $file, $line)
{
	throw new ErrorException($error, $code, 0, $file, $line);
}

set_error_handler("errorhandler");

try
{
	echo file_get_contents("http://www.this-is-not-a-real-url.org");
}
catch (ErrorException $ex)
{
	echo "Die Webseite ist gerade nicht erreichbar";
}

Im Produktivbetrieb sollten die Fehler bekanntlich ohnehin nur geloggt und nicht angezeigt werden, trotz allem fühle ich mich wohler mit solch einer Lösung.… Den ganzen Post lesen

Veröffentlicht unter php, Quicktips, webdev | Hinterlasse einen Kommentar

Codevisualisierung mit pfff: PHP Frontend For Fun

Das von facebook stammende Tool soll vor allem eine Hilfe zur Codevisualisierung und beim Refactoring sein. Kennt ihr diese anschaulichen Grafiken, die euren Festplatteninhalt visualisieren und auf vermeintliche Platzfresser aufmerksam machen (sowas in der Art)? Das macht pfff – nur eben auf Sourcecode zugeschnitten.

Was sagt facebook selbst dazu?

pfff is a set of tools and APIs to perform some static analysis, dynamic analysis, code visualizations, code navigations, or style-preserving source-to-source transformations such as refactorings on source code.

Finde ich – ohne es bis jetzt produktiv eingesetzt zu haben – zumindest mal eine nette Spielerei (…was ja auch der Namensbeisatz for Fun andeutet).… Den ganzen Post lesen

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

Die Wahrheit über den Doctype

Mit dem neuen, ultracoolen und leicht zu merkenden HTML 5-Doctype

<!DOCTYPE html>

kamen viele Bedenken auf. Ist meine Webseite dann überhaupt noch standardkonform? Falle ich nicht dem Quirks-Mode der Browser zum Opfer? Nichts davon ist der Fall. Der Doctype ist generell extrem überschätzt! Kein Browser wird sich wirklich darum kümmern, was für ein Doctype angegeben ist.

Was in Wirklichkeit passiert

Es wird (einheitlich bei allen Browsern) danach geschaut, ob überhaupt ein Doctype angegeben wurde. Ist das nicht der Fall, gehts direkt in den Quirksmode. Wird nun ein Doctype gefunden, gibt es nur noch eine „Chance“, doch noch in den Quirksmode zu geladen: Es wird ein Uralt-Doctype wie

<!DOCTYPE
Den ganzen Post lesen

Veröffentlicht unter Quicktips, webdev | 2 Kommentare

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

Quicktip: Integer Validation

Oft ist es ja so, dass man einen Integer validieren möchte, der allerdings als String vorliegt (bei SOAP z.B.). Das heißt, dass uns is_int nicht weiterhilft, wie folgender Schnippsel zeigt:

var_dump(is_int("12")); //false

Klar, ist kein int – kann man PHP keinen Strick draus drehen. Alternative ist is_numeric.

var_dump(is_numeric("12")); //true

Ah, wunderbar – warum auch immer jetzt auf einmal Strings kein Problem mehr darstellen. Aber:

var_dump(is_numeric("12.123456")); //true

Klar irgendwie, „numeric“ heißt nicht zwangsläufig gerade. Deswegen (meines Erachtens nach der beste Weg): intval

intval konvertiert (sofern möglich, also wenn etwa ein int in einem String vorliegt) zu Integer, allerdings kommt bei allen anderen Inputs (bspw.… Den ganzen Post lesen

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

Web-Performance: Best Practices

Was folgt ist eine Mischung aus der sehr guten (!) Artikelserie „Make the web faster“ von google und einigen persönlichen Ergänzungen und Erfahrungen. Erhebt keinerlei Anspruch auf Vollständigkeit und mischt server- sowie clientseitige Tipps querbeet. Ich gehe hier nicht besonders ins Detail, nenne aber genug Stichwörter, zu denen man sich dann schlaugooglen kann. Als Abschluss der Einleitung möchte ich noch auf den Gott der Webperformance verweisen, ohne dessen Bücher und Analysen wir sicher noch nicht da wären wo wir heute sind.

  1. Javascript so weit wie es geht asynchron laden bzw. ans Seitenende befördern, da Browser JS-Dateien in der Regel nicht parallel laden.
Den ganzen Post lesen
Veröffentlicht unter php, Javascript, Datenbanken, Performance, Security, Quicktips, webdev | 1 Kommentar