25
votes

Consider:

$smarty =& SESmarty::getInstance();

What is the & for?

3
If you need something like this in the future search for "operators" in the PHP help references, or a good search engine.Mark Cooper
You should also look up something called "Singleton".cwallenpoole
=& is not "a thing" -- it is two things that should not be smooshed together. See the explanation in this post for the reasons that you should not be writing =&: stackoverflow.com/a/63914758/2943403mickmackusa

3 Answers

38
votes

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.

7
votes

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

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

Likewise...

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

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

1
votes

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

In PHP 4, objects behaved like any other value type, that is, 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 PHP 5, 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.