Hallo,
Das schreit doch nach einer globalen Definition.
wenn man schon globale Variablen verwenden möchte, finde ich das explizite Bekanntmachen innerhalb der Funktion mit dem global-Keyword sauberer
Abe es ist immer noch der Unterschied zwischen Ölschmier an den Fingern und triefendem Schmodder. $_GLOBALS sollte man einfach ignorieren. Und globale Variablen dringend vermeiden.
Ich muss aber auch eingestehen, dass es in PHP ohne radikale Objektorientierung mühsam ist, auf globale Variablen zu verzichten.
$current === null || $current === 'game' ? 'current' : ''
Hier würde ich definitiv dazu raten, $current bei der Initialisierung gleich auf 'game' zu setzen, wenn nichts drinsteht. Die Funktionen für die Menüpunkte werden von irgendwas aufgerufen. Dieses irgendwas sollte selbst eine Funktion sein (build_menu oder ähnlich), und in build_menu sollte sowas stehen wie
$current = $_GET['subpage'] ?? 'game'; // <-- NULL gar nicht erst entstehen lassen!
$menus = [ 'game', 'releases', 'merchandise', ...., 'savegame' ];
if (!in_array($current, $menus))
$current = 'game';
for ($menus as $menu) {
("menu_$menu)($current == $menu);
}
...
function menu_game($isCurrent)
{
?>
<a <?= $isCurrent ? 'aria-current="page"' : '' ?> href='...'>Game</a>
<?php
}
Der Funktionsaufruf mit ("menu_$menu)()
funktioniert ab PHP 7.
- Name der Funktion ist vom externen Namen entkoppelt. Wenn auch nur leicht. Noch besser wäre eine echte Map.
- Subpage wird geprüft, ob es ein gültiger Name ist
- Prüfung, ob der Menüpunkt die aktuelle Seite ist, ist zentralisiert und aus den Menüfunktionen entfernt
Mit der Map meine ich:
$menus = [ 'game' => 'menu_game',
'releases' => 'menu_releases',
'merchandise' => 'menu_mechandise',
....,
'savegame' => 'menu_savegame'
];
if (!array_key_exists($current, $menus))
$current = 'game';
for ($menus as $menuId => $menuHandler) {
$menuHandler($current == $menuId);
}
Je länger man über etwas nachdenkt, desto mehr Abstraktionen fallen einem ein...
Rolf
sumpsi - posui - obstruxi