PHP reference

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Cyberboy fdsafds

Cyberboy fdsafds

03/07/2008 11:24:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
function copyReference(&$var);

Moet ik dan ook als ik hem naar een variabele in de classe wil kopieeren dit doen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$this->ref = &$var

of can het gewoon zo
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$this->ref = $var

Groetjes,

Marcel
Gewijzigd op 01/01/1970 01:00:00 door Cyberboy fdsafds
 
PHP hulp

PHP hulp

26/04/2024 22:10:55
 
Armaron

Armaron

03/07/2008 12:10:00
Quote Anchor link
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.
 
Emmanuel Delay

Emmanuel Delay

03/07/2008 12:35:00
Quote Anchor link
& 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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?

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

function byRef(&$getal)
{

$getal++;
}


?>


tov.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?

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

function byRef($getal)
{

$getal++;
}


?>


@ Marcel: geen idee eigenlijk, maar ik zal het eens uitzoeken.
Gewijzigd op 01/01/1970 01:00:00 door Emmanuel Delay
 
Cyberboy fdsafds

Cyberboy fdsafds

03/07/2008 12:38:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?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.
 
Emmanuel Delay

Emmanuel Delay

03/07/2008 12:41:00
Quote Anchor link
Jaja, het was vooral bedoeld op de de reactie boven mij.

Nu, objecten zijn altijd referenties.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
$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.
 
Emmanuel Delay

Emmanuel Delay

03/07/2008 12:47:00
Quote Anchor link
Voorbeeldje:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
$m_a
= new klasse();

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

echo $m_a->a;

class klasse
{
var
$a;
function
klasse()
  {

  $this->a = 5;
  }
}

?>
 
Jelmer -

Jelmer -

03/07/2008 12:47:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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;
?>
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
 
Cyberboy fdsafds

Cyberboy fdsafds

03/07/2008 12:47:00
Quote Anchor link
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?
 
Cyberboy fdsafds

Cyberboy fdsafds

03/07/2008 12:56:00
Quote Anchor link
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?
 
Emmanuel Delay

Emmanuel Delay

03/07/2008 12:57:00
Quote Anchor link
Kijk bv eens naar str_replace.

http://be.php.net/str_replace

Als je een 4e parameter zet, krijg je een count weer.

Er zullen nog wel betere voorbeelden zijn.
Gewijzigd op 01/01/1970 01:00:00 door Emmanuel Delay
 
Emmanuel Delay

Emmanuel Delay

03/07/2008 14:12:00
Quote Anchor link
Hier vind je trouwens een uitleg over references

http://be2.php.net/references
 
Jelmer -

Jelmer -

03/07/2008 14:22:00
Quote Anchor link
En nog eentje die gaat over references & objecten in PHP:
http://blog.libssh2.org/index.php?/archives/51-Youre-being-lied-to..html
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.