Das wäre vielleicht so, wenn PHP-Skripte permanent im Speicher gehalten und nicht bei jedem neuen Aufruf der Seite neu geladen würden. Aber das ist im Standardfall nunmal nicht so, sie werden neu geladen. Sämtliche Includes und Initialisierungen werden bei jedem neuen Seitenaufruf erneut eingebunden bzw. durchgeführt, auch dein Array wird bei jedem HTTP-Request neu befüllt.
Die Lookup-Zeit von O(1) in dem gehashten Array würde dann was bringen, wenn öfter als einmal pro Request etwas aus dem Array abgefragt würde. Ansonsten -- also bei nur einer Abfrage, mehr haben wir hier ja nicht -- gehe ich sehr stark davon aus, dass die Switch-Case-Variante schneller ist und auch weniger Arbeitsspeicher verbraucht, weil der Initialisierungs-Overhead des Arrays wegfällt und weil nicht alle Einträge des Arrays permanent im Speicher gehalten werden müssen.
Trotzdem ist das Array die bessere Wahl, weil es flexibler einzusetzen ist und weil Abstraktion und bessere Lesbarkeit in der Regel wichtiger sind als schnellstmöglicher Code. Aber je stärker abstrahiert wird (sprich: je mehr OOP), desto langsamer wird die ganze Chose, denn Objekte erzeugen Einiges an Overhead. Das fällt aber natürlich selten ins Gewicht, die bottlenecks sitzen üblicherweise anderswo (DB-Abfragen, Dateisystemzugriffe oder komplexe Schleifen und Berechnungen etwa). Das sind also alles keine Argumente, um nicht möglichst abstrakt zu programmieren, ich betone es noch mal. Die fraglichen Abläufe sind oft so schnell, dass es keine Rolle spielt, ob die doppelte Zeit oder die halbe Zeit oder die zehnfache Zeit gebraucht wird.
Output Buffer sind übrigens speichertechnisch nicht wirklich effizient. Ausgaben werden nicht direkt an den Browser durchgereicht, sondern müssen von PHP erst im Arbeitsspeicher herumkopiert werden.
PHP:
<?php
// ob_*-Zeilen für Test ein- bzw. auskommentieren
$start = microtime(true);
#ob_start();
echo '<div style="display: none;">';
for ($i = 0; $i < 1000; $i++) {
// 1000 Strings mit je 1000 Zeichen ausgeben
echo str_repeat('x', 1000);
}
echo '</div>';
#ob_end_flush();
echo memory_get_peak_usage() . ' Bytes<br />';
echo round((microtime(true) - $start) * 1000) . ' ms';
Speicherverbrauch ohne Buffer: 64 832 Bytes
Speicherverbrauch mit Buffer: 1 058 664 Bytes
Mit der tollen Idee...
PHP:
$s = ob_get_contents();
ob_end_clean();
echo $s;
...verdoppelt sich der Verbrauch dann auf 2 MB.