Sie sind hier : sebastian1012.bplaced.net/ homepage-neu / Themen-Blog1 / php-typehinting-schon-heute.php

PHP Typehinting schon heute

Ein Traum!

function exampleString(string $string) {
    echo "'$string' is a string!\n";
}

function exampleInt(int $int) {
    echo "$int is an int!\n";
}

function exampleFloat(float $float) {
    echo "$float is a float!\n";
}

function exampleBool(bool $bool) {
    var_export($bool);
    echo " is a bool!\n";
}

exampleString("Hello World!"); //'Hello World!' is a string!
exampleInt(1); //1 is an int!
exampleFloat(1.2); //1.2 is a float!
exampleBool(false); //false is a bool!

exampleBool("not really bool");
/*
Catchable fatal error: Argument 1 passed to exampleBool() must be an instance of Bool, string given, called in D:\xampp\htdocs\typehint\example.php on line 23 and defined in D:\xampp\htdocs\typehint\example.php on line 13
*/

Und das alles gibts nicht erst in 3 Jahren sondern bereits heute! Tada! Leider – ihr habts geahnt – hat die Sache einen gehörigen Haken. Erstmal dass ich mich mit

require_once 'typehintclass.lib.php';

rumschlagen muss und zweitens (viel schlimmer) – das Ganze ist logischerweise kein valides PHP und erzeugt einen Error. Die typehint-lib bringt also einen eigenen Errorhandler mit, der auf fürchterlich unperformante und hässliche Weise den Fehler auseinandernimmt und dann entweder failed oder (wenn Typ korrekt war) den Fehler unter den Tisch kehrt und weitermacht.

public function errorHandler($errno, $errstr, $errfile, $errline, $errcontext) {
	if ($errno == E_RECOVERABLE_ERROR) {
		if ($parsedError = $this->parseErrorString($errstr)) {
			$backtrace = debug_backtrace();
			$value = @$backtrace[1]['args'][$parsedError['argnum']-1];
			if ($this->solveTypeHintFailure($parsedError['typehint'], $value)) {
				return;
			}
		}
	}
	if ($this->oldErrorHandler) {
		return call_user_func($this->oldErrorHandler, $errno, $errstr, $errfile, $errline, $errcontext);
	} else {
		return false;
	}
}

Tja, anders gehts leider nicht. Aber wär schön gewesen.