tags:

views:

157

answers:

4

I realize this is a very basic question but I don't even really know what to search for to find out about it.

$smarty =& SESmarty::getInstance();

What is the & for in the above?

+12  A: 

It passes by reference. Meaning that it won't create a copy of the value passed.

See: http://php.net/manual/en/language.references.php (See Adam's Answer)

Usually, if you pass something like this:

$a = 5;
$b = $a;
$b = 3;

echo $a; // 5
echo $b; // 3

The original variable ($a) won't be modified if you change the second variable ($b) . If you pass by reference:

$a = 5;
$b =& $a;
$b = 3;

echo $a; // 3
echo $b; // 3

The original is changed as well.

Which is useless when passing around objects, because they will be passed by reference by default.

Chacha102
PHP5 objects are *not* passed by reference by default: rather, an object identifier is passed by value (similar to Java's 'reference' semantics); see the manual for details: http://www.php.net/manual/en/language.oop5.references.php
Christoph
Thanks, seems kind of pointless to me right now
jasondavis
It really is kind of pointless. The main reason people used them was to not require a function to return a variable, but instead just have to modify the variable.
Chacha102
@Chacha102 and @jasondavis References are ABSOLUTELY not pointless. They are invaluable. Perhaps they are not always useful when working with primitives, but they are incredibly useful when working with ANY OOP -- including basic arrays.
Christopher W. Allen-Poole
Oh, and they make the Singleton POSSIBLE.
Christopher W. Allen-Poole
And the Singleton is ... say it with me.... A bad idea! yay!
Chacha102
+2  A: 

In addition to what Chacha102 said, from the manual:

References in PHP are a means to access the same variable content by different names.

The manual section is at http://php.net/manual/en/language.references.php

adam
Not downvoting, but this should be a comment on Chacha102's answer.
Jonathan Sampson
I originally had duplicated what Chacha said, but when his popped up I didn't want to steal it.
adam
+2  A: 

In PHP4, it kind of (awkwardly) associated two variables.

$j = 'original';
$i =& $j;
$i = 'modified';
echo $j; // output is 'modified'

Likewise...

$j = 'original';
$i =& $j;
$j = 'modified';
echo $i; // output is 'modified'

Some of this was made a little less unpleasant when it comes to objects in PHP5, but I think the heart of it is the same, so these examples should still be valid.

LeguRi
+1  A: 

References are used to alias variables and were necessary to use the old object system efficiently.

In PHP4, objects behaved like any other value type, ie assignment would create a copy of the object. If you wanted to avoid this, you had to use a reference as in your example code.

With PHP5, object variables no longer contain the object itself, but a handle (aka object identifier) and assignment will only copy the handle. Using a reference is no longer necessary.

Christoph