Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/08/2010, 19:52
Avatar de bng5
bng5
 
Fecha de Ingreso: junio-2009
Ubicación: 127.0.0.1
Mensajes: 269
Antigüedad: 15 años, 5 meses
Puntos: 24
Problemas con empty al evaluar respuesta de __get

Me pasó algo que considero un poco extraño, lo comparto. Quizás a alguien le sirva o pueda explicar que es exactamente lo que pasó.

Tengo una clase llamada Sesion, es poco más que una envoltura para el array $_SESSION.
Implementa un patron singleton. Utilizo el método instancia que me devuelve, por supuesto, un objeto del tipo Sesion.

Parte del código de Sesion.
Código PHP:
class Sesion {

    private function 
__construct() {
        
// bla bla
    
}

    public static function 
instancia() {
        if (!isset(
self::$_instancia)) {
            
self::$_instancia = new self;
        }
        return 
self::$_instancia;
    }

    public function 
__get($clave) {
        return 
$_SESSION[$clave];
    }

Todo funciona bien con esta clase, si hago un var_dump de un atributo funciona perfecto.
Código PHP:
var_dump(Sesion::instancia()->usuario);
// Devuelve "string 'nombreDeUsuario'" 
Pero si quiero comprobar si el atributo no está vacío de la siguiente manera no funciona.

Código PHP:
    if(!empty(Sesion::instancia()->usuario)) {
        
// nunca entra en esta condición
        // como si Sesion::instancia()->usuario estuviese vacío 
        // cuando en realidad no es así
    

Esta es la solución que encontré: cargandolo en una variable.

Código PHP:

$usuarioStr 
Sesion::instancia()->usuario;
if(!empty(
$usuarioStr)) {
    
// funciona
}

$sesionObj Sesion::instancia();
if(!empty(
$sesionObj->usuario)) {
    
// NO funciona
}

if(!empty(
Sesion::instancia()->usuario)) {
    
// NO funciona
}

var_dump($usuarioStr); // devuelve string 'nombreUsuario'
var_dump($sesionObj->usuario); // devuelve string 'nombreUsuario'
var_dump(Sesion::instancia()->usuario); // devuelve string 'nombreUsuario' 
Edit: Espero se haya entendido. Cualquier duda avisen.