Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Comparando objetos

Estas en el tema de Comparando objetos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, antes que nada muchas gracias, Pasa que tengo un objeto dentro de la sesion, y este objeto a su vez tiene mas objetos como ...
  #1 (permalink)  
Antiguo 17/09/2008, 20:46
 
Fecha de Ingreso: julio-2008
Mensajes: 35
Antigüedad: 15 años, 9 meses
Puntos: 1
Comparando objetos

Hola, antes que nada muchas gracias,

Pasa que tengo un objeto dentro de la sesion, y este objeto a su vez tiene mas objetos como propiedades, lo que deseo saber, es si existe alguna funcion en php que me ayude a comparar si alguna instancia existente de algun objeto que haya generado, si encuentra dentro del objeto principal que tengo en la sesion y asi asignarle el valor.




Código:
class Persona
{
	public $datosPersonales;
	public $datosEconomicos;
	public $datosFamiliares;
	
	public function __construct()
	{
	$this->datosPersonales=new DatosPersonales();
	$this->datosEconomicos=new DatosEconomicos();
	$this->datosFamiliares=new DatosFamiliares();	
	}
	
	
}

//yo tengo  $_SESSION['persona']=new Persona;

//y genero un objeto aparte $datos=new DatosPersonales($nombre,$edad,$etc);

/*
existe alguna funcion predefinida para buscar mi objeto $datos en las 
 propiedades del objeto que tengo en $_SESSION['persona'] y asi poder asignarlo?
*/
Muchas gracias
  #2 (permalink)  
Antiguo 17/09/2008, 21:50
Avatar de emiliodeg  
Fecha de Ingreso: septiembre-2005
Ubicación: Córdoba
Mensajes: 1.830
Antigüedad: 18 años, 7 meses
Puntos: 55
Respuesta: Comparando objetos

bueno por un lado tienes get_object_vars() que te devuelve un array con las propiedades del objeto pasado y luego con instanceof puedes ver

puedes reviar tambien esto comparacion de objetos en php 5

saludos
__________________
Degiovanni Emilio
developtus.com
  #3 (permalink)  
Antiguo 17/09/2008, 22:36
 
Fecha de Ingreso: julio-2008
Mensajes: 35
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: Comparando objetos

Muchas gracias, dare una leida... ahorita cuento
  #4 (permalink)  
Antiguo 18/09/2008, 06:35
Avatar de anlhp  
Fecha de Ingreso: agosto-2008
Mensajes: 121
Antigüedad: 15 años, 8 meses
Puntos: 1
Busqueda Respuesta: Comparando objetos

pues mira, yo no me romperia la cabeza buscando un metodo que bla bla bla....., estas creando clases con metodos y que estas clases son reutilizables, estas a su vez seran utilizadas por desarrolladores no por usuarios, por ejemplo, espero que en tu aplicacion no le preguntes al usuario si quiere crear una instancia de DatosPersonales me explico? el que utilice tus clases tiene que saber que la propiedad datosPersonales es una referencia a una instancia de otra clase, en este caso y valga la redundancia: DatosPersonales, por lo que yo tu lo que haria, pues seria crear un metodo en mi clase Persona que me permita crear mi propiedad datosPersonales como una copia de otra objeto o mas logico segun lo veo yo, al ser un puntero, pues ponerlo a apuntar al objeto en cuestion pues dudo que quieras crear dos 'Persona' con los mismos 'DatosPersonales'.
aqui te dejo alguna migas:
Código HTML:
public function copyOverload($var_object, $as_copy = false){
 //puedes hacer que este metodo sirva como sobrecarga del operador de
 //asignacion para todas las propiedades, pero bueno, aqui es solo para
 //datosPersonales

if(is_object($var_object)){

if($var_object instanceof DatosPersonales){

if($as_copy){

//copiar el objeto

$this->datosPersonales = $var_object->__clone();

//tambien puedes sobrecargar __clone() en DatosPersonales para personalizar
//el duplicado, por ejemplo en el caso de utilizar una base de datos si quieres
//utilizar una nueva conexion separada a la base de datos o por el estilo

return 0
}
else{
//apuntar al nuevo objeto

$this->datosPersonales = $var_object;

return 0

}

}

return -1
}


  #5 (permalink)  
Antiguo 18/09/2008, 11:47
 
Fecha de Ingreso: julio-2008
Mensajes: 35
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: Comparando objetos

anlhp Muchas gracias, me sacaste de el trance funciono!!
  #6 (permalink)  
Antiguo 18/09/2008, 14:10
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Comparando objetos

ojo, en php no existen "punteros", pero si referencias :B
__________________
Blog | Tecnosquad
  #7 (permalink)  
Antiguo 18/09/2008, 14:39
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Comparando objetos

Ojo 2, ya las referencias (en objetos) estan deprecated, ya que ahora todos los objetos se pasan por valor siempre, y no es necesario pasar la referencia, solamente si necesitamos la copia debemos de usar el operador clone.

Saludos.
  #8 (permalink)  
Antiguo 19/09/2008, 03:15
Avatar de anlhp  
Fecha de Ingreso: agosto-2008
Mensajes: 121
Antigüedad: 15 años, 8 meses
Puntos: 1
Respuesta: Comparando objetos

si si, se que es una referencia y todo eso pero me gusta referirme a veces como a punteros, no se, en mi caso me despeja bastante sobre que pasa a nivel de bastidores, no se, igual que en JavaScript por ejemplo que 'no existen' las clases, sino que ECMA-262 utiliza definiciones de objetos ya que las 'clases' son objetos en si mismos pero uno sigue utilizando 'clases' porque en su momento exclarece,pero bueno, es bueno que lo digas porque uno que no este muy al tanto puede llevarse un mal concepto asi que gracias ;)

