Über lockige Klammern


In unserer Konfiguration haben wir folgende Zeile stehen:

sprintf(__DIR__ . '/autoload/{,*.}{global,%s,local}.php', $environment)

Was hat diese merkwürdige Notation mit den Klammerlocken (curly braces) zu bedeuten?

Das hat mit sprintf gar nichts zu tun, das hier nur das %s durch das Environment (z.B. Staging) ersetzt. Das ist Bash-Syntax, also probieren wir es mal dort aus:

>echo {1,2,3}
1 2 3

Aha, wir haben es hier mit einer mathematischen Menge zu tun, die Notation kommt dem ein oder anderen vielleicht aus Mathe bekannt vor. Diese Menge wird nun also mit Leerzeichen dazwischen ausgegeben. Wobei, eigentlich ist das eine geordnete Menge. Und solche Mengen nennt man Vektoren.

Soweit, so unspannend. Nun kann man aber, wenn man sich zurück erinnert an die Schule, mit Vektoren auch lustige Dinge machen. Zum Beispiel sie mit einem Skalar multiplizieren. Das probieren wir einmal:

>echo {Klammer,Menschen}affe
Klammeraffe Menschenaffe

Er expandiert also die Menge mit jedem Postfix. Das geht natürlich auch mit Suffix und Postfix:

>echo Ein {Klammer,Menschen}affe
Ein Klammeraffe Menschenaffe

Oh, das hat nicht funktioniert, “Ein” wurde nicht wiederholt. Dem kann man abhelfen, indem man das Leerzeichen entweder maskiert, oder das Suffix in Anführungszeichen packt:

>echo Ein\ {Klammer,Menschen}affe
Ein Klammeraffe Ein Menschenaffe
>echo "Ein "{Klammer,Menschen}affe
Ein Klammeraffe Ein Menschenaffe

Aber Multiplikation mit Skalaren ist langweilig, machen wir das mal mit einem anderen Vektor. Back to school again, Vektormultiplikation ist wie Klammern ausmultiplizieren, jedes mit jedem:

>echo {doo,bee}{bee,doo}
doobee doodoo beebee beedoo

Das erinnert jetzt ein wenig an Scat-Musik, Minnie the Moocher spielt jetzt in den hinteren Räumen meines Hirns.

Und jetzt sind wir fast soweit, das Beispiel von oben zu erklären:

sprintf(__DIR__ . '/autoload/{,*.}{global,%s,local}.php', $environment)

wird also beim Environment “development” zum Beispiel zu:

/home/user/projectX/config/autoload/{,*.}{global,development,local}.php

Ein Punkt fehlt uns noch: Was ist {,*.}? Nun, ganz einfach: Ein leeres Element und der String “*.” in einem Vektor. Multiplizieren wir aus, so erhalten wir:

/home/user/projectX/config/autoload/global.php
/home/user/projectX/config/autoload/development.php
/home/user/projectX/config/autoload/local.php
/home/user/projectX/config/autoload/*.global.php
/home/user/projectX/config/autoload/*.development.php
/home/user/projectX/config/autoload/*.local.php

In dieser Reihenfolge werden also die Konfigurationsdateien geladen und local überschreibt somit global.

Ich hoffe, wieder ein Rätsel gelöst zu haben, und de(r|m) Einen oder Anderen geht eine Lampe auf!

About the author

People Enabler at CHECK24

Comments

  1. So kann man es z.B. auch für eigene Projekte ohne Zend Spaß benutzen:

    <?php

    $pattern = __DIR__ . '/config/{,*.}{global,development,local}.php';
    $files = glob($pattern, GLOB_BRACE);
    // GLOB_BRACE ist wichtig damit die Klammen aufgelöst werden

    $config = [];

    foreach ($files as $file) {
    $config = array_merge($config, require($file));
    }

    var_dump($config);

Comments are closed.