Buzzworderia: First-class citizen

Tags:

First-class citizen ist einer dieser Ausdrücke, die ich schon zig Male gehört oder gelesen habe, aber mich trotzdem nie um eine Begriffserklärung bemühte. Dies hab ich jetzt endlich nachgeholt. Mein erlangtes Wissen teile ich nun gerne mit euch - falls ihr auch wollt.

Willst du mit mir Wissen teilen?
[ ] Ja
[ ] Nein
[ ] Weiss nicht

Okay, das war lahm. Beginnen wir!

Erklärung

Ein first-class citizen oder auch first-class object ist ein Objekt (nicht im Sinne einer Klasseninstanz) einer Programmiersprache, das sich durch folgende Merkmale auszeichnet:

Beispiel

In PHP, eine Klasseninstanz ist ein first-class citizen.

// Sie kann zur Laufzeit erstellt und einer Variable zugewiesen werden
$user = new User();

// Sie kann an eine Funktion übergeben und zurückgegeben werden
function login(User $user) {
    // Loginroutine
    // ...

    return $user;
}

// Sie kann zerstört werden
unset($user);

Ein noch einfacheres Beispiel wäre jede skalare Variable in PHP. Diese erfüllen ebenfalls alle Anforderungen.

$a = 10;
$b = 10.53;
$c = 'Hallo';
$d = null;

Klassen hingegen sind in PHP keine first-class citizens. Sie können nicht zur Laufzeit erstellt/definiert oder an Funktionen übergeben werden. Es gibt aber durchaus Programmiersprachen wo dies möglich ist, da Klassen dort als Objekte abgebildet werden (z.B. LISP mit CLOS). Das behauptet jedenfalls Wikipedia.

PHP und Funktionen

In JavaScript sind alle Funktionen first-class citizens.

var hello = function(name) {
    alert('Hello ' + name);
}

hello('World');

Hingegen in PHP ist die Sache etwas komplizierter: Obwohl PHP seit Version 5.3 anonyme Funktionen/Closures anbietet, sind diese kein eigenes Sprachkonstrukt, sondern ein Interpreter-Trick.

$hello = function($name) {
    echo "Hello $name";
};

$hello('World'); // Hello World

Für jede anonyme Funktion wird automatisch ein Objekt der Klasse Closure angelegt und dort die __invoke()-Methode aufgerufen. Obiges Beispiel könnte also theoretisch wie folgt beschrieben werden:

// ACHTUNG: Dieser Code funktioniert so natürlich nicht!
// Er dient nur der Veranschaulichung des internen Ablaufs.

class HelloClosure extends Closure
{
    public function __invoke($name)
    {
        echo "Hello $name";
    }
}

$hello = new HelloClosure();
$hello->__invoke('World'); // oder: $hello('World');

PHP behandelt also Funktionen nicht ganz als first-class citizens, sondern mimt deren Verhalten nur.

Ähnliche Artikel

Kommentare