Pregunta

Estoy estudiando para la Certificación Zend PHP5, todo se ve bien, pero no puedo encontrar ejemplos del mundo real para pasar o devolver las variables mi referencia.

Sería muy bonito, si alguien tiene un ejemplo cuándo usar esto?

¿Fue útil?

Solución

Digamos que usted quiere escribir una función que elimina ciertos valores de una matriz.

function remove_elements($array, $item1, $item2, ...) {
  ...
}

Se puede copiar la matriz y devolverlo. Pero lo que si usted quiere saber si se eliminara cualquier cosa? En lugar de modificar la matriz in situ y devolver el número de elementos eliminados. Por lo tanto:

function remove_elements(&$array) {
  // remove elements
  return $number_removed;
}

Si crea una estructura compleja dentro de su función es posible que desee devolver una referencia a ella en lugar de una copia del mismo. Pero este es un caso bastante marginal debido a usos de PHP copy-on-write (es decir, no es copiado hasta que sea modificado), pero hay algunos casos de uso válido.

Al regresar por referencia tiene más sentido cuando se escribe una función miembro de una clase. Se podría devolver una referencia a un miembro de datos, pero esto también puede romper la encapsulación.

Por último, vale la pena señalar que todos los objetos se pasan por referencia y devueltos por defecto. Todo lo demás es pasado y regresó por valor.

Otros consejos

Pass por referencia: funciones como asort ()

$array = array(3, 2, 1);
asort($array);

Objetos en PHP5 se pasan por referencia por defecto. (Para una descripción correcta ver http://docs.php.net/language.oop5.references )

Paso de argumentos por referencia ya ha sido contestada ...

Como (mundo real) ejemplo para un valor de retorno por referencia recoger cualquier fluidez interfaz donde un método devuelve una referencia al mismo objeto que su propia llamada-contexto ($ this). Esto no funcionaría (como se esperaba) si el valor de retorno era una copia / clon.

por ejemplo.

class MyClass {  
  protected $foo = 'n/a';
  protected $bar = 'n/a';

  function foo($val) {
    $this->foo = (int)$val;
    return $this;
  }

  function bar($val) {
    $this->bar = (int)$val;
    return $this;
  }

  function __toString() {
    return 'foo='.$this->foo.' bar='.$this->bar;
  }
}

$o = new MyClass;
$o->foo(1)
  ->bar(2);
echo $o;

Esta impresora foo=1 bar=2 y yo creo que es el resultado era de esperar, no hay sorpresas aquí. Si el método devuelve $ presente en valor, que no funcionaría más. Se puede probar que al forzar php para devolver una copia. En lugar de la utilización de líneas return $this

return clone $this;

y la salida será

foo=1 bar=n/a

(y yo no lo llamaría esa interfaz intuitiva; -))

Podría ser útil, si se trabaja con chainig, como:

    public function addObject(array &$someData){
$newObj = Fabric::create($someData);
$this->listOfObj[] = $newObj;
return $newObj;
}

....
$this->addObj(array('idontknow' => 'anything'))->setName('mr.knowitall')->save();

... Sry. Igual que Volkers :( (La interfaz fluida es encadenamiento como sé que él).

imagen que tiene una interfaz fluida con un método de carga. La carga de la interfaz reemplazar o agrega algunos datos. Aquí podría ser útil para actuar con una llamada por $ éxito valor de referencia para determinar que la carga se ha realizado correctamente.

Vuelta por referencia: Tomar algunas bases de datos los objetos que tienen una lista de filas. La Nr. de puntos de filas de datos de derecho de todos los objetos (parallesl). Si devuelve el nr. y pasarlo al siguiente objeto, puede saltarse la fila en un objeto y saltar en los otros también. Siempre tener un montón valide de objetos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top