Tutorials

variabel denken

Met variabelen kun je meer dan er over het algemeen over gedacht wordt. Een paar extra mogelijkheden.

Pagina 1

Inleiding

Wat de meesten onder variabelen verstaan, zijn gewoon de variabelen. Hiermee kun je een bewerking uitvoering, hier kun je altijd gewoon mee vooruit. Maar je kunt met variabelen ook meer. Je kunt variabelen gebruiken als om een functie aan te roepen. Zelfs met objecten kun je ze gebruiken.

Daarom deze tutorial. Hierin vertel ik wat er zoal mogelijk is. Ik zal twee dingen behandelen: variabele variabelen en variabele functies. Ik ga ervan uit dat je de basis van functies kent.

De zaken die ik ga bespreken, zijn enkel informatief. Ik raad je niet aan om ze te gebruiken, vaak zijn er betere alternatieven. Ik laat alleen zien wat er mee kan, en hoe je dit dan eventueel moet doen.
Pagina 2

Variabele variabelen

De naam zegt het al: hiermee wordt een variabele zelf variabel. Dit betekent dat je de naam, en de inhoud van een variabele kunt toewijzen door middel van een andere variabele. Hoe werkt dat? Dat kan ik het beste laten zien met een klein scriptje, de uitkomst laten zien, en uitleggen waarom dat zo is.

We hebben de volgende code:

<?php
	for($i = 1; $i <= 10; $i++)
	{
		${"var" . $i} = "waarde" . $i;
	}
	
	Echo $var1, $var2, $var3, $var4, $var5, $var6, $var7, $var8, $var9, $var10;
?>

Dit geeft als uitkomst:

waarde1waarde2waarde3waarde4waarde5waarde6waarde7waarde8waarde9waarde10

Hoe kan dit nu? Let op regel 2. Hierin wordt de variabele gemaakt onder de naam ${"var" . $i}. Let op de accolades! Alles tussen de accolades wordt opgenomen als een string, dus je kunt er ook alles mee doen als dat je met een string kunt. Je geeft als vast deel 'var' mee, en als uitgang $i. Deze worden samengevoegd, en zullen als naam optreden voor de variabele. Natuurlijk kun je ze ook op dezelfde manier aanroepen.

*note: je hoeft niet per se een vast deel te gebruiken in je naamgeving. Dit kun je ook helemaal weglaten, of vervangen voor een andere variabele. Onthoud dat alles tussen de accolades wordt opgenomen als string.
Pagina 3

Een voorbeeld

wanneer je onbeschoft veel variabelen nodig hebt, kun je bijvoorbeeld een loop gebruiken in combinatie met variabele variabelen.

als je bijvoorbeeld een x, y tabel wilt hebben, ziet dat er zo uit:

<?php
	for ($y = 0; $y <= 10; $y++) // alle y coordinaten in een lus bepalen
	{
		for ($x = 0; $x <= 10; $x++) // alle x coordinaten in een lus bepalen
		{
			${'coord' . $x . $y} = 'alle informatie met coordinaten (' . $x . ', ' . $y . ')';
			// de variabele met inhoud bepalen
		}
	}

	echo $coord49;
?>

dit geeft als uitkomst:

alle informatie met coordinaten (4, 9)

Hier wordt met behulp van twee for-lussen 100 variabelen aangemaakt, met maar een paar lijnen code. dit stukje, ${'coord' . $x . $y}, maakt voor iedere coordinaat een aparte naam. hierdoor is deze informatie ook heel makkelijk op te vragen.

ter vergelijking, het kan ook op deze manier:

<?php
	$coord = array();
	for ($x = 0; $x <= 10; $x++)
	{
		$coord[$x] = array();
		for ($y = 0; $y <= 10; $y++)
		{
			$coord[$x][$y] = 'alle informatie met coordinaten (' . $x . ', ' . $y . ')';
		}
	}
	
	echo $coord['4']['9'];
?>

dit geeft als uitkomst:

alle informatie met coordinaten (4, 9)

dit is heel wat anders als de eerste manier, dit is een grote multidimensional array. op zich gaat dit nog wel, maar stel dat we als inhoud van $coord49 deze code toevoegen:

<?php
	array('alle_informatie', 'tegel' . $y . $x);
?>

dan wordt het aanroepen van deze informatie bij het bovenste $coord49['alle_informatie'], terwijl het bij de andere echo $coord['4']['9']['alle_informatie'] is. dit is natuurlijk veel te omslachtig.

in dit soort codes kunnen deze variabele variabelen wel eens handig zijn.
Pagina 4

Variabele variabelen - deel 2

