Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/11/2014, 13:55
Avatar de CHuLoSoY
CHuLoSoY
 
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 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