¿Una clase abstracta siempre tiene que tener un método abstracto?

¿Una clase abstracta siempre tiene que tener un método abstracto?

Respuesta corta: NO (Al menos en PHP). ¿Querés los detalles? Seguí leyendo... Esta pregunta surgió en una clase de POO y me pareció interesante compartir la respuesta ya que no es realmente trivial. El ejemplo que estábamos viendo era el siguiente: Teníamos un sistema que manejaba clientes, con lo cual, contaba con una clase Cliente: class Cliente { private $nombre; private $apellido; private $cuit; private $email; public function __construct( $nombre, $apellido, $cuit, $email ) { $this->setNombre($nombre); ... } public function setNombre( $nombre ) { $this->nombre = $nombre; } ... } Pronto vimos la necesidad de especializar esta clase en tres subclases diferentes: class PYME extends Cliente { } class PersonaFisica extends Cliente { } class Multinacional extends Cliente { } Dado que los requerimientos del sistema quedaron más claros y era…
Read More
Cómo manipular imágenes usando PHP

Cómo manipular imágenes usando PHP

ImageMagick es una aplicación muy potente para la manipulación de imágenes. Por lo general, se utiliza desde la línea de comandos en ambientes Linux. ImageMagick es capaz de trabajar con una amplia variedad de formatos de imágenes y realizar una gran cantidad de transformaciones sobre ellas. PHP cuenta con una API propia para que su utilización sea sencilla (Obviamente, requiere que primero se instalen las bibliotecas necesarias): la clase Imagick. Una instancia de Imagick trabaja asociándole una o más imágenes al momento de su construcción (pasándole un string o un array según el caso): $ig = new \Imagick("mi_imagen.jpg"); $ig2 = new \Imagick( ["mi_imagen.jpg", "otra_imagen.png"]); A partir de ese momento es posible realizar modificaciones a la imagen simplemente invocando los métodos de la clase, por ejemplo: $ig->resizeImage( $width, $height, \Imagick::FILTER_BOX, 0.9 ); Permite…
Read More
Cómo alterar la configuración de PHP sin acceder al php.ini

Cómo alterar la configuración de PHP sin acceder al php.ini