Er is ook een manier om in 1 variabele 2 waarden op te slaan. Dit lijkt op het sleutel-waarde principe van een array: bij een bepaalde index hoort een bepaalde waarde. Alleen bij dit soort variabelen heb je twee waardes die echt bij elkaar horen, je kunt daar verder niets mee doen.


<?php
	$var = 'sleutel';
	// de "sleutel" waarde wordt gewoon gedefinieerd als 
	// een gewone variabele
	$$var = 'waarde';
	// de waarde die bij sleutel hoort, zit in $$var.
	// (de waarde 'sleutel' zit nog in $var)
	echo $var . ' hoort bij ' . $$var;
?>

Dit geeft als uitkomst:

sleutel hoort bij waarde

Wat gebeurt er? Eerst wordt $var gedefinieerd als elke andere variabele. Vervolgens wordt $$var gedefinieerd de waarde die bij $var hoort. Zoals je misschien al gezien hebt, is het belangrijk dat de twee variabelen exact dezelfde naam hebben.

Als je vervolgens dit doet:

<?php
	$var = 'sleutel';
	// de "sleutel" waarde wordt gewoon gedefinieerd als 
	// een gewone variabele
	$$var = 'waarde';
	// de waarde die bij sleutel hoort, zit in $$var.
	// (de waarde 'sleutel' zit nog in $var)
	echo $var . ' hoort bij ' . $sleutel;
?>

Echot php precies hetzelfde, namelijk:

sleutel hoort bij waarde

Hoe kan dit? Hier gebeurt substitutie, een ander woord voor vervanging. Een variabele is niets anders dan een vervanger voor een variabele. Php vervangt gewoon alle $var door 'sleutel'. Hierdoor komt er te staan $sleutel in plaats van $$var. Daarmee is ook te het eerste voorbeeld te begrijpen, bij het definiƫren van $$var vervangt php eerst $$var voor $sleutel, voor hij er 'waarde' aan toewijst.
Pagina 5

Variabele functies

Ook functies kun je variabel aanroepen. Bekijk de volgende code eens:

<?php
	function huis()
	{
		echo 'dit is een huis';
	}
		
	function boom()
	{
		echo 'dit is een boom';
	}
		
	$var = 'boom';
	$var();
?>

Dit geeft als uitkomst:

dit is een boom

wat is hier gebeurd? Bekijk de code eens. Eerst staan er twee simpele functies. Vervolgens wordt er een variabele gemaakt met de doelfunctie, in dit geval wil je boom aanroepen. En dan komt het: echo $var(); . in eerste instantie zou je zeggen dat dat niet kan, een functie kan toch niet met $ beginnen?

We bekijken eens wat php doet: voordat php een statement uitvoert, vervangt deze eerst alle variabelen door hun inhoud, dan pas wordt het statement echt uitgevoerd. Hier: eerst wordt $var() vervangen door boom(), en dan wordt boom() geechot. En boom is een gewone functie, dus dit wordt als functie uitgevoerd.

We gaan het wat moeilijker maken. Dit keer voegen we attributen toe, en gebruiken we een return:

<?php
	function huis($omgeving)
	{
		$omschrijving = 'dit is een huis, en dat staat in de ' . $omgeving;
		return $omschrijving;
	}
		
	function boom($omgeving)
	{
		$omschrijving = 'dit is een boom, en dat staat in het ' . $omgeving;
		return $omschrijving;
	}
		
	$var = 'huis';
	$omgeving = 'stad';
	$resultaat = $var($omgeving);
	echo $resultaat;
?>

En dat geeft als uitkomst:

dit is een huis, en dat staat in de stad

dit werkt precies zoals functies normaal werken. het resultaat wordt opgeslagen in $resultaat, en dan kun je doet met $resultaat wat je wilt, in dit geval echoen.
Pagina 6

Nawoord

Ik hoop dat jullie het principe van variabelen binnen variabelen en variabele functies wat beter snappen. De sleutel van alles is substitutie: vervanging. daarom is er nog een mogelijkheid: je kunt deze methoden ook gebruiken om methods in objects aan te roepen. Maar omdat ik echt een leek ben op het gebied van OOP heb ik dat links laten liggen.

Wanneer je variabelen op deze manier gebruikt, moet je goed blijven opletten. Heel snel klopt er al iets niet. Wanneer je deze variabelen via een link opvraagt, moet je niet alleen valideren op xss injectie etc, maar ook of deze variabele gebruikt kan worden in combinatie met je bestaande functies/variabelen.

Zoals ik in de inleiding al aangaf, vaak kun je beter een alternatief gebruiken. Zo kun je de voorbeelden met de functies beter vervangen door een switch(). Deze tutorial is enkel bedoeld om wat te laten zien van dit principe.

Jeroen

Reacties

0
Nog geen reacties.