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

Posible bug en php ?

Estas en el tema de Posible bug en php ? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. probe en la versión 5.3 y en la 5.2 y lo siguiente me da false: <?php class ExampleSuperclass { private $foo; function propertyExists() { return ...
  #1 (permalink)  
Antiguo 20/01/2010, 14:33
 
Fecha de Ingreso: enero-2010
Mensajes: 36
Antigüedad: 14 años, 3 meses
Puntos: 0
Pregunta Posible bug en php ?

probe en la versión 5.3 y en la 5.2 y lo siguiente me da false:

<?php
class ExampleSuperclass
{
private $foo;
function propertyExists()
{
return property_exists($this, 'foo');
}
}

class ExampleSubclass extends ExampleSuperclass
{

}

$example = new ExampleSubclass();
var_dump($example->propertyExists());
?>


Por favor, alguien podría probarlo en la 5.1 y decirme si le da true o false.

Última edición por Gaboto83; 20/01/2010 a las 17:19 Razón: El script estaba mal
  #2 (permalink)  
Antiguo 20/01/2010, 15:20
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: Posible bug en php ?

Obviamente method_exists te va a retornar false. foo es una propiedad, no un metodo. Para probar si una propiedad existe utiliza property_exists.
__________________
I see dead pixels
  #3 (permalink)  
Antiguo 20/01/2010, 17:15
 
Fecha de Ingreso: enero-2010
Mensajes: 36
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Posible bug en php ?

Perdón sergio, hice cualquier cosa.
El ejemplo es asi

<?php
class ExampleSuperclass
{
private $foo;
function propertyExists()
{
return property_exists($this, 'foo');
}
}

class ExampleSubclass extends ExampleSuperclass
{

}

$example = new ExampleSubclass();
var_dump($example->propertyExists());
?>

y en la 5.3.1 creo que da diferente
  #4 (permalink)  
Antiguo 20/01/2010, 17:44
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 8 meses
Puntos: 105
Respuesta: Posible bug en php ?

te deberia devolver true puesto que la funcion es publica.... si deseas que retorne false.... al atributo $foo tendrias que asignarle static no private.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #5 (permalink)  
Antiguo 20/01/2010, 20:23
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: Posible bug en php ?

Cita:
Iniciado por masterojitos Ver Mensaje
te deberia devolver true puesto que la funcion es publica.... si deseas que retorne false.... al atributo $foo tendrias que asignarle static no private.
No habla de ninguna función, es una propiedad del objeto, y debería comportarse igual tanto static como private. ¿Por qué dices eso?

Aparentemente sí es un bug ...

Código PHP:
Ver original
  1. <?php
  2.  
  3. class ExampleSuperClass
  4. {
  5.     private $foo;
  6.     static protected $bar;
  7.  
  8.     private function foo()
  9.     {
  10.     }
  11.  
  12.     public function propertyFooExists()
  13.     {
  14.         return property_exists($this, 'foo');
  15.     }
  16.  
  17. }
  18.  
  19. class ExampleSubClass extends ExampleSuperClass
  20. {
  21.     public function methodExists()
  22.     {
  23.         return method_exists($this, 'foo');
  24.     }
  25.  
  26.     public function propertyBarExists()
  27.     {
  28.         return property_exists($this, 'bar');
  29.     }
  30. }
  31.  
  32. $example = new ExampleSubClass();
  33. var_dump($example->methodExists());
  34. var_dump($example->propertyFooExists());
  35. var_dump($example->propertyBarExists());

Con PHP 5.2.10:
Código:
bool(true)
bool(true)
bool(false)
Con PHP 5.3.0:
Código:
bool(true)
bool(false)
bool(true)
Salida esperada ¿?
Código:
bool(true)
bool(true)
bool(true)
...
__________________
I ♥ The Music!

Última edición por maturano; 20/01/2010 a las 20:33
  #6 (permalink)  
Antiguo 20/01/2010, 21:27
 
Fecha de Ingreso: enero-2010
Mensajes: 36
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Posible bug en php ?

maturano, gracias por el ejemplo, mucho más completo.
Ya reporté el bug, pero voy a poner tu ejemplo también que es más completo.
  #7 (permalink)  
Antiguo 20/01/2010, 21:32
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: Posible bug en php ?

¿Podrías colocar el enlace del reporte para seguirle la pista?.
__________________
I ♥ The Music!
  #8 (permalink)  
Antiguo 21/01/2010, 06:52
 
Fecha de Ingreso: enero-2010
Mensajes: 36
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Posible bug en php ?

http://bugs.php.net/bug.php?id=50810
  #9 (permalink)  
Antiguo 21/01/2010, 10:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Posible bug en php ?

No creo que sea un bug, ya que las propiedades privadas no son accesibles desde las clases hijas, y el cambio que se hizo de PHP5.3 es:
Cita:
This function checks the existence of a property independent of accessibility.
Lo que hace que el comportamiento sea el esperado ya que la propiedad $foo es privada y no existe en la clase heredada.

La salida correcta es la de PHP5.3.

Saludos.
  #10 (permalink)  
Antiguo 21/01/2010, 12:35
 
Fecha de Ingreso: enero-2010
Mensajes: 36
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Posible bug en php ?

En el ejemplo SI es accesible, porque el método está definido en la superclase.
Igualmente, si este no fuera el caso, una cosa es que exista, y otra cosa es que sea accesible. Yo creo que son dos aspectos diferentes.
Y justamente, en php 5.3 dice el metodo dice si EXISTE independientemente de su accesibilidad.
  #11 (permalink)  
Antiguo 21/01/2010, 12:50
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Posible bug en php ?

Así es pero lo hace en el scope de la clase, tu estas leyendo el atributo $foo, que pertenece a tu clase ExampleSuperClass no a la clase ExampleSubClass, es por eso que da false...
  #12 (permalink)  
Antiguo 21/01/2010, 13:32
 
Fecha de Ingreso: enero-2010
Mensajes: 36
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Posible bug en php ?

Yo creo que el comportamiento en 5.3 es incorrecto, pero bueno, vamos a ver que decide la gente de php con el bug reportado.
Gracias y Saludos!
  #13 (permalink)  
Antiguo 22/01/2010, 08:35
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: Posible bug en php ?

Que tal Gaboto,

En lo personal y "conceptualmente" como lo entiendo, el comportamiento de 5.3 es coherente.

Si "A" hereda de "B", por más que sean elementos privados ("visibilidad" / "scope"), los elementos se heredan igual y son parte del objeto "A" (si usas el constructor de "B" tendrás acceso a los atributos privados de forma indirecta, demostrado entonces que esos atributos son "tuyos").

Por lo tanto, si preguntas si existe un elemento heredado y privado, la respuesta debería ser "si" (true), pero otra pregunta sería si "es accesible".

PD: de todas formas, nunca vi con buenos ojos este tipo de funcionalidades, cuanto más preguntas a un objeto sobre su composición, más rompes las abstracciones y dificultas el uso del polimorfismo (estrategia base de la POO).

"Nunca preguntes quién o cómo es".
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #14 (permalink)  
Antiguo 22/01/2010, 09:01
 
Fecha de Ingreso: enero-2010
Mensajes: 36
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Posible bug en php ?

Cita:
En lo personal y "conceptualmente" como lo entiendo, el comportamiento de 5.3 es coherente.

Si "A" hereda de "B", por más que sean elementos privados ("visibilidad" / "scope"), los elementos se heredan igual y son parte del objeto "A" (si usas el constructor de "B" tendrás acceso a los atributos privados de forma indirecta, demostrado entonces que esos atributos son "tuyos").

Por lo tanto, si preguntas si existe un elemento heredado y privado, la respuesta debería ser "si" (true), pero otra pregunta sería si "es accesible".
enriqueplace, justamente el comportamiento coherente sería el de la versión 5.2, no el de la 5.3.
fijate que en la 5.2 devuelve TRUE (lo correcto) y en 5.3 FALSE.


Cita:
PD: de todas formas, nunca vi con buenos ojos este tipo de funcionalidades, cuanto más preguntas a un objeto sobre su composición, más rompes las abstracciones y dificultas el uso del polimorfismo (estrategia base de la POO).
Son herramientas de reflexividad que brinda el lenguaje (maneras de describir estructuras del lenguaje desde el lenguaje mismo). En realidad no debería ser habitual utilizar este tipo de cosas cuando estás programando el dominio de negocio. Pero si estás programando cosas que tienen que ver con cuestiones computacionales (un framework de persistencia de objetos por ejemplo) no está mal utilizarlas. Eso se llama hacer metaprogramación (meta significa en otro nivel conceptual).
En mi caso concreto es una parte del programa que tiene que guardar objetos en la base de datos, entonces necesita utilizar este tipo de cosas para conocer la estructura interna del objeto y luego guardarlo en una tabla de base de datos por ejemplo.
Obviamente la forma de persistir un objeto en una base de datos va a estar acoplada a su estructura interna, por lo que no hay forma de no "romper" el encapsulamiento.
Las facilidades reflexivas del lenguaje están buenas siempre y cuando se utilicen cuando corresponda.
  #15 (permalink)  
Antiguo 22/01/2010, 09:05
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: Posible bug en php ?

Cita:
Iniciado por Gaboto83 Ver Mensaje
enriqueplace, justamente el comportamiento coherente sería el de la versión 5.2, no el de la 5.3.
fijate que en la 5.2 devuelve TRUE (lo correcto) y en 5.3 FALSE.
Mmm... me confundí entonces? dame un rato que reviso toda la discusión nuevamente (sorry, nunca más contesto apurado)



Cita:
En mi caso concreto es una parte del programa que tiene que guardar objetos en la base de datos, entonces necesita utilizar este tipo de cosas para conocer la estructura interna del objeto y luego guardarlo en una tabla de base de datos por ejemplo.
Obviamente la forma de persistir un objeto en una base de datos va a estar acoplada a su estructura interna, por lo que no hay forma de no "romper" el encapsulamiento.
Las facilidades reflexivas del lenguaje están buenas siempre y cuando se utilicen cuando corresponda.
Ok, en estos casos particulares, estoy de acuerdo que los necesitas, pero no así en las situaciones habituales de trabajar en el "dominio" de un sistema tradicional.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #16 (permalink)  
Antiguo 16/03/2010, 07:31
 
Fecha de Ingreso: enero-2010
Mensajes: 36
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Posible bug en php ?

Finalmente fue resuelto :)
http://bugs.php.net/bug.php?id=50810&edit=2
  #17 (permalink)  
Antiguo 16/03/2010, 07:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Posible bug en php ?

Gracias por el update, esperemos verlo en el próximo release

Etiquetas: bug, php, posible
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 19:53.