Zukünftige Features in PHP 5.4 / PHP 6

Heute wage ich mal einen Blick in die Zukunft von PHP. Demnächst erscheint eine erste Alpha-Version zu PHP 5.4 mit einigen neuen Features. Ein paar der wichtigsten neuen Features möchte ich nun vorstellen. Ob tatsächlich alle der hier aufgeführten Features mit dem Release von PHP 5.4 fertig werden oder ob diese nicht für PHP 6 aufgeschoben werden, steht noch in den Sternen.

Type Hinting

Type Hinting ist eines der am meisten gewünschten Features in PHP. Dabei wird in der Parameterangabe von Funktionen und Methoden auch der Variablentyp mit übergeben. Ob und in welcher Form dieses Feature in einer der zukünftigen PHP Versionen erscheinen wird, muss noch diskutiert werden. Problematisch ist dabei u.a. das Verhalten, wenn ein falscher Typ angegeben wird. Soll ein Fehler ausgegeben werden oder wird die Variable einfach umgewandelt?

function addiere(int $x, int $y)
{
	return $x + $y;
}
 
var_dump(addiere("9", "1"));

Array dereferencing

Mit dieser Funktion lassen sich Array-Angaben direkt hinter einem Funktionsaufruf ausführen.

function getAnyArray()
{
	return array("Apfel", "Birne", "Banane");
}
 
echo getAnyArray()[2]; // Ausgabe: Banane

Aus meiner Sicht ein super nützliches Feature, weil man sich dadurch das Zwischenspeichern in eine Variable und damit eine Zeile Code sparen kann.

UTF-8 / UTF-16

Hier sind sich die PHP-Entwickler noch nicht ganz einig. Man möchte, dass die interne String-Behandlung mit einer der modernen Zeichenkodieriung wie UTF-8 oder UTF-16 arbeitet, aber das bringt viele Probleme mit sich. Außerdem steht noch offen, welche Zeichenkodierung verwendet wird. UTF-8 ist zum gängigen Standard geworden, UTF-16 dagegen würde die Ausführung verlangsamen, weil der Speicherverbrauch größer wird.

Traits (Mehrfache Klassenvererbung)

Mit Traits können Klassen von mehreren Elternklassen die Funktionalitäten erben. Im Moment lässt sich über extends immer nur eine Klasse erweitern.

Hier ein Traits-Beispiel:

trait PKW
{
	public function getGeschwindigkeit()
	{
		return 'xxx';
	}
}
 
abstract class Auto
{
	public function getKmStand()
	{
		return 'xxx';
	}
}
 
class Limousine extends Auto use PKW
{
	// ...
}
 
$meinAuto = new Limousine();
echo $meinAuto->getGeschwindigkeit();
echo $meinAuto->getKmStand();

PHP > MySQL Datenbank in UTF-8 konvertieren

Folgendes PHP-Skript konvertiert eine komplette MySQL Datenbank in UTF-8:

define('DB_HOST', 'localhost');
define('DB_NAME', 'datenbank_name');
define('DB_USER', 'benutzer');
define('DB_PASSWD', 'supergeheimespasswort');
 
mysql_connect(DB_HOST, DB_USER, DB_PASSWD);
mysql_select_db(DB_NAME);
 
$result = mysql_query("SHOW TABLES");
while($row = mysql_fetch_assoc($result))
{
	$tableName = $row['Tables_in_'.DB_NAME];
	$fields = array();
	$primaryKey = null;
	mysql_query("ALTER TABLE `{$tableName}` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci");
	$_result = mysql_query("DESCRIBE `{$tableName}`");
	while($_row = mysql_fetch_assoc($_result))
	{
		if(isset($_row['Key']) && $_row['Key'] == 'PRI' && !$primaryKey)
		{
			$primaryKey = $_row['Field'];
		}
		if(strpos($_row['Type'], 'varchar') !== false || strpos($_row['Type'], 'text') !== false)
		{
			$fields[] = $_row['Field'];
			mysql_query("ALTER TABLE `{$tableName}` CHANGE `{$_row['Field']}` `{$_row['Field']}` {$_row['Type']} CHARACTER SET utf8 COLLATE utf8_general_ci");
		}
	}
	if(!empty($fields) && !empty($primaryKey))
	{
		$fields[] = $primaryKey;
		$_result = mysql_query("SELECT `".implode('`,`', $fields)."` FROM `{$tableName}`");
		while($_row = mysql_fetch_assoc($_result))
		{
			$values = array();
			foreach($_row as $field => &$value)
			{
				if($field != $primaryKey && !empty($value))
				{
					$values[] = "`".$field."` = '".utf8_encode($value)."'";
				}
			}
			$sql = "UPDATE `{$tableName}` SET ".implode(',', $values)." WHERE `{$primaryKey}` = '{$_row[$primaryKey]}'";
			mysql_query($sql);
		}
	}
}

Es werden nicht nur die Tabellen selbst, sondern auch alle geeigneten Felder konvertiert.

UPDATE 31.03.2011:
Ich habe das Skript noch einmal erweitert, sodass nicht nur die Datenbank konvertiert wird, sondern auch die Inhalte alle Datensätze.