Parece que en PHP los objetos se pasan por referencia. Incluso los operadores de asignación no parecen estar creando una copia del objeto.
Aquí hay una prueba simple y artificial:
<?php
class A {
public $b;
}
function set_b($obj) { $obj->b = "after"; }
$a = new A();
$a->b = "before";
$c = $a; //i would especially expect this to create a copy.
set_b($a);
print $a->b; //i would expect this to show 'before'
print $c->b; //i would ESPECIALLY expect this to show 'before'
?>
En ambos casos impresos me sale 'after'
Entonces, ¿cómo paso $ a a set_b () por valor, no por referencia?
php
copy
clone
shallow-copy
Nick Stinemates
fuente
fuente
(object) ((array) $objectA)
podría obtener los mismos resultados deseados con un mejor rendimiento que usarclone $objectA
onew stdClass
.Respuestas:
En PHP 5+ los objetos se pasan por referencia. En PHP 4 se pasan por valor (es por eso que tenía tiempo de ejecución por referencia, que quedó obsoleto).
Puede usar el operador 'clonar' en PHP5 para copiar objetos:
Además, son solo objetos que se pasan por referencia, no todo como has dicho en tu pregunta ...
fuente
$a = new stdClass; $b =& $a; $a = 42; var_export($b);
aquí$b
hay una referencia a la variable$a
; si se reemplaza=&
con un normales=
, es no una referencia, y aún apunta al objeto original.Las respuestas se encuentran comúnmente en los libros de Java.
clonación: si no anula el método de clonación, el comportamiento predeterminado es una copia superficial. Si sus objetos solo tienen variables miembro primitivas, está totalmente bien. Pero en un lenguaje sin tipo con otro objeto como variables miembro, es un dolor de cabeza.
serialización / deserialización
$new_object = unserialize(serialize($your_object))
Esto logra una copia profunda con un alto costo dependiendo de la complejidad del objeto.
fuente
$a = clone $b
sin__clone()
métodos mágicos en juego) es equivalente a mirar cada una de las propiedades del objeto$b
en términos y asignar a la misma propiedad en un nuevo miembro de la misma clase, usando=
. Las propiedades que son objetos no obtendránclone
d, ni los objetos dentro de una matriz; lo mismo ocurre con las variables vinculadas por referencia; todo lo demás es solo un valor, y se copia como con cualquier tarea.Call to method __clone from invalid context
:)$new_date = (clone $date_start)->subDays(1);
falla con el()
, si los elimino me sale un error diferente. La cuestión es que usamos exactamente el mismo php 7.2.3 y el mío funciona bien. ¿Algunas ideas? Buscado en todas partes ..Según el comentario anterior, si tiene otro objeto como variable miembro, haga lo siguiente:
Ahora puedes hacer clonación:
fuente
De acuerdo con los documentos ( http://ca3.php.net/language.oop5.cloning ):
fuente
Solo para aclarar que PHP usa copia al escribir, por lo que básicamente todo es una referencia hasta que lo modifique, pero para los objetos debe usar clone y el método mágico __clone () como en la respuesta aceptada.
fuente
Este código ayuda a clonar métodos
fuente
Estaba haciendo algunas pruebas y obtuve esto:
fuente
En este ejemplo crearemos una clase de iPhone y haremos una copia exacta de ella clonando
fuente
Si desea copiar completamente las propiedades de un objeto en una instancia diferente, puede utilizar esta técnica:
Serialízalo a JSON y luego desconéctalo a Object.
fuente