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

PHP OO Problema con POO, objeto por referencia

Estas en el tema de Problema con POO, objeto por referencia en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola amigos, hace tiempo que solo leo y necesitaba de vuestras prodigiosas cabecitas jeje... Cuento: Tengo un archivo smanager que utilizo para administrar objetos... el ...
  #1 (permalink)  
Antiguo 16/06/2012, 08:25
 
Fecha de Ingreso: diciembre-2007
Mensajes: 14
Antigüedad: 16 años, 4 meses
Puntos: 0
Problema con POO, objeto por referencia

Hola amigos, hace tiempo que solo leo y necesitaba de vuestras prodigiosas cabecitas jeje... Cuento:

Tengo un archivo smanager que utilizo para administrar objetos... el código es el siguiente:

Código PHP:
<?php
// Clases nativas del motor

include_once("clases/main.php");

include_once(
"clases/mysql.php");

include_once(
"clases/user.php");



// creamos a reanudamos la session actual

session_start();



// Recuperación de la clase del onjeto

ini_set('unserialize_callback_func''rClase');

function 
rClase($r) {

   switch (
$r) {

       case 
'Main':

          include_once(
"clases/main.php");

            break;

      case 
'User':

          include_once(
"clases/user.php");

            break;

       case 
'MySQL':

            include_once(
"clases/mysql.php");

            break;

        default:

            echo 
"#smanager.php - 'Respuesta ".$r."'.";

    }

}



// Instancias y recuperación de sessiones



if (!isset($_SESSION['Me'])) {

    
$Me = new Me();

    
$_SESSION['Me'] = serialize($Me);

} else { 
$Me unserialize($_SESSION['Me']); }



if (!isset(
$_SESSION['MySQL'])) {

    
$MySQL = new MySQL();

    
$_SESSION['MySQL'] = serialize($MySQL);

} else { 
$MySQL unserialize($_SESSION['MySQL']); }



if (!isset(
$_SESSION['User'])) {

    
$User = new User($MySQL);

    
$_SESSION['User'] = serialize($User);

} else { 
$User unserialize($_SESSION['User']); }



?>
Crea/almacena y recupera perfectamente los objetos, almacenando tan solo un string en la variable tipo session para no entorpecer demasiado la memoria del servidor. El problema se produce cuando intento lanzar el constructor de la clase USER, este necesita el objeto MySQL para actualizar la información sobre su visita en la DB.

He intentado enviar directamente el obj al constructor con la finalidad de crear una referencia a el dentro de una variable perteneciente al nuevo objeto, pero no consigo resultados.

Muestro la clase user.php
Código PHP:
class User {

    
//Control

   
public $Ready false;

   private 
$MySQL;

   public 
$isOnline false;

    

    
//User info

    
public $id = -1;

    public 
$ip;

    public 
$userid = -1;

    public 
$tiempo;

    public 
$provincia = -1;

    public 
$municipio = -1;

    

    public 
$mail;

