Hallo Martin,
Soweit ich weiß, wird eine Variable, auch ein Eintrag in einem Array, beim ersten Zugriff darauf implizit erzeugt.
Beim Schreiben darauf. Beim Lesen nicht.
echo $_SESSION['username'];
echo $_SESSION['username'];
echo $_SESSION['username'];
echo $_SESSION['username'];
erzeugt viermal eine Notice, wenn der Eintrag nicht existiert.
Schnelligkeit von Session Variablen.
Das ist von $_SESSION unabhängig, das gilt für jeden Array-Zugriff. Arrays sind Hashmaps, und - soweit ich das jetzt weiß - Variablenscopes ebenfalls.
Ein Variablenzugriff bedeutet also einen Hashzugriff, ein Zugriff auf ein Arrayelement sind zwei Hashzugriffe. Erst das Array im Scope finden, dann den Eintrag im Array.
Möglicherweise weist PHP den $_... Superglobals eine Sonderrolle zu und optimiert die Zugriffe darauf, so dass nur ein Hashzugriff erforderlich ist.
Möglicherweise optimiert PHP einen Arrayzugriff mit Stringliteralen, so dass der Hashkey bereits beim Generieren der Opcodes gebildet wird.
Das müsste mal alles durch Benchmarks ausmessen und auch PHP Versionen vergleichen. Insbesondere könnte der JIT Compiler in PHP 8 hier deutliche Einflüsse haben.
Unter dem Strich reden wir aber von Operationen, die auf modernen CPUs in Nanosekunden ablaufen. Wenn man für einen Webauftritt vor der Frage steht, ob man 1000 oder 1100 Server aufstellen muss, um die Last zu bedienen, dann sind solche Optimierungen interessant. Allerdings würde ich dann eher anfragen, ob PHP für solche Seiten die richtige Sprache ist.
Ich persönlich neige dazu, bei mehr als zwei Zugriffen auf Arrayeinträge eine Temp-Variable anzulegen. Vermutlich, weil ich schreibfaul bin. Aber ich bin auch Jahrgang 1965 und wurde mit BASIC Dialekten von Commodore, Atari und TI digitalisiert, auf CPUs, die inclusive ihrer Chipsätze vom heutigen Niedervoltsilizium hundertfach schneller emuliert werden, als sie es selbst jemals waren.
Rolf
sumpsi - posui - obstruxi