GatorV una preguntita sobre lo que dices, los objetos se pasan a una funcion por valor o por referencia??? pues hasta ahora lo que mas sentido tiene para mi es que por defecto el objeto se pasa por referencia de manera predeterminada y ya luego si lo que quieres es una copia, pues eso, utilizar __clone()
????? :/
  #9 (permalink)  
Antiguo 19/09/2008, 08:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Comparando objetos

Segun el manual los objetos se pasan por referencia, que es la copia directa del objeto lo que se pasa por ejemplo:
Código php:
Ver original
  1. function setProperty($aObj) {
  2.        $aObj->foo = "bar";
  3. }
  4.  
  5. $myObj = new stdClass();
  6. setProperty($myObj);
  7. echo $myObj->foo; // imprime bar

Saludos.
  #10 (permalink)  
Antiguo 19/09/2008, 09:57
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: Comparando objetos

"Todos los objetos se pasan siempre por referencia" no por valor, eso es el resto de las variables.

Sé que fue un error
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #11 (permalink)  
Antiguo 19/09/2008, 18:33
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
Respuesta: Comparando objetos

Yo creo que el manual es un poco confuso en cuanto a cómo funcionan las referencias, y en especial cuando dice que los objetos se pasan por referencia.

Yo no diría que una instancia de un objeto se pasa por referencia, sino que la referencia a un objeto se pasa por valor. Parece un juego de palabras, pero para mí hay una diferencia que se puede ver más claramente con un ejemplo.

Código PHP:
function modificarProp($p_obj) {
    
$p_obj->foo "bar";
}

$obj = new stdClass();
$obj->foo "foo";
modificarProp($obj);
echo 
$obj->foo// imprime "bar" 
Hasta ahí, nada raro. Pero:

Código PHP:
function modificarProp($p_obj) {
    
$p_obj = new stdClass();
    
$p_obj->foo "bar";
}

$obj = new stdClass();
$obj->foo "foo";
modificarProp($obj);
echo 
$obj->foo// imprime "foo", no "bar" 
Si los objetos se pasaran realmente por referencia, debería imprimir "bar" y no "foo".

Yo diría entonces que una referencia es un "vínculo" a un objeto. Ese vínculo o referencia se puede guardar en una variable. De-referenciando ese vínculo, se puede acceder al contenido del objeto y modificarlo, pero lo que se pasa como argumento a una función es el valor de ese vínculo. Ese valor está contenido en una variable local, con la cual se pueden hacer básicamente 2 cosas:

1) De-refenciarlo (o sea, usar la sintaxis "->") para acceder a alguna propiedad del objeto original.
2) Asignar una nueva referencia o "vínculo" a esa variable local, con lo cual el objeto orignal no se modifica. Simplemente, perdemos el vínculo.

En esto creo que Php es igual muchos otros lenguajes, como Java, Actionscript, Javascript, Python, etc (por nombrar algunos que conozco en alguna medida). Pero, además, Php permite pasar referencias por referencias, usando el operador "&" (como se puede hacer en C# con "ref" y en C con punteros a punteros; dicho sea de paso, el manual se encarga de aclarar que las referencias no son para nada como los punteros en C, y si bien un puntero es una dirección de memoria y un referencia en php, no, en la mayoría de los casos -- o al menos en los ejemplos que siguen -- la "semántica" es la misma).

Ejemplos de paso de referencias por valor y por referencia.

Código PHP:
function referenciaPasadaPorValor($obj1,$obj2) {
    
$obj1 = new stdClass();
    
$obj1->foo "bar";
    
    
$obj2->foo "bar";
}

function 
referenciaPasadaPorReferencia(&$obj1,&$obj2) {
    
$obj1 = new stdClass();
    
$obj1->foo "bar";
    
    
$obj2->foo "bar";
}

$obj1 = new stdClass();
$obj2 = new stdClass();
$obj1->foo "foo";
$obj2->foo "foo";

referenciaPasadaPorValor($obj1,$obj2);
echo 
'$obj1->foo : ' $obj1->foo '<br>'// imprime foo
echo '$obj2->foo : ' $obj2->foo '<br>'// imprime bar



$obj1 = new stdClass();
$obj2 = new stdClass();
$obj1->foo "foo";
$obj2->foo "foo";
referenciaPasadaPorReferencia($obj1,$obj2);
echo 
'$obj1->foo : ' $obj1->foo '<br>'// imprime bar
echo '$obj2->foo : ' $obj2->foo '<br>'// imprime bar 

Saludos
Juan Pablo Califano
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:27.