    public 
$user;

     

    
// -- Constructor

   
function __construct($dbObject) {

       
$this->MySQL $bdObject;

        
$this->Ready $this->LoadSession(); //Lanza LoadSession

   
}

    

    
// -- LoadSession (LoadSession) : Inicia el usuario

    
private function LoadSession() {

        echo 
"MySQL: ".$This->MySQL->Ready;

        return 
true;

    }

    


La idea es no almacenar otro objeto entero en la session si no utilzar el mismo objeto MySQL para todo el trabajo.

La respuesta del servidor es:

Ninguna, tendría que devolver el valor bool de Ready, (0 o 1), devuelve el valor en blanco.

Estoy trabajando con PHP5.

**EDITO> Parece ser que en php5 (yo anteriormente use una version 4.x) una de sus muchas modificaciones a sido redise;ar el sistema oo, cosa que no ha venido nada mal xP, al parecer ahora los objetos se trabajan con ref., es mas, creo que a partir de php 5.3 al utilizar el operador & imprime un WARNING. He modificado el codigo eliminando dicho operador pero no consigo resultado.

Gracias de antemano.

PD> El codigo ya fue modificado en la parte principal

Gracias de ante mano, un saludo!!

Última edición por davidpv92; 16/06/2012 a las 09:16
  #2 (permalink)  
Antiguo 16/06/2012, 22:40
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema con POO, objeto por referencia

Creo que lo que estas haciendo no es del todo correcto, no se si sepas pero PHP no puede serializar todo, en concreto, tu clase MySQL al serializarla no estas ganando nada ya que la conexión como tal se cierra, aunque la serializes, es un tipo de dato recurso que PHP va a cerrar.

Sí deseas continuar con lo que haces, lo mejor es que uses los métodos que tiene PHP __sleep y __wakeup para guardar y volver a "levantar" el objeto para que este listo.

http://www.php.net/manual/en/languag...p#object.sleep

Saludos.
  #3 (permalink)  
Antiguo 17/06/2012, 06:07
 
Fecha de Ingreso: diciembre-2007
Mensajes: 14
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Problema con POO, objeto por referencia

Cita:
Creo que lo que estas haciendo no es del todo correcto, no se si sepas pero PHP no puede serializar todo, en concreto, tu clase MySQL al serializarla no estas ganando nada ya que la conexión como tal se cierra, aunque la serializes, es un tipo de dato recurso que PHP va a cerrar.

Sí deseas continuar con lo que haces, lo mejor es que uses los métodos que tiene PHP __sleep y __wakeup para guardar y volver a "levantar" el objeto para que este listo.
Gracias de antemano GastorV, te cuento.

La llamadas mágicas __sleep and __wakeup entan definidas en la clase MySQL que actualmente no esta posteado en el hilo, de todas formas es algo que aun esta sin probar, ya que la idea de serializar los objetos es conseguir acceso a ellos de forma fácil incluso desde un recurso ajax y aun no he podido verificar nada. De todas formas coloco el código y lo comento por si hubiera algún error o algún fallo de entendimiento por mi parte.

La funcion _SLEEP no la utilio, ya que lo serializo nada mas crearla y toque lo que toque desde sleep me cargo algo jeje...

_wakeup() la utilizo para reanimar la conecxión. Ya que entiendo que serialize almacena en el string valores almacenabes, pero intutia que la conecxión probablemente me fuera a dar problemas, asique ya añadi este metodo magico en la declaración de mi clase.

Te dejo el código
Código PHP:
<?php 

class MySQL{

    
//General

    
public  $Ready false;

   protected 
$conexion

    private 
$total_consultas;

    

    
//Config

    
private $servidor '***';

    private 
$usuario '***';

    private 
$contrasena '***';

    private 
$nombrebd '***';

    

  

      public function 
__construct(){

        if(!isset(
$this->conexion)){

            
$this->Ready $this->conectar();

        }

      }



    private function 
conectar(){

        
$this->conexion = (mysql_connect($this->servidor,$this->usuario,$this->contrasena))                

        or die(
mysql_error());

      if (
mysql_select_db($this->nombrebd,$this->conexion))

      {return 
true;} else {return false;}

    }

    

    public function 
__wakeup()

   { 

            
$this->Ready $this->conectar();

   }



      public function 
consulta($consulta){ 

        
$this->total_consultas++; 

        
$resultado mysql_query($consulta,$this->conexion);

        if(!
$resultado){ 

              echo 
'MySQL Error: ' mysql_error();

              exit;

        }

        return 
$resultado;

      }
.
.
.
}

Pero el problema esta en que no puedo referenciar $user->MySQL con el objeto global mysql.


Agradecería cualquier rayo de luz. Un abrazo

Última edición por davidpv92; 17/06/2012 a las 06:30
  #4 (permalink)  
Antiguo 17/06/2012, 06:48
 
Fecha de Ingreso: diciembre-2007
Mensajes: 14
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Problema con POO, objeto por referencia

SOLUCIONADO!!

A falta de seguir revisando un poco el motor, aparentemente funciona. He utilizado:

$this->MySQL = $GLOBALS["MySQL"];

No me pregunten por que no funcionaba anteriormente, creo que es muy parecido su funcionamiento al código anterior solo que de esta forma parece si referenciarlo.

Cualquier cosa más les digo. Muchas gracias!!

Etiquetas: class, objeto, php, poo, referencia
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 07:05.