Einsteins Rätsel oder das Overload-Mysterium

Post von realloc | Einsortiert in Code am 18. Juli 2007 | Keine Kommentare

Man schreibt Einstein ein Rätsel zu, das angeblich nur 2% der Menschheit lösen können, was uns immer noch die stolze Menge von etwa 100 Millionen Menschen lässt, die das bewerkstelligen können sollten. Die meisten Schüler lösen es wohl in 10 Minuten, wenn man deren Erklärungen Glauben schenken möchte. Aber in Verbindung mit PHP und der Builtin-Funktion overload() wird das Ganze wahrhaft mystisch.

Sie haben noch nie von overload() gehört. Macht nichts! Diese Funktion wird bald sterben! Da die PHP-Entwicklergruppe die Version nun offiziell nach dem 31.12.2007 in den Ruhestand versetzt, kann man sich getrost die letzten Versuche der Version 4 (standardmäßig seit 4.3 aktiviert) ansehen, richtiges OOP möglich zu machen. Wenn Sie nämlich bisher nur auf Umwegen, so etwas wie das Überladen der Object-Properties hinbekommen haben, dürfen Sie jetzt getrost noch einmal lachen … oder weinen! overload() ermöglicht nämlich Dinge, die in PHP 5 standardmäßig eingebaut sind, wie __set(), __get() und __call().

Für alle, die etwas mehr Code zur Veranschaulichung brauchen, hier die Auflösung des Einstein-Rätsels und overload() in Action:

[code lang="php"]
class Person {

var $attr =
array (
'position' => null,
'nationality' => null,
'color' => null,
'pet' => null,
'beverage' => null,
'cigarette' => null,
);

function __set ($property, $value) {
$this->attr[$property] = $value;
echo $property . " => " . $value . "n";
return TRUE;
}

}

$attributes =
array (
'Norwegian' => array (
'position' => '1',
'color' => 'yellow',
'cigarette' => 'Dunhill',
'beverage' => 'water',
'pet' => 'cat',
),
'Dane' => array (
'beverage' => 'tea',
'position' => '2',
'color' => 'blue',
'pet' => 'horse',
'cigarette' => 'Marlboro',
),
'Briton' => array (
'color' => 'red',
'position' => '3',
'beverage' => 'milk',
'cigarette' => 'Pall Mall',
'pet' => 'bird',
),
'German' => array (
'cigarette' => 'Rothmanns',
'position' => '4',
'color' => 'green',
'beverage' => 'coffee',
'pet' => 'fish',
),
'Swede' => array (
'pet' => 'dog',
'position' => '5',
'color' => 'white',
'beverage' => 'beer',
'cigarette' => 'Winfield',
)
);

class Enigma {

var $persons;

function Enigma () {
global $attributes;
foreach ($attributes as $key => $value) {
$person = new Person;
$person->nationality = $key;
foreach ($value as $property => $property_val) {
$person->$property = $property_val;
}
$this->persons[] = $person;
}
}

}

overload ('Person');
$enigma = new Enigma();
[/code]

Have fun!

Möglicherweise interessiert Dich auch...



Einen Kommentar schreiben