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

instancias de clases pasadas por referencia

Estas en el tema de instancias de clases pasadas por referencia en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos, estoy intentando hacer una aplicación con programación orientada a objetos y tengo un error que no entiendo, y que me está desquiciando ...
  #1 (permalink)  
Antiguo 26/04/2006, 17:06
Avatar de nosoynadie  
Fecha de Ingreso: noviembre-2005
Ubicación: dando vueltas por aquí
Mensajes: 206
Antigüedad: 18 años, 5 meses
Puntos: 1
instancias de clases pasadas por referencia

Hola a todos,

estoy intentando hacer una aplicación con programación orientada a objetos y tengo un error que no entiendo, y que me está desquiciando

La aplicación genera informes sobre libros de una editorial. Para el proceso disponemos de una clase de conexión a la base de datos, clase conn, y otra para generar los informes, clase report. En medio del proceso tengo que comprobar que el título insertado no tiene ya un informe generado, así que creo una instancia de report, llamada $rpt, y comprobamos el título, con %rpt->checkTitulo().

Pues bien, el proceso se realiza casi correctamente en un servidor WindowsXP + MySQL 4.0.25-nt + PHP 5.0.5 (instalación estandard) PERO no puedo decir lo mismo cuando lo publico en un servidor Linux + MySQL 4.0.25-standard + PHP 4.4.2. En este último caso, cuando estoy comprobando el nombre de un nuevo libro 'parece colgarse' cuando tiene que hacer la conexión a la base de datos, línea
Código:
$res = $this->conec->query($sql);
¿Por que puede ser esta diferencia? Está bien lo de intentar guardar en la propiedad de la clase, $conec, una instancia de la clase de conexión?
Código:
$this->conec = &new conn;
¿se debe hacer por valor o por referencia? La parte del fichero donde uso las clases es:
Código:
	$rpt = new report();
	// comprobamos el título
	if(!$tmp = $rpt->checkTitulo($_POST["tit"]))
		$extra = "?ch=0";
El comienzo de la clase report() es:

Código:
class report{
	var $Id = 0;
	var $detail = false;
	var $Arr_error = array();
	var $conec = "";
	var $Debug;
	
	
	function report($id=""){
		require_once("conn.php");
		$this->conec = &new conn;
	}
	
	function checkTitulo($tit){
		if(!empty($tit)){
			$sql = "SELECT idp FROM libros WHERE titulo = '".$tit."' LIMIT 0,1";
			$res = $this->conec->query($sql);
			if($this->conec->NumeroReg($res)>0){
				$row = $this->conec->fetch($res);
				return $row["idPaginas"];
			}
			else
				return false;
		}
		else
			return false;
	}
}
Parte del código de la clase conexión es:
Código:
class conn{
	  var $Servidor="el_que_sea";
	  var $Login="el_que_sea"
	  var $Pass="el_que_sea";
	  var $Basedatos="el_que_sea";
	  var $Deb;
	  var $conex;

	function conn(){
	    if ( $this->$conex = @mysql_connect($this->Servidor,$this->Login,$this->Pass) )
	    {
			if(!@mysql_select_db($this->Basedatos,$this->Cnx) )
	        {
				$this->Deb = "error al seleccionar la Base de Datos<br />";
				$this->Error();
	        }
	    }
	    else
	    {
			$this->Deb = "Imposible conectarse a MySQL <br />";
			$this->Error();
	    }
	}
	function query($Sql){
	    If ( $res = @mysql_query($Sql, $this->Cnx) ){
			return $res;
	    }
	    Else{
			$this->Deb .= "<strong>PROBLEMA</strong>:(".@mysql_errno($this->Cnx).")<br />".@MySQL_error($this->Cnx)."<br />";
			$this->Error();
	    }
	}
	function Error(){
		// actuamos en consecuencia
	}
Muchas gracias por la ayuda y siento que me haya quedado tan largo el post
__________________
http://www.nosoynadie.net/
  #2 (permalink)  
Antiguo 26/04/2006, 18:23
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Voy a darte una respuesta rápida primero (así sales del paso) y luego de que lea con tiempo los fuentes veo si te puedo mandar alguna sugerencia.

1) PHP4 y PHP5, soy *muy* diferentes en lo que concierne a Orientación a Objetos. PHP4 todo se pasa siempre por "valor", mientras que con objetos desde PHP5 son todos por "referencia".

2) Si mal no recuerdo (me voy a fijar en el manual) anidar invocaciones del estilo $a->metodoA()->metodoB() se soporta en PHP5 y no en PHP4.

En resumen, creo que el problema está ahí. Los invito a pasar por el sitio de la documentación oficial donde se habla de las diferencias entre versiones 4 y 5.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #3 (permalink)  
Antiguo 27/04/2006, 03:52
Avatar de nosoynadie  
Fecha de Ingreso: noviembre-2005
Ubicación: dando vueltas por aquí
Mensajes: 206
Antigüedad: 18 años, 5 meses
Puntos: 1
Gracias enriqueplace,
ayer, cuando escribía el post, pensé en la posible diferencia entre php4 y php5. Miro lo que me dices a ver que sucede y ya te cuento mil gracias
__________________
http://www.nosoynadie.net/
  #4 (permalink)  
Antiguo 27/04/2006, 10:56
Avatar de nosoynadie  
Fecha de Ingreso: noviembre-2005
Ubicación: dando vueltas por aquí
Mensajes: 206
Antigüedad: 18 años, 5 meses
Puntos: 1
Os replanteo mejor el problema aquí: http://www.forosdelweb.com/f68/instancias-clases-pasadas-por-referencia-389090/

Gracias por la ayuda
__________________
http://www.nosoynadie.net/
  #5 (permalink)  
Antiguo 29/04/2006, 08:57
Avatar de sism82  
Fecha de Ingreso: octubre-2003
Ubicación: Guadalajara
Mensajes: 865
Antigüedad: 20 años, 6 meses
Puntos: 1
Cita:
Iniciado por enriqueplace
PHP4 todo se pasa siempre por "valor", mientras que con objetos desde PHP5 son todos por "referencia".
Me agrada usar terminos claros. Me gustaria conocer tu opinion al respecto de esto:

http://www.yoda.arachsys.com/java/passing.html

PHP5 es similar (si no identico) a Java en el aspecto mencionado en la liga anterior.

Que piensas?

En sintesis, cual es la forma correcta de decirlo?

Me parece que los objetos ciertamente nunca son pasados. Se pasa una C O P I A de la referencia, por lo tanto el termino deberia ser acaso pasar por valor? Mi opinion es que si.
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 00:48.