Existen situaciones en las que necesitamos modificar ciertos parámetros de la configuración de PHP (Por ejemplo, la cantidad de memoria permitida para un script o el tiempo máximo de ejecución) para que cierto código funcione correctamente. Desafortunadamente, no siempre podemos hacerlo del modo normal, es decir, modificando el archivo php.ini. Es más, existen casos en los que no querremos que estos cambios tengan efecto en scripts diferentes del que estamos desarrollando. El típico caso en que esto sucede es un entorno de hosting compartido. Algunos proveedores dan acceso a una versión particular del archivo por cada sitio que alojan, aunque la mayoría no lo permiten en absoluto (Es lógico si se piensa un poco, un servidor en el que corren muchas aplicaciones debe hacer un gran esfuerzo por evitar que un…
Read More
Cómo consumir un WebService SOAP con PHP

Cómo consumir un WebService SOAP con PHP

Los WebServices son un mecanismo muy útil para integrar aplicaciones a través del protocolo HTTP. Una de las formas en que se implementan estos mecanismos es a través de SOAP. Consumirlos usando PHP es bastante simple, para ello se utiliza la clase SOAPClient. Veamos un ejemplo de cómo consultar la localización física según la IP: <?php $url = "http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl"; try { $client = new SoapClient($url, [ "trace" => 1 ] ); $result = $client->ResolveIP( [ "ipAddress" => $argv[1], "licenseKey" => "0" ] ); print_r($result); } catch ( SoapFault $e ) { echo $e->getMessage(); } echo PHP_EOL; En este caso, este script debería ser corrido desde CLI (Por ejemplo, si lo guardás como "ws.php", al ejecutar php ws.php 210.45.151.101 obtendrás la salida: stdClass Object ( [ResolveIPResult] => stdClass Object ( [City] => Huainan…
Read More
Un motor de sugerencias en PHP

Un motor de sugerencias en PHP

Otro desafío interesante que me tocó encarar junto a mi equipo en el desarrollo de una red social de viajes fue el Sugeridor de Opinables. Una de las características que tenía el sitio en que estaba trabajando era la posibilidad de que los usuarios dejaran opiniones (o reseñas mejor dicho) sobre lugares que habían visitado (en general hoteles, restaurantes, atractivos, etc...). En un determinado momento, para el negocio se volvió sumamente importante incrementar la cantidad de reseñas (obviamente debían ser auténticas, no inventadas por robots ni plagiadas de otros sitios). Una idea que tuvimos junto con el equipo de producto fue la de intentar "adivinar" sobre qué otros lugares podría un usuario dejar su reseña, sabiendo qué lugares había visitado. Lo que debíamos lograr era algo similar a esto: Pero había una…
Read More
Cómo prevenir los ataques por SQL Injection en aplicaciones PHP

Cómo prevenir los ataques por SQL Injection en aplicaciones PHP

Uno de los fantasmas más temidos por quienes contratan servicios de desarrollo (especialmente cuando se trata de su primera experiencia) es el de los ataques de hackers. Si bien es imposible asegurar al 100% un sistema (de software o de cualquier otro tipo), existe una serie de buenas prácticas que disminuyen sensiblemente la probabilidad de ocurrencia de tales ataques (o al menos, su probabilidad de éxito). Por lo general, los ataques se basan en la explotación de código vulnerable como ser algún caso raro que el desarrollador no tuvo en cuenta. Uno de los ataques más usuales es el conocido como sql injection. De lo que se trata es de ejecutar código sql sin autorización. Los scripts de PHP que no están bien escritos pueden ser atacados de esta forma. Veamos un ejemplo: <?php $sql…
Read More
Un ejemplo de uso del patrón strategy en PHP

Un ejemplo de uso del patrón strategy en PHP

Hace poco, trabajando en una mejora para un sistema que desarrollé para un cliente de Leeway me pasó lo siguiente: Una parte del trabajo de la aplicación era obtener información financiera de diferentes fuentes (básicamente se trataba de obtener precios históricos de bonos). Existían diferentes fuentes de consulta debido a que la información no siempre estaba disponible en todos los sitios (más allá de no disponer de APIs, pero esa es otra historia). El punto es que, en la primera versión de la aplicación (que obviamente estaba desarrollada sobre el framework Symfony), simplemente creamos un método dentro del Controlador: private function fetchBondPrice($symbol, \DateTime $date) { try { if ($price = $this->fetchBondPriceFromQuoteNet($symbol, $date)) { return $price; } if ($price = $this->fetchBondPriceFromMorningStar($symbol, $date)) { return $price; } } catch (Exception $e) { } return null; }…
Read More
Cómo evitar el auto-logout en una aplicación web hecha en PHP

Cómo evitar el auto-logout en una aplicación web hecha en PHP

En un proyecto que hice para un cliente de Leeway me sucedió algo que no había previsto: un formulario dinámico resultó muy largo para la persona que tenía que realizar la carga y, cuando terminó el sistema la deslogueó automáticamente y perdió su trabajo :( Analizando un poco el problema me di cuenta de que la sesión había expirado a pesar de que el usuario estaba interactuando con el sistema... sólo que no se estaba produciendo ninguna comunicación cliente-servidor, ya que toda la acción estaba pasando del lado cliente. La solución que encontré fue diseñar un mecanismo de tipo keepAlive de modo de avisar al servidor que todavía había actividad del lado del cliente (¡y pedir por favor que no dejen afuera!). Lo primero que hice entonces fue agregar este pequeño…
Read More
Cómo conectarse a bases de datos distintas de MySQL desde PHP

Cómo conectarse a bases de datos distintas de MySQL desde PHP

Si bien es casi una redundancia hablar de PHP+MySQL (Algo así como GNU y Linux), la realidad es que esta santa asociación es casi casual. En PHP no existe un motor de base de datos preferido y otros de segunda. No voy a decir que PHP puede conectarse a cualquier motor de bases de datos (Habiendo pasado por la FCEyN aprendí bien a no usar los absolutos con ligereza :)), la realidad es que puede conectarse, de forma muy simple, a una amplia cantidad. A su vez, las opciones son varias, dependiendo principalmente del nivel técnico de quien deba implementar la solución. Paso a explicar: En el escalón más bajo están las funciones propias de php para realizar las conexiones: mysqli_connect para MySQL pg_connect para PostgreSQL sqlsrv_connect para Microsoft SQLServer Y un largo etcétera (Si tenés que conectarte…
Read More
Cómo mostrar resultados de un proceso largo en tiempo real en una aplicación web

Cómo mostrar resultados de un proceso largo en tiempo real en una aplicación web

Un caso interesante en el que me tocó trabajar fue la implementación de un sistema de gamification para una red social de viajeros en la que trabajaba. Los responsables del producto estaban muy interesados en fomentar la generación de contenido por parte de los usuarios del sitio y se les ocurrió que ofrecer "galardones" a quienes más contenido subían a la plataforma era una buena forma de lograrlo. Dejando de lado la discusión sobre la viabilidad de la estrategia, hay unas cuantas lecciones interesantes desde el punto de vista de la implementación técnica. Algo de información de contexto: Las reglas de obtención de los galardones no eran triviales (Tampoco eran super complejas, básicamente, según el tipo de contenido de que se trataba había un número mínimo de aportes que permitían…
Read More