Beste PHPHulpers,

Ik zit momenteel met een vraag, nadat ik veel in c++ heb geprogrammeerd ben ik steeds meer OOP gaan werken. Nu heb ik een behoorlijk systeem gemaakt en het is erg belangrijk dat alles aan de hand van references gaat zodat er geen verouderde objecten in het systeem zitten.

Nu is mijn vraag, als ik een functie declareer als volgt:

function copyReference(&$var);

Moet ik dan ook als ik hem naar een variabele in de classe wil kopieeren dit doen

$this->ref = &$var

of can het gewoon zo

$this->ref = $var

Groetjes,

Marcel
Een normale variabele in PHP is $variable_name. Die & heeft een betekenis, maar ik weet niet precies wat het wil zeggen.

Ter vergelijking: als je @ ergens voorzet, wil het zeggen dat het script moet verder verwerken en fouten moet negeren. Zo kan je een fout in een if-then-else steken en als het fout gaat naar je else ofzo verwijzen.
& slaat op variabelen by reference.

in plaats van een waarde mee te geven aan de functie geef je een pointer mee. De variabele binnen de functie zal dan de zelfde zijn als de variabele buiten de functie.

Alles wat je binnen de functie verandert aan de variabele zal ook buiten de functie effect hebben.

Voorbeeldje:

<?

$i=5;
byRef(&$i);
echo $i; // geeft 6

function byRef(&$getal)
{
$getal++;
}

?>

tov.
<?

$i=5;
byRef($i);
echo $i; // geeft 5

function byRef($getal)
{
$getal++;
}

?>

@ Marcel: geen idee eigenlijk, maar ik zal het eens uitzoeken.


Bedankt voor de uitleg, maar eigenlijk wist ik al wat een reference (&) is. Een reference kopieerd het adres uit het geheugen van het object. Dit adres wordt weer vertaald in het object als je het gebruikt. Hierdoor werk je dus altijd met hetzelfde object ook al heeft het meerdere variabelen.

Bijvoorbeeld:

<?php
    $obj = new Object();
    $ref = &$obj;
   
?>


Nu verwijzen $obj en $ref naar hetzelfe object, dus als ik in een van de 2 objecten een interne variabele wijzig ziet het andere object het ook. En zo voorkom je oude waarden in objecten.

Jaja, het was vooral bedoeld op de de reactie boven mij.

Nu, objecten zijn altijd referenties.

<?
$a = new klasse();
$b = $a;
?>

$b zal geen kopie zijn van $a. Beide variabelen wijzen sowieso naar het zelfde object, dus in dit geval is de & niet nodig.
Voorbeeldje:

<?
$m_a = new klasse();

$m_b = $m_a ;
$m_b->a++;

echo $m_a->a;

class klasse
{
var $a;
function klasse()
{
$this->a = 5;
}
}
?>
Sinds PHP 5 zijn objecten intern eigenlijk resources, en objecten worden dus altijd by reference doorgegeven. Als je een kopie wilt hebben, moet je expliciet '$x = clone $object' gebruiken.

Bij 'function copyReference(&$var)' zal de $var binnen de functie verwijzen naar dat argument wat je hebt meegegeven. $var binnen de functie is dus gelijk aan de variabele die je als argument hebt meegegeven. Wil je die variabele aan een property in het object koppelen (en niet kopiƫren) en het is geen resource of object, dan zal je inderdaad nog een & moeten gebruiken:
<?php
$a = 1;

class Foo {

public $baz;

public function bar(&$var) {
$this->baz = &$var;
}
}

$foo = new Foo;

$foo->bar($a);

$a += 10;

echo $a;

echo "\n";

echo $foo->baz;
?>
hmm.... ik begrijp je punt, en anders gebruik ik gewoon singletons zodat hij altijd hetzelfde object terug geeft omdat er maar een aangemaakt kan worden.

Wat is het grote nut van references in php dan, is dat alleen dat een variabele buiten de functie dan gelijk is aan de variabele binnen de functie?

Oke ik begrijp nu hoe het werkt.
Dit is mijn situatie, ik heb een master object class hierin worden alle objecten geladen. Deze worden buiten de master object classe aangemaakt.

Hierdoor kunnen alle objecten onderling communiceren met de objecten die in het master object zijn geladen.

De objecten mogen buiten het master object ook worden aangepast, dus variabelen etc etc.

Het master object moet dan dus ook die aangepaste waarden hebben.


Is nu een reference nodig of niet?

Reageren