Foros del Web » Programando para Internet » PHP »

Problema extraño función empty()

Estas en el tema de Problema extraño función empty() en el foro de PHP en Foros del Web. Hola compañeros, tengo un "perro verde" que no logro descifrar. Resulta que una variable que contiene un string, la función empty() devuelve true. Este es ...
  #1 (permalink)  
Antiguo 19/11/2014, 13:55
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Exclamación Problema extraño función empty()

Hola compañeros, tengo un "perro verde" que no logro descifrar.
Resulta que una variable que contiene un string, la función empty() devuelve true. Este es el código:

Código PHP:
Ver original
  1. var_dump($presupuesto->subject);
  2. var_dump(empty($presupuesto->subject));

y esta es la salida:

Código:
string(36) "Baño 20m2 reforma integral y barato"
bool(true)
Tenéis alguna idea de por qué pasa esto? Me da que es imposible que diga que está vacía una propiedad de un objeto que contiene un string.

Como curiosidad, nunca me había pasado y siempre utilizo unos objetos propios en el que $presupuesto apunta a un registro de la bd, y cada propiedad sería un campo de ese registro ($presupuesto->subject apunta al campo "subject" de la tabla "presupuestos"). Dejo aquí el código que tengo para ello por si es de interés:

Código PHP:
Ver original
  1. <?php
  2. class ObjetoDatosVariables
  3. {
  4.     private $datos, $tabla, $identificador;
  5.    
  6.     public function __construct($data, $table, $pkey)
  7.     {
  8.         $this->datos = $data;
  9.         $this->tabla = $table;
  10.         $this->identificador = $pkey;
  11.     }
  12.    
  13.     public function __invoke($array)
  14.     {
  15.         global $_BD;
  16.         $sets = "";
  17.         foreach ($array as $k => $v) {
  18.             $sets .= " {$k}={$v},";
  19.         }
  20.         $sets[-1] = "";
  21.         $_BD->Consultar("UPDATE {$this->tabla} SET{$sets} WHERE {$this->identificador}=%s", $this->datos[$this->identificador]);
  22.     }
  23.    
  24.     public function __set($k, $v)
  25.     {
  26.         global $_BD;
  27.         $this->datos[$k] = $v;
  28.  
  29.         $_BD->Consultar("UPDATE {$this->tabla} SET {$k}=%s WHERE {$this->identificador}=%s", $v, $this->datos[$this->identificador]);
  30.         return $v;
  31.     }
  32.    
  33.     public function __get($k)
  34.     {
  35.         return $this->datos[$k];
  36.     }
  37. };
  38.  
  39. ?>

con este código, el __get() me trae la consulta relacionada que hago previamente en un controlador, y el __set() me permite modificar campos fácilmente.

Código PHP:
Ver original
  1. echo $presupuesto->subject; //__get()
  2. $presupuesto->subject = "Otro valor"; // __set()

Gracias por vuestra ayuda.

Saludos.



[EDITO]


He encontrado esta nota en el manual de php.net

Cita:
Cuando se utiliza empty() sobre las propiedades de objetos inaccesibles, el método sobrecargado __isset() será llamado, si se declara.
¿Esto quiere decir que $presupuesto es un objeto inaccesible? ¿Y por qué? ¿Lo podría solucionar con ese __isset()?

Gracias por vuestra sabiduría.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.

Última edición por CHuLoSoY; 19/11/2014 a las 14:04 Razón: nueva información
  #2 (permalink)  
Antiguo 19/11/2014, 14:06
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Problema extraño función empty()

http://php.net/manual/es/language.oo...p#object.isset
  #3 (permalink)  
Antiguo 19/11/2014, 14:24
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: Problema extraño función empty()

Ok, me resuelve muchas dudas, pero una pregunta, si yo escribo el __isset() pero lo que quiero no es devolver isset sino empty(), esto me traería problemas con el isset() llamando a __isset()?
No sé si me explico.

Si utilizo empty($obj->prop) , al $obj le escribo un
Código PHP:
Ver original
  1. function __isset() { return isset($prop); }
me estaría devolviendo true a isset, pero eso no quiere decir que no esté vacío. El resultado de este problema sería un
Código PHP:
Ver original
  1. function __isset() { return empty($prop); }
Entonces si yo llamo isset($obj->prop) me estaría devolviendo el resultado de un empty() . Me equivoco?
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #4 (permalink)  
Antiguo 19/11/2014, 14:41
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Problema extraño función empty()

¿Lo has probado?
Código PHP:
Ver original
  1. <?php
  2. class P {
  3.   private $data;
  4.  
  5.   public function __construct() {
  6.     $this->data=array(
  7.       'v1' => 1,
  8.       'v2' => 'dos',
  9.       'v3' => false
  10.     );
  11.   }
  12.  
  13.   public function __get($k) {
  14.     return $this->data[$k];
  15.   }
  16.  
  17.   public function __set($k, $v) {
  18.     if (array_key_exists($k, $this->data,)) {
  19.       $this->data[$k] = $v;
  20.     } else {
  21.       trigger_error("Undefined index: {$k}");
  22.     }
  23.   }
  24.  
  25.   public function __isset($k) {
  26.     return isset($this->data[$k]);
  27.   }
  28. }
  29.  
  30. $p = new P();
  31.  
  32. echo empty($p->v1) ? 'Vacio' : 'No Vacio';
  33. ?>

Última edición por marlanga; 19/11/2014 a las 14:47

Etiquetas: extraño, registro, tabla, variable
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 12:58.