property in functie
Als ik een class property toeken aan een variabele binnen een functie, is die variabele dan een verwijzing naar die property, of is het echt een kopie daarvan?
Code (php)
In bovengenoemd voorbeeld... is in de method bar() de variabele $bar een verwijzing naar de class property $bar of is het een kopie daarvan?
- De = operator werkt normaal 'by value'. De waarde van $this->bar wordt in dit geval dus overgenomen in $bar.
- De = operator met een object/class werkt 'by reference'. Beide variabele verwijzen dus naar hetzelfde object.
- Met =& operator kun je ipv een 'by value' een 'by reference' methode gebruiken voor elke type.
Dus als de propert $bar een class/object zou zijn, dan is de variabele $bar een referentie naar die class? Klopt dat?
En als ik dit zou doen:
$bar =& $this->bar;
$bar->foo();
is dat dan exact hetzelfde als dit?
$this->bar->foo();
Wanneer gebruik je eigenlijk =& ? In welke situaties?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
class A
{
private $a;
private $_isClass;
public function __construct($a, $class = false)
{
$this->a = $a;
$this->_isClass = $class;
}
public function __toString()
{
$a = $this->a;
$this->performAction();
return 'A{var} = '.$a.'<br>A{prop} = '.$this->a;
}
public function preformAction()
{
if ($this->_isClass) {
$this->a->foo = 'bar';
} else {
$this->a = 'bar';
}
}
}
$a = new A('foo');
echo $a;
/**
* Outputs
*
A{var} = 'foo'
A{prop} = 'bar'
*
*/
$std = new \StdClass();
$std->foo = 'foo';
$a = new A($std, true);
echo $a;
/**
* Outputs
*
A{var} = StdClass( foo = 'bar' )
A{prop} = StdClass( foo = 'bar' )
*
*/
?>
class A
{
private $a;
private $_isClass;
public function __construct($a, $class = false)
{
$this->a = $a;
$this->_isClass = $class;
}
public function __toString()
{
$a = $this->a;
$this->performAction();
return 'A{var} = '.$a.'<br>A{prop} = '.$this->a;
}
public function preformAction()
{
if ($this->_isClass) {
$this->a->foo = 'bar';
} else {
$this->a = 'bar';
}
}
}
$a = new A('foo');
echo $a;
/**
* Outputs
*
A{var} = 'foo'
A{prop} = 'bar'
*
*/
$std = new \StdClass();
$std->foo = 'foo';
$a = new A($std, true);
echo $a;
/**
* Outputs
*
A{var} = StdClass( foo = 'bar' )
A{prop} = StdClass( foo = 'bar' )
*
*/
?>
Als je regel 14 zou vervangen door $a =& $this->a krijg je ook bij strings een reference (dus de output wordt dan bij beide gelijk)
Hmmm, oké. Maar nu vraag ik me nog steeds af wanneer je =& in de praktijk zou moeten gebruiken? Ik ben het zover ik me kan herinneren nooit tegengekomen. Gebruik jij het zelf wel eens?
Nee :)
Nou ja, ben in ieder geval weer wat wijzer, thanks ;)