Categoría: Misceláneos

  • Qué son los métodos mágicos de PHP

    Qué son los métodos mágicos de PHP

    Una de las características que más me gusta de PHP son los métodos «mágicos».

    En realidad, como en la vida real, no se trata de magia como tal, si no de buenos trucos.

    De lo que se trata en este caso es de métodos que son invocados automáticamente (ante ciertos sucesos o eventos).

    La principal característica que tienen estos métodos es que sus nombres comienzan con __ (doble underscore).

    Si venís programando con objetos en PHP (al menos desde la versión 5), reconocerás estos (Especialmente el primero):

    __construct

    __destruct

    Puede que no lo supieras, pero el constructor y destructor de la clase pertenecen a un grupo más grande de métodos (conocidos como «mágicos»).

    Veamos algunos de ellos:

    __toString

    Este es otro de los más conocidos.

    Su función es retornar una cadena (string) que represente al objeto.

    Por ejemplo, si tuviéramos una clase Persona:

    <?php
    
    class Persona
    {
         private $nombre;
         private $apellido;
    
         public function __construct( $nombre, $apellido )
         {
                  $this->nombre = $nombre;
                  $this->apellido = $apellido;
          }
    }

    Podría resultar interesante que, al momento de imprimir por pantalla los datos de la persona se viera su nombre y su apellido.

    En este escenario podríamos definir un método __toString de la siguiente forma:

    public function __toString()
    {
        return $this->nombre.' '.$this->apellido;
    }

    Y luego hacer algo como:

    $persona = new Persona( "Mauro", "Chojrin" );
    
    echo $persona;

    Cuando el intérprete lea echo $persona automáticamente buscará en la definición de la clase Persona un método __toString y, si lo encuentra, lo invocará.

    Otros métodos mágicos interesantes

    Como decía, existen varios métodos mágicos que vale la pena conocer:

    __call

    El método __call es invocado en forma automática cuando se realiza una llamada a un método no definido explícitamente.

    En nuestro ejemplo anterior, sería el caso de invocar algo como $persona->intercambiar();.

    Lo primero que hará el intérprete será buscar un método específico llamado «intercambiar», al no encontrarlo buscará una definción de un método __call. En caso de encontrarla lo invocará pasando como parámetros el nombre del método buscado («intercambiar» en este caso y la lista de argumentos).

    La definición del método __call será algo como:

    public function __call( $metodo, array $argumentos )
    {
      ...
    }

    Este método es muy útil cuando se quiere armar familias de métodos similares.

    El ejemplo más claro que me viene a la mente es el que usaba Doctrine en su versión 1.

    Tenía un método findBy() que recibía un array de criterios de búsqueda.

    Muchas veces era muy cómodo poder escribir algo como findByName() (Donde «Name» se correspondía con el nombre de un campo de la tabla en cuestión).

    Es claro que Doctrine no puede adivinar todos los nombres de campos que a uno se le pueden ocurrir (y generar un método findByX()para cada uno…).

    Ahí entonces una solución posible (basada en __call) es algo como:

    public function __call( $method, array $arguments )
    {
       $find = "findBy";
    
       if ( substr( $method, 0, strlen( $find ) ) == $find ) {
           $field = substr( $method, strlen( $find ) );
        
           return $this->findBy( [ $field => $arguments[0] ] );
       }
    }

    De esta forma es posible llamar a cualquier método findByX como si estuviese definido.

    __set y __get

    Los métodos __set y __get son invocados cuando se intenta asignar (u obtener) una variable no pública de una clase.

    El contar con estos métodos permite, por ejemplo, ahorrar algo de código (No se requiere escribir un setter/getter para cada propiedad):

            public function __set( string $var, $val )
            {
                    $this->$var = $val;
            }
    
            public function __get( string $var )
            {
                    return $this->$var;
            }
    

    Y luego:

    $persona = new Persona( "Mauro", "Chojrin" );
    echo $persona->nombre.PHP_EOL;
    $persona->apellido = "Perez";
    echo $persona.PHP_EOL;

    Claro que, en este caso, bien podríamos haber dejado las variables como públicas y era más fácil, ¿cierto? :p

    Pero el tener estos métodos me permite también, por ejemplo, crear propiedades virtuales:

            public function __set( string $var, $val )
            {
                    if ( $var === "nombreCompleto" ) {
                            $parts = preg_split('/ /', $val);
                            $this->nombre = $parts[0];
                            $this->apellido = $parts[1];
                    } else {
                            $this->$var = $val;
                    }
            }
    
            public function __get( string $var )
            {
                    if ( $var === 'nombreCompleto' ) {
    
                            return $this->__toString();
                    }
                    return $this->$var;
            }

    Y al final:

    $persona = new Persona( "Mauro", "Chojrin" );
    $persona->nombreCompleto= "Miguel Perez";
    echo $persona->nombre.','.$persona->apellido.PHP_EOL;

    Más métodos mágicos

    Hay unos cuántos métodos mágicos más (algunos más útiles que otros, cierto) que podés consultar en la documentación oficial de PHP.

    Esta es una característica bastante avanzada que a veces se conoce también como meta-programación.

  • ¿Es posible hostear una aplicación PHP en Windows?

    ¿Es posible hostear una aplicación PHP en Windows?

    Un amigo me contactó por un problema que estaba enfrentando su equipo técnico: están desarrollando una aplicación PHP que necesitan hostear sí o sí en un servidor Windows.

    Actualmente tienen un IIS montado en su servidor y la duda era, primero si era posible servir PHP desde IIS o si era necesario usar un servidor Apache y, en tal caso, si era necesario compilarlo desde 0 (Algo que estaba fuera del alcance de dicho equipo).

    Mi primera impresión ante esta situación fue de sorpresa. Ciertamente, Windows no sería mi elección en cuanto a servidor (En general prefiero mantenerme alejado de Windows, pero especialmente para el caso de servidores soy bastante estricto).

    Yo optaría por alguna distribución de linux (Probablemente basada en Debian como para hacer las cosas sencillas, pero en DistroWatch siempre se encuentran sorpresas interesantes) y, de ser posible iría con un VPS montado en DigitalOcean.

    Ahora bien, intentaré responder las preguntas de a una.

    ¿Puede IIS servir PHP?

    Sí.

    De hecho, Microsoft tiene un sitio especialmente dedicado al tema en https://php.iis.net/

    Un pequeño detalle es que este sitio ha quedado algo desactualizado… habla de la versión 5.3 de php :p, pero se pueden seguir estas instrucciones para actualizar la versión a alguna más moderna.

    ¿Puede Apache instalarse en Windows?

    Sí.

    El webserver Apache está escrito en lenguaje C con lo cuál, puede crearse una versión especial para cualquier plataforma que tenga un compilador de ese lenguaje (Tal es el caso de Windows).

    ¿Es necesario compilar Apache desde cero para instalarlo en Windows?

    No.

    Apache puede ser instalado directamente descargando los binarios (sólo que no los podrás obtener del sitio oficial del proyecto que sólo tiene el código fuente).

    Un par de lugares donde podés conseguir los binarios de Windows:

    Y si te interesa el «paquete completo» podés usar alguno de los que viene ya con MySQL y PHP:

    Sí es cierto que al compilar el Apache vos mismo tenés más control sobre lo que instalás en tu servidor (¡Pero también podés hacer mucho lío si no sabés lo que estás haciendo!).

    Conclusión

    Es perfectamente posible hostear una aplicación PHP en un servidor Windows. Las opciones son muchas y, como de costumbre, no existe una que sea universalmente mejor que las otras, será cuestión de evaluar tus posibilidades y decidir cuál es el mejor camino.

  • Qué se necesita para poner online una aplicación PHP

    Qué se necesita para poner online una aplicación PHP

    Una pregunta que parece algo obvia, ¿no? Lo que se necesita para poner en línea una aplicación PHP es un hosting. No hay mucho más que decir al respecto, ¿cierto? Pues… tal vez convenga hilar un poco más fino.

    Si bien en sus inicios PHP se utilizaba exclusivamente para la creación de aplicaciones web, hoy en día abarca un abanico mucho más amplio.

    En este artículo me centraré en la infraestructura mínima necesaria para poner en línea una aplicación web desarrollada con PHP.

    Qué debe tener un servidor para hostear una aplicación PHP

    Lo primero que debemos comprender es que, para que una aplicación web esté en línea, independientemente del lenguaje en que esté desarrollada, se requiere:

    1. Que el código esté disponible en alguna computadora conectada a Internet (El Servidor)
    2. Que dicha computadora cuente con algún software capaz de recibir peticiones a través de Internet (El WebServer) instalado y funcionando
    3. Que la dirección IP de esa computadora sea conocida en forma pública (o fácilmente averiguable)

    En el caso de PHP un requisito adicional es que esté presente en el servidor un software capaz de interpretar y ejecutar el código (El intérprete).

    Existen muchas combinaciones diferentes de software que se encargan de esto, entre las más conocidas podemos encontrar:

    Incluso es posible utilizar el Internet Information Server si el sistema operativo del servidor es Windows.

    Luego será necesario configurar el servidor web de modo que ciertas peticiones sean derivadas al intérprete de php (A diferencia de otras que simplemente deben ser servidas enviando el contenido de los archivos solicitados).

    Esta configuración es diferente según el paquete de software con que se cuente.

    Qué servicios aparte del hosting se necesitan para poner online una aplicación PHP

    Usualmente, cuando se desea poner un sitio en línea, se busca que los visitantes accedan al mismo a través de una dirección sencilla de recordar (Lo que se conoce como un dominio), sin embargo, para que la computadora cliente pueda conectarse a la computadora servidor es necesario conocer su dirección IP.

    Para ello existe un servicio adicional: el DNS.

    De modo que, para que nuestro sitio esté disponible al público será necesario, además de registrar un dominio, configurar el DNS para que realice esa traducción.

    Luego, dependiendo de las necesidades específicas del sitio que queremos montar, es probable que sea necesaria la instalación de algún software de gestión de bases de datos (Como MySQL, PostGre o alguno similar).

    Respecto de la computadora que actuará como servidor, existen diferentes opciones (de diferentes costos y requisitos técnicos).

    Se puede usar una computadora personal propia, contratar espacio en un servidor compartido, comprar una computadora y dejarla en un proveedor que garantice la alimentación y conectividad, usar un servidor virtual… en fin, las opciones son muchas.

    ¿Te cuesta decidir? Este post puede ayudarte.

  • ¿Usar un framework perjudica el SEO?

    ¿Usar un framework perjudica el SEO?

    Ah… el SEO… ese arte indómito de la web :).

    Mucho se habla de SEO (Search Engine Optimization) y muy poco es lo que realmente se sabe. Sin ser un experto en la materia (de hecho, como buen desarrollador, muy lejos estoy de serlo :p), tengo mis opiniones al respecto.

    Más allá de qué es el SEO o mejor dicho, cómo operar en favor del SEO de un sitio, todo el mundo sabe que el SEO es algo bueno y, por lo tanto, cualquier cosa que lo perjudique es algo malo, ¿cierto?… No tan rápido :).

    El SEO forma parte de una estrategia de adquisición de tráfico, un tema de Marketing Online que, dado que este no es un espacio para discutir sobre Marketing Online, está fuera de alcance.

    A lo que sí quiero hacer referencia es a esta pregunta que vengo leyendo en varios lugares (Dicha con más o menos palabras):

    ¿Es mejor para el SEO de un sitio desarrollarlo usando php puro en lugar de algún framework standard?

    La verdad… no entiendo bien cómo se llega a esa conclusión, pero bueno… intentaré dar una respuesta.

    De qué se trata SEO

    Sin entrar en muchos detalles, SEO se trata de disponer los contenidos y la estructura de un sitio de modo de facilitar a los motores de búsqueda (Google, Bing, etc…) la incorporación de un sitio a sus índices (Y de ese modo lograr que aparezca dentro de los resultados de búsqueda de los usuarios que queremos atraer… esperablemente en las primeras páginas).

    Los factores que toman en cuenta los motores de búsqueda para decidir en qué posición colocan a cada sitio son muy variados y cambiantes constantemente (De eso viven los consultores SEO). Sin embargo, hay algunos que tienen especial relevancia, entre ellos, la velocidad de carga del sitio (y supongo que por este lado viene la pregunta).

    Cómo afecta un framework a la velocidad de carga de un sitio

    Es muy difícil hablar de frameworks como un genérico. Existen algunos que están especialmente orientados a manejar sitios de alto tráfico (y, por ende, a hacer un uso muy eficiente de los recursos), otros a generar código más sencillo de mantener (aún a costa de algo de performance).

    Personalmente, desconfío de las ventajas de no usar un framework. En mi experiencia, siempre es más fácil optimizar algo que está bien estructurado que lo contrario.

    De hecho, las mayores optimizaciones en lo que a performance se refieren vienen por el lado de la infraestructura más que del código (Por ejemplo, implementando un web server potente como NginX, poniendo más servidores, usando balanceadores de carga, cachés como Varnish y otra cantidad de truquitos por el estilo).

    Existe una visión bastante arraigada (especialmente entre los programadores de nivel intermedio) de que los frameworks son mastodontes pesados que agregan una capa de complejidad y features muy probablemente innecesarios.

    Es posible que así haya sido anteriormente (aunque lo dudo), pero la realidad de hoy es muy diferente. Los frameworks de PHP están sumamente atomizados (Es decir, al crear una aplicación podés combinar las partes que te resulten útiles sin sobrecargar tu aplicación).

    Por otro lado, ¡generar código optimizado no es una tarea sencilla!

    Programando para la web estamos lejos de los sistemas hechos en Assembler donde cada ciclo de reloj cuenta y nada garantiza que no usar un framework estándar genere mejor código que sí hacerlo.

    Lo que sí garantiza no usar un framework estándar es tener que trabajar en resolver problemas que ya están resueltos (Lo que se dice reinvetar la rueda).

    ¿Puede un framework estándar ayudar al SEO?

    De hecho sí, puede y bastante. Una muestra muy simple es el tema de las URLs amigables (Otro de los pocos «trucos» de SEO que conozco).

    Hace un tiempo que a los motores de búsqueda les parece mejor una URL del tipo http://misito.com/un-tema-muy-popular que una del tipo http://misito.com/index.php?post_id=1271.

    Generar este tipo de URLs a partir del contenido de una página no es una tarea trivial (Puede ser simple, pero mejor si alguien ya lo hizo, ¿no?) y después está el tema complementario… cómo llegar desde la URL http://misito.com/un-tema-muy-popular al post con id 1271.

    De nuevo, no es la muerte de nadie armar este mecanismo, pero si un framework ya lo tiene hecho… ¿quién paga esas horas?

    Conclusión

    En última instancia, siempre se trata de una cuestión de comodidad personal, pero, aún cuando decidas no usar un framework, es importante poder tomar esa decisión con fundamentos y la preocupación por el SEO no es uno bueno.