Objetos y referencias en PHP 7

Hay dos formas de pasar argumentos dentro del código:

  • Por referencia: Aquí es donde tanto la persona que llama como la persona que es llamada usan la misma variable para el argumento.
  • Por valor: aquí es donde tanto la persona que llama como la persona que es llamada tienen su propia copia de la variable para el argumento. Si la persona que llama decide cambiar el valor del argumento pasado, la persona que es llamada no lo notará.

Pasar argumentos por valor es el comportamiento predeterminado de PHP, como se muestra en el siguiente ejemplo:

<?php
class Util
{
function hello($msg)
{
$msg = "<p>Welcome $msg</p>";
return $msg;
}
}
$str = 'John';
$obj = new Util();
echo $obj->hello($str); // Welcome John
echo $str; // John

Al observar los aspectos internos del método hello(), podemos ver que está restableciendo el valor del argumento $msg a otro valor de cadena envuelto en etiquetas HTML. El PHP predeterminado pasado por el comportamiento del valor evita que este cambio se propague fuera del alcance de un método. Utilizando el operador & justo antes del nombre del argumento en la definición de la función, podemos forzar el comportamiento pasado por referencia:

<?php
class Util
{
function hello(&$msg)
{
$msg = "<p>Welcome $msg</p>";
return $msg;
}
}
$str = 'John';
$obj = new Util();
echo $obj->hello($str); // Welcome John
echo $str; // Welcome John

Ser capaz de hacer algo no significa necesariamente que debamos hacerlo. El comportamiento de pasar por referencia debe usarse con precaución, solo si hay una buena razón para hacerlo. El ejemplo anterior muestra claramente el efecto secundario del método interno hello() a un valor de tipo escalar simple dentro del alcance externo. Los métodos de instancia de objeto, o incluso las funciones simples, no deberían tener estos tipos de efectos secundarios en el ámbito externo.

Varias funciones de PHP, como sort(), utilizan el operador & para forzar el pasar por comportamiento de referencia en un argumento de matriz dado.

Dicho todo esto, ¿dónde encajan los objetos? Los objetos en PHP se inclinan hacia el comportamiento pasado por referencia. Cuando un objeto se pasa como argumento, todavía se pasa como un valor, pero el valor que se pasa no es el objeto en sí, es el identificador del objeto. Por lo tanto, el acto de pasar el objeto como argumento se siente más como si se estuviera pasando por referencia:

<?php
class User
{
public $salary = 4200;
}
function bonus(User $u)
{
$u->salary = $u->salary + 500;
}
$user = new User();
echo $user->salary; // 4200
bonus($user);
echo $user->salary; // 4700

Dado que los objetos son estructuras más grandes que los valores escalares, pasar por referencia minimiza en gran medida la memoria y la huella de la CPU.

Comparte