Archief - PHP: Reference - &

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

50Euro

Legacy Member
Wil er mij iemand uitleggen wat die "&" eigenlijk doet?
Het is eigenlijk geen toekenning aan de variable maar een verwijzing of zo..
PHP:
<?php
$foo = 'Bob';              // Assign the value 'Bob' to $foo
$bar = &$foo;              // Reference $foo via $bar.
$bar = "My name is $bar";  // Alter $bar...
echo $bar;
echo $foo;                // $foo is altered too.
?>
Bij
PHP:
echo $bar;
echo $foo;
is de output bij beide "My Name Is Bob"
Als je de "&" weg doet krijg je bij
PHP:
echo $foo;
als output gewoon "Bob"..

Liefst een simpele uitleg... (Ben nog maar pas begonnen...)

Bron PhP.Net

killgore

Legacy Member
simpele uitleg:

$bar wordt hier gewoon als andere variabelenaam voor $foo gezien.

je kan dus zeggen dat $bar en $foo altijd in alle opzichten gelijk zijn :).

50Euro

Legacy Member
Zonder de "&" zouden ze gelijk zijn...

Nu is het een verwijzing die ik niet snap...

Die "&" maakt ook een verandering in $foo...

Want $foo is ook "My Name Is Bob" geworden..

Ps. De uitleg mag iets complexer zijn hoor.. :ironic:

DarkBone

Legacy Member
Ge moet een variabele eigenlijk zien als volgt:

naam die verwijst naar inhoud op een bepaald adres (adres in het computergeheugen)
PHP:
// vb1.
$foo = 'bob';
de inhoud van de variabele $foo is dus bob, en zijn adres dat wordt intern bijgehouden en geaccocieerd met de variabelenaam.

Over nu naar dat &-teken:
PHP:
// vb2.
// expressie 1
$bar = $foo;

// expressie 2
$bar =  &$foo;

In expressie 1 gebeurt het volgende: de inhoud waar het adres van de variabele $foo naar verwijst wordt opgehaald en in een nieuwe adresruimte gestoken die geassocieerd wordt met $bar. (Er wordt als het ware een kopie genomen van de inhoud en in een nieuwe adresruimte gestoken.)

Kort:
$foo verwijst naar bepaalde adresruimte
$bar verwijst naar andere adresruimte met gelijkaardige inhoud (kopie)

---

In expressie 2 gebeurt ernet iets anders, in plaats van een kopie te nemen van de inhoud op de adresruimte van $foo, zorgt de &-operator ervoor dat ook de variabele $bar nu naar diezelfde adresruimte van $foo verwijst. Met andere woorden je creëert als het ware een alias voor de inhoud op de adresruimte voorheen geassocieerd met $bar.

Dit impliceert dus dat wanneer je iets via de ene variabele verandert en je output de andere variabele, dat via beide variabelen die wijziging zichtbaar zal zijn, aangezien ze naar hetzelfde verwijzen:

Kort:
$foo verwijst naar bepaalde adesruimte
$bar verwijst naar diezelfde adresruimte
(ze verwijzen dus naar exact dezelfde inhoud)

Hopelijk is het wat duidelijk.

Dit begrip is vergelijkbaar met een pointer (een verwijzing naar, het wijst naar, to point to) ;)

Grtz,
db

DarkBone

Legacy Member
Trouwens, je mag gerust je threads laten staan hoor... andere mensen kunnen er nog uit leren (via gebruik van de search).

En ik doe tenslotte ook wat moeite dit telkens te typen ;)

Thx.

50Euro

Legacy Member
Je hebt gelijk... Ik zal ze laten staan.. Je kan hier nog iets van leren..

Dus door in dit voorbeeld "$bar" te wijzigen door onderstaande...
PHP:
$bar = "My name is $bar";
verander je "$foo" ook?

Kan je eens een voorbeeld geven waar men deze instructie vooral gebruikt?
M.a.w. waar is ze nuttig voor?

Bedankt voor al die moeite trouwens...

DarkBone

Legacy Member
Klopt wat je zegt.

References worden vooral gebruikt bij het doorgeven van parameters aan functies, een functie ontvangt standaard altijd een kopie van de variabelen die je meegeeft. Indien je echter de variabele laat voorgaan door een &-teken, dan zal geen kopie worden meegegeven, maar een verwijzing naar de oorspronkelijke inhoud/variabele.

Ik neem als voorbeeld het verhogen van een waarde:

PHP:
// voorbeeld 1
$count = 0;
addOne($count);
echo $count;

function addOne($count)
{
     $count = $count + 1;
}
In bovenstaand voorbeeld zal de output 0 zijn.


PHP:
// voorbeeld 2
$count = 0;
addOne($count);
echo $count;

function addOne(&$count)
{
     $count = $count + 1;
}
In bovenstaand voorbeeld zal de output echter NIET 0 zijn, maar 1 !!.

Je bewerkt namelijk de oorspronkelijke variabele.

Duidelijk ? :)

ps: ik hoop dat je het stuk over functies al gelezen hebt :p

DarkBone

Legacy Member
Het is niet onmiddelijk het meest makkelijke begrip en het is lichtjes verschillend van pointers zoals we die kennen in C/C++ (de PHP manual gaat wat dieper in op de verschillen, maar wat meer programmatorisch inzicht is misschien vereist, nogal 'moeilijke' voorbeelden om vlot te begrijpen).

Niet van wakker liggen als je het niet onmiddelijk begrijpt, het staat wat ongelukkig zo hoog in de manual terwijl het toch een behoorlijk complex begrip is om zomaar van de eerste keer te snappen als je nog weinig ervaring/kennis hebt van php.

Het simpelste is gewoon om het te zien als een soort alias toekenning.

Grtz,
db

50Euro

Legacy Member
Dus zo kan je oneindig lang doorgaan zoals in mijn klein vb

PHP:
<?php
$foo = '50Euro';              // Assign the value 'Bob' to $foo
$bar = &$foo;              // Reference $foo via $bar.
$bar = "My name is $foo";  // Alter $bar...
$bar = "Nu lees je dit! $foo";
echo "<hr>";
echo $bar;
echo "<hr>";
echo $foo;                // $foo is altered too.
?>

Kan je trouwens een spatie zetten in een variable?
PHP:
$bar = "My name is $foo<br>";
Werkt niet...

Functions???? :eek: Al eens snel gelezen maar nog niet echt in verdiept(zoals in veel dingen van PHP)... :baard:

DarkBone

Legacy Member
Hmmm... nog niet zo slecht gezien, je zou inderdaad denken dat $foo zichzelf oneindig blijft ophalen, maar dat gebeurt dus niet.

*edit*
Bij nader inzien toch volkomen logisch ;)
Was even verward. :D

PHP:
$bar = "Nu lees je dit! $foo";

Voordat de toekenning gebeurt wordt $foo namelijk vervangen door zijn waarde op dat moment (toekenning isnog niet gebeurt, dus dat is nog steeds 'My name is 50Euro').

Dus wordt dat dan: 'Nu lees je dit! My name is 50Euro'

killgore

Legacy Member
Originally posted by 50Euro
Zonder de "&" zouden ze gelijk zijn...

(had geen tijd om volgende replies te lezen)

foute stelling

als je hebt

$foo = $bar;

dan ken je de waarde van bar toe aan foo, waardoor de inhoud nu wel hetzelfde wordt, maar de variabelen niet hetzelfde zijn.

met $foo = &$bar; Zorg je ervoor dat deze vars volledig hetzelfde zijn, ze verwijzen constant naar dezelfde plaats waar deze waarde is opgeslaan.

PHP:
$bar = "My name is {$foo}<br>";
is de werkende syntaxis normaal gezien.

50Euro

Legacy Member
PHP:
<?php
function test_global_ref() {
   global $obj;
   $obj = &new stdclass;
}

function test_global_noref() {
   global $obj;
   $obj = new stdclass;
}

test_global_ref();
var_dump($obj);
echo '<hr>';
test_global_noref();
var_dump($obj);
?>

Output:
NULL
--------------------------------------------------------------------------------
object(stdClass)(0) { }

Waarvoor staat stdclass?

50Euro

Legacy Member
Ik snap eigenlijk nog niet zoveel hoor.
Ben gisteren pas effectief begonnen met PHP.
Ik krijg er soms koppijn van en ken de basis nog niet! :doh:

Wat is nu eigenlijk een class en een object?

Wat doen volgende voorbeelden?

Objects
Object Initialization
To initialize an object, you use the new statement to instantiate the object to a variable.

PHP:
<?php
class foo
{
   function do_foo()
   {
       echo "Doing foo."; 
   }
}

$bar = new foo;
$bar->do_foo();
?>



For a full discussion, please read the section Classes and Objects.

Converting to object
If an object is converted to an object, it is not modified. If a value of any other type is converted to an object, a new instance of the stdClass built in class is created. If the value was null, the new instance will be empty. For any other value, a member variable named scalar will contain the value.


PHP:
<?php
$obj = (object) 'ciao';
echo $obj->scalar;  // outputs 'ciao'
?>

Bron PHP.NET

sneax

Legacy Member
ge wilt alles veel te snel ineenekeer doen

leer eerst wa me vars werken

leer dan if'en en while'en enzo

leer dan functies

classes en objecten hebt ge ni nodig voor de meeste dignen, hou u daar ni mee bezig (zeker ni op uwen 2en dag)

etc...

zoek nen tutorial da begint me 'hello world' en dan opbouwt

50Euro

Legacy Member
Naar mijn mening gaat PHP.NET wel een beetje snel...
Misschien een goede site maar je moet er iets van af weten...
Ik heb de sticky gelezen en ga de nederlandstalige site's één voor één af...
Ik ben mij Basiscursus "PHP 4.2" en "PHP4 Het Complete Boek" gaan halen in de bib ook..

De combinatie lijkt mij het beste..

Een goede tutorial is nu één maal niet te schrijven door iemand die er alles vannaf weet.. Denk ik..

Als je er alles van af weet lijken sommige dingen zeer simpel maar voor een newbie zijn ze dat zeker niet..

Das mijn mening tenminste...

Conclusie: Veel oefenen, lezen, geduld, niet opgeven en vooral veel hulp van het telenet forum!!!!

DarkBone

Legacy Member
PHP.net is dan ook een reference en dat mag je niet als een tutorial beschouwen, daarom dat je die altijd in combinatie moet gebruiken met één of ander boek, of een serie artikels/tutorials.

PHP4 Het complete handboek is een aanrader, legt de basis makkelijk uit. Wel opletten, want bij de meeste scripts die van GET/POST/SESSIONS/COOKIES gebruik maken zal dat waarschijnlijk nog gebeuren via de oude notatie.

killgore

Legacy Member
Originally posted by 50Euro
Een goede tutorial is nu één maal niet te schrijven door iemand die er alles vannaf weet.. Denk ik..

imo compleet wel, anders ga je verkeerde technieken aanleren ;). Een goede tutwriter zal eerst zen boeken/tutos uittesten op genoeg newbies :).

stdclass is een klasse van de zend-engine waar je je gewoon niks moet van aantrekken, het enige dat je moet weten is dat je zelf geen klasse kan maken die stdclass noemt :)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan