PHP Hacks zu Halloween

Erschreckende PHP-Hacks präsentiert man am besten zu Halloween, zwei dieser ziemlich grauslichen Exemplare seien hier beschrieben

E_STRICT und PHP7

Mit PHP7 wurden Errors mit Errorlevel E_STRICT neu klassifiziert, d.h. E_ALL & ~E_STRICT bewirkt keine Änderung im Errorreporting mehr, was die Codequalität angeht ansich eine gute Änderung, ältere Projekte auf PHP7 lauffähig zu bekommen wird damit aber schwierig, wenn man das Errorreporting nicht ganz stillegen will.

Oft wurde z.B. nicht darauf geachtet Methoden in abgeleiteten Klassen kompatibel zur ursprünglichen Klasse zu halten, jetzt mag man die Sinnhaftigkeit natürlich in Frage stellen, ob dies überhaupt zu einem Error führen sollte, aber da PHP kein Overloading unterstützt, macht dies schon Sinn.

Hier der grausliche Hack dazu:

set_error_handler(function ($errno, $errstr, $errfile = null, $errline = null, $errcontext = []) {
return preg_match('/ Declaration of .+should be compatible with/', $errstr);
}, E_WARNING );


Objektkonvertierung

Nehmen wir an, wir implementieren ein Plugin in ein Fremdsystem, wir bekommen über das Pluginsystem ein Objekt an eine bestimmte Funktion übergeben. Wir haben die dazugehörende Klasse abgeleitet, jedoch gibt es keine Möglichkeit dem System mitzuteilen, dass wir gerne ein Objekt unserer abgeleiteten Klasse übergeben bekommen.

Hier der ziemlich grausliche Hack dazu:

class Human {
        public $alive = true;
        public function whoami()
        {
                print $this->me();
        }

        private function me()
        {
                return "human\n";
        }
}

class Alien {
        public $alive = false;
        public function whoami()
        {
                print $this->me();
        }

        private function me()
        {
                return "alien\n";
        }
}

$human = new Human;
$human->whoami();

$alien = alien($human);

function alien($old)
{
        $x = serialize($old);
        $x = preg_replace('/O:5:"Human"/', 'O:5:"Alien"', $x);
        return unserialize($x);
}

$alien->whoami();
printf("%d\n", (int) $alien->alive);
Zurück zur Übersicht