Sunday, August 19, 2012

References’ basis in PHP

The first step is to answer the following question: What are references? In PHP references are a way to access to the content of a variable by others names. We will briefly cover the three different kind of references available in PHP.

1. References as a function’s parameter


By default, PHP handle the variables you send to a function locally, what I mean is what is in the function stay in the function. By passing a reference you will make your local function variable referencing to the variable in the calling scope of your application. Here is a short example with and without references.


<?php
/**
* Using references
*/
function foo(&$var){
$var++;
}
$a=5;
foo($a);
echo($a); //Will display 6
?>





<?php
/**
* Without references
*/
function foo($var){
return $var++;
}
$a=5;
$a=foo($a);
echo($a); //will display 6
?>



2. Return by references


Another case is to return a reference. But you have to be very careful with this one because with some tricky code you can access to the private attributes of a class and indeed modify their values.
Here is a classic use of a return reference:


<?php
class Personne {
public $age = 22;

public function &getAge() {
return $this->age;
}
}

$obj = new Personne();
$myAge = &$obj->getAge(); //$myAge is a reference to $obj->age, which is 22.
$obj->age = 18;
echo $myAge; //will display 18
?>



And now we will see that we can modify a private attribute by using a return reference:


<?php
class Personne {
private $age = 22;

public function &getAge() {
return $this->age;
}
public function __toString(){
return $this->age;
}
}

$obj = new Personne();
$myAge = &$obj->getAge();
$myAge = 897; //the private attribute $age has been modified
echo($obj); //unfortunately it will display 897
?>



3. Assign by references


The last case and the easiest is the assignment. It is done just like that:


<?php
$a =& $b;
?>



Which means that $a and $b reference to the same content.

In conclusion, references might seems pretty useless with these examples but it is actually wise to use some of them when you are working on a complex software architecture with a lot of objects using others objects. It is also nicer to avoid the $var=foo($var).

No comments:

Post a Comment