<?php
$ikbeneenvariabelenaam = "elke keer wat anders";
$probleem = "$ikbeneenvariabelenaam"; (komt uit de database)
echo "Hier staat: ". $probleem;
//dan krijg ik
"Hier staat: $ikbeneenvariabelenaam"
//en ik wil
"Hier staat : elke keer wat anders"
?>
Ik snap dat "weergeven van gebruikers in een selectbox" ook als 1 ding gezien kan worden, maar dat is te veel.
je geeft nu aan de functie "gebruik díe tabel" om een select op te doen. Maar: straks wil je ook nog ergens op sorteren. Of je wilt alleen gebruikers die het recht "edit" hebben. Of "edit" en die bovendien een gmail-mailadres hebben.
Dat wil je niet allemaal via 25 parameters meegeven.
splits het dus op: maak een generieke "maak een selectbox" en doe verder niets anders.
Hij zou eigenlijk zelfs niet eens "echo" moeten bevatten, maar het geheel als string terug geven.
op die manier kun je zo'n input ook nog anders gebruiken dan "direct naar het scherm"
(En mocht je inderdaad je vars nummeren: ik heb ooit een heel oude applicatie moeten bewerken waarin toen query's met letterlijk 85 kolommen gedraaid werden die allemaal in $aValues[0] tot en met $aValues[85] terecht kwamen: dat is een hel om te bewerken, want dat is echt niet te doen. (en oude PHP kon toen met Oracle query's niet anders dan numeriek fetchen)
Een aanpak waarbij je letterlijke uitgeschreven namen van variabelen in een database stopt, waarbij je deze string als variabele zou moeten evalueren, lijkt mij geen goed plan.
Als je een specifieke sessie-variabele wilt gebruiken zou je deze dus letterlijk als parameter mee kunnen geven, waarbij je dus garantie moet hebben dat, of gewoon controleert of deze bestaat:
En als deze op een of andere manier varieert - maar dit zou al een zogenaamde code smell (verkeerd ontwerp / brakke code) kunnen inhouden - dan zou je aan de index kunnen refereren in de definitie:
<?php
// definitie
function mijnFunctieTwee($sessieVariabeleIndex) {
// doe hier iets met $_SESSION[$sessieVariabeleIndex];
}
?>
Deze zou je vervolgens kunnen aanroepen met:
<?php
// aanroep
mijnFunctieTwee('whatever');
?>
En dan heb je dus in wezen een soort van dynamische variant van de eerdere functie mijnFunctie().
En zo zijn er waarschijnlijk nog legio andere, en zinnigere, aanpakken te verzinnen dan wat er nu gebeurt.
De vraag is echter of dit in dit geval echt een goede ontwerpstrategie is.
We zouden meer code moeten zien om hier een oordeel over moeten vormen maar mijn eerste "gut feeling" (en het feit dat er var1, var2, var3 etc. wordt gebruikt) zegt mij: waarschijnlijk niet.
Een goede functie zou zijn: "bouwt een dropdown aan de hand van aangeleverde data".
Wat jij nu hebt zijn meerdere functies die min of meer hetzelfde doen is een aanpak die je dwingt om elke keer opnieuw een functie te schrijven: nu is het er eent voor users, en later mogelijk voor weer wat anders. Dit komt doordat ze zo (té) specifiek zijn - dit ligt in de definitie verankerd omdat je *in* de functie allerlei specifieke queries uitvoert, daardoor is zo'n functie niet inzetbaar voor een ander, maar soortgelijk doel. En dat is niet het idee van functies.
EDIT: nog een ander ding waar verwarring over lijkt te bestaan:
Dit is hoe strings werken: een string met dubbele quotes evalueert de inhoud (van o.a. variabelen), een string met enkele quotes evalueert enkel bepaalde escape-karakters geloof ik, maar laat variabelen verder ongemoeid.
Ik zou deze kennis echter niet gebruiken om voort te borduren op de huidige aanpak, maar even een stap terug nemen en een betere aanpak verzinnen.
Ik kan slechts een handjevol gevallen verzinnen waarin variabele variabelen wensenlijk zijn. En dit zijn alle uitzonderingen. Zoals @Ward aangeeft (en ik hierboven ook) zijn er vaak (betere) alternatieven.