Encontrar donde se define una clase usando el nombre de la clase

En un proyecto en el que me encuentro trabajando surgió la necesidad de implementar un módulo para OAuth, tenía que bajar el módulo y comenzar a usarlo. Cuando quiero comenzar a usarlo me salta un error que la clase OAuthException ya había sido declarada previamente.

Lo primero que se me vino a la mente es que el archivo que tenía la clase estaba siendo incluido mas de una vez, cuando me pongo a debuggear no era el caso, el archivo no estaba siendo incluido mas de una vez.

Lo segundo que pienso es que la clase estaba definida en algún otro módulo, así que grepeo todo el fuente del proyecto para buscar la definición de la clase en otro lado, el resultado fue que no había otra definición, solo la del módulo que acababa de instalar.

Después de mucho buscar y buscar, se me vino a la mente de buscar donde estaba el archivo en función del nombre de la clase, googleando un poco me encontré en stackoverflow con la clase ReflectionClass la cual posee varios métodos interesantes, entre ellos el método getFileName, este a partir del string con el nombre de la clase devuelve el path al archivo donde la clase fue definida. Aquí un ejemplo

$reflector = new ReflectionClass('Foo');
echo $reflector->getFileName();

Ya estamos dije yo, cuando corro esto para ver que me decía mi sorpresa vino de que este me devolvía vacío. Pensando un poco mas me doy cuenta que si la clase es parte de una extensión o nativa de PHP difícilmente este en un archivo, así me encontré con este otro método de la misma clase, isInternal, el cual me dio verdadero.

Con eso me saque la duda de donde venía la clase, el paso siguiente fue revisar mi lista de extensiones y me encontré con que tenía una extensión pecl para oauth (la cual instalé para otro proyecto hace bastante) y la misma definía una clase con el mismo nombre, algo que no debería pasar en las nuevas versiones de PHP si usamos espacios de nombre.

Para solucionarlo desactive la extensión y seguí codeando.

 

Share

Escucharon hablar PSR ?

ooxml-isoHace unos años atras me uni a un grupo de google llamado php-fig, este grupo pretendía definir estándares de desarrollo para la comunidad PHP con el ánimo de unificar el ecosistema de frameworks, librerías, componentes y aplicaciones desarrolladas en PHP.

Hoy leí este articulo que me parece muy bueno y decidí escribir sobre lo mismo para transmitir esta información y ademas añadirle un poco de mis condimentos.

Este grupo esta formado por los referentes mas influentes de la comunidad PHP al momento y estos no pretenden imponer la forma de trabajar pero proponen buenas prácticas y lineamientos a seguir en pos de lograr una estandarización, reutilización de componentes y quien dice, hasta dejar de inventar la rueda todas las veces; es por eso que PSR es la sigla de PHP Standards Recommendation, y el grupo se llama PHP Fig donde Fig viene de la sigla Framework Interoperability Group.

Ellos básicamente discuten temas de importancia en un la lista de correo, aceptan opiniones de gente externa a los miembros votantes, y luego los miembros votantes deciden votando la mejor alternativa.

El primer tópico a discutir fue como implementar un autoloader estándar que pueda levantar cualquier clase de cualquier librería sin muchas complicaciones y evitando tener un autoloader por cada librería que incorporemos a nuestro desarrollo (los que trabajaron con __autoload y spl_autoload_register saben el calvario que es esto). Con este topico implementaron el PSR-0, el cual fue adoptado en principio por Symfony 2 y hoy en día es el corazón de composer.

Después liberaron dos estándares mas, el PSR-1 y el PSR-2 los cuales están referidos a coding standars, si vos formas parte de una empresa de desarrollo que trabaja en PHP deberían comenzar a implementarlo.

Hace muy poco sacaron a la luz el estándar para una interfaz de logeo, PSR-3, esta va a ser la base (de hecho esta muy inspirada) para Monolog.

Ahora están discutiendo como implementar un manejo estándar para el paquete HTTP y como implementar una interfaz estándar para manejo de Caches.

Personalmente me agrada muchísimo este tipo de actividades, lo bueno es que existe algo para los que aman la interoperabilidad entre componentes aceptado en consenso por gente que la tiene muy clara y que lo hace solo por el mero interes de hacer las cosas bien, no por un interes comercial o bajo alguna presión monetaria. Por el otro lado, si bien podes estar o no de acuerdo con las propuestas podes simplemente ignorarlas y hacer lo que te parece, lamentablemente el mercado si adopta las proposals te va a exigir a que vos tambien las implementes, pero eso es al margen.

Mi recomendación es que visiten el grupo, lean las conversaciones, traten de implementar las recomendaciones en sus implementaciones y si pueden hasta deberían participar opinando (a conciencia obviamente).

Les dejo un par de links interesantes para que se metan un poco mas en el tema.

https://groups.google.com/forum/#!forum/php-fig

https://github.com/php-fig/fig-standards

https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md

https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md

https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md

https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md

http://net.tutsplus.com/tutorials/php/psr-huh/

Share

Limpiado de Sesiones en Symfony 1.4

Ayer encontre un “bug” (por llamarlo de una manera) en el manejo de sesiones de Symfony 1.4 usando sfGuard, me dí cuenta que cuando inicias una session con el usuario A, guardas un dato en la session del usuario A, deslogeas al usuario A, logueas a un usuario B, en los datos de la session de B estan los datos guardados para el usuario A. Obviamente se pueden dar cuenta de los problemas que puede llegar a traer esto.

Para probar puse en fragmento de código que setea una variable de session con el timestamp, una vez seteada la variable nunca mas se cambia el valor. Se supone que si me logeo la variable se setea por primera vez, al deslogearme la variable debería eliminarse.

Aqui un par de screenshots the la barra de debug de symfony, la primera es antes de logear al user, aqui pueden ver que la session esta limpia.

la segunda es con el el usuario logeado mostrando el valor de session, la variable fue seteada.

y la última es con el usuario deslogeado nuevamente pero con el valor de session ahi.

Si vuelvo a entrar con ese usuario u otro usuario la variable nunca cambia el valor.

El problema sucede tanto si usas setAttribute del Objeto de usuario o si metes el valor directamente en $_SESSION.

Una solución rápida que encontré fue colgarme del evento de user auth change para ver si el usuario se esta deslogeando, en ese caso llamo a un session destroy para limpiar todos los valores de la session.

Como sería esto, bueno, primero, cree una clase para el método que quiero hookear, llamemosla swSessionReset y pongamosla en lib. La clase sería algo así

class swSessionReset {
 
  static public function resetSession($event) {
    if ($event['authenticated'] === false) {
      session_destroy();
    }
  }
 
}

Después tenemos que hookear el método de esta clase. Para eso vamos al ApplicationConfiguration y añadimos estas lineas al método configure.

class applicationNameConfiguration extends sfApplicationConfiguration {
 
  public function configure() {
      //Some Code ....
      $dispatcher = ProjectConfiguration::getActive()->getEventDispatcher();
      $dispatcher->connect('user.change_authentication', 
          array('swSessionReset', 'resetSession')
      );
  }
 
}

Con esto, cada vez que el usuario se deslogue forzaremos la limpieza de todos los valores de session.

Después de ver esto @gerzenstl me hizo notar que Drupal al deslogear un usuario invoca al session_destroy, aca esta el código para que los desconfiados revisen

http://api.drupal.org/api/drupal/modules!user!user.pages.inc/function/user_logout/6

Conclusión, “ojo al parche torrente!”, tengan cuidado con esta consideración por que puede traerles graves problemas de seguridad. Prueben si a ustedes les pasa lo mismo, puede ser que el sitio en el que estoy trabajando actualmente tenga algo modificado que rompe esta funcionalidad (IMHO no creo), después me cuentan como les fue.

Share

Debug paso a paso en Netbeans desde scripts PHP de la linea de comandos

No soy muy amigo de los debugs paso a paso por que por lo general demandan demasiado tiempo para encontrar lo que se busca, con un par de echo y var_dumps en lugares bien concretos la cosa suele ser más rápida; pero cuando estamos trabajando con un código ajeno o una librería de tercero, donde no tenemos idea lo que hace, esta bueno contar con esta característica.

Netbeans trae un sistema muy piola y facil de usar para correr Xdebug en aplicaciones web con PHP. Hoy estuve necesitando correr el debugger desde la linea de comandos, cosa que nunca antes necesite hacerlo y me econtré con que es bastante sencillo tambien, lo único que debemos hacer es setear una variable de entorno en la terminal con el idekey (el Session ID que dice en la ventana de preferencias de Xdebug dentro de Netbeans).

En resumen

Exportar la variable XDEBUG_CONFIG :

#export XDEBUG_CONFIG=”idekey=netbeans-xdebug”

Setear los breakpoints

Iniciar el debugger desde la IDE (Debug Project)

Ir a la consola con la variable de entorno y correr el script

Empezar a debugear

Y eso es todo, la data la saque de este post

http://geexus.blogspot.com/2011/02/using-xdebug-in-command-line-interface.html

 

Share