PHP

PHP es el lenguaje de programación de mayor aceptación entre las aplicaciones web. La gran mayoría de los CMS orientados al mundo de la web están desarrollados sobre PHP.

Preparado para correr sobre un servidor web, aunque en mucha menor medida también se puede utilizar en entorno de terminal. Tiene una curva de aprendizaje muy baja, es muy permisivo con los errores, es interpretado, no compilado y orientado a objetos, entre otras cosas.

Aunque sea un lenguaje muy aceptado por los principiantes, es muy atacado por muchos experimientados en la programación. No obstante es uno de mis lenguajes preferidos. Y sobre todo, al desarrollar para la web, siendo prácticos, es una de las primeras y mejores soluciones balanceando entre el conjunto de lenguajes disponibles.

PHP 8: Creando objetos a partir de otros, herencia simple

2014-03-30 - Categorías: PHP
Objetos relacionados

Estoy con algo más de tiempo, así que jugando un poco más con la programación orientada a objetos, les escribo ahora sobre cómo crear objetos a partir de otros de la forma más simple.

Hay tres formas de crear objetos a partir de otros objetos: mediante extends, con clases abstract, y con interface.

Todo éste proceso es lo que se llama herencia, donde los objetos hijos no heredan casas ni coches ni grandes fortunas xD, si no que en éste caso heredan funciones y variables.

Empezando con la herencia simple

Vamos a suponer lo siguiente. Queremos usar en nuestro programa la información de ciertos vehículos, y dichos vehículos pueden ser motos, coches y camiones. Usando la palabra reservada extends vamos a ver con un ejemplo lo sencillo que es el siguiente:

<?php

// clase base
class vehiculo {

    public $matricula;

}

// clases que extienden la clase base
class moto extends vehiculo {

    public $velocidadMaxima;

}

class coche extends vehiculo {

    public $tipo;

}

class camion extends vehiculo {

    public $numeroRuedas;

}

// creamos 3 vehiculos
$micoche = new coche();
$mimoto = new moto();
$micamion = new camion();

// tanto la moto como el coche y el camión tienen matrícula
// porque heredan la variable matrícula
$micoche->matricula = "ABC123";
$micoche->tipo = "utilitario";
$mimoto->matricula = "DEF123";
$mimoto->velocidadMaxima = 300;
$micamion->matricula = "GHI123";
$micamion->numeroRuedas = 12;

echo "El vehículo con matrícula " . $micamion->matricula . " tiene " . $micamion->numeroRuedas . " ruedas.";

Si ejecutamos el código fuente nos saldrá: «El vehículo con matrícula GHI123 tiene 12 ruedas.»

Lo importante o nuevo en éste capítulo de la serie es la palabra reservada extends con la que se crean las nuevas clases a partir de otras. Aquí arriba tenemos cuatro clases, la clase base que tiene sólo una variable para guardar la matrícula.

Por otro lado tenemos las clases coche, moto y camión que se crean a partir de la clase base vehículo. Y por lo tanto heredan la variable para guardar la matrícula. Podemos ver que en las últimas líneas del ejemplo, tanto $micoche, como $mimoto y $micamion tienen la variable $matricula aunque no se ha declarado en dichas clases pero sí en la clase base.

Imaginemos entonces si quisiéramos podríamos crear a su vez subtipos de camiones que extendieran de la clase camión, añadiendo así más variables y funciones. Así sucesivamente.

Terminando

Para terminar, podemos de paso ver qué pasa cuando modificamos la clase base y cambiamos la variable de la matrícula a protected:

// clase base
class vehiculo {
    protected $matricula;
}

Ahora poniendo matricula protegido nos saldrá un error, porque protegiendo dicha variable lo que hacemos es que no se herede en las clases hijas. Es decir, en el caso del camión, protegiendo la matrícula, dicho camión ahora sólo tendrá una variable llamada $numeroRuedas porque no ha heredado la variable $matricula.

Hay otros tipos de como el que acabamos de ver protected, también tenemos abstract y static, pero eso es para otro post.

De nuevo me remito a la documentación oficial: http://www.php.net/manual/es/

Si te ha gustado, te ha parecido interesante, te ha aclarado alguna cosa, quieres recomendarlo, decirme que siga escribiendo, darme ánimos, dale un click a +1, comparte, facebootealo, tuitea, tuentiea o deja un mensaje aquí abajo que es gratis 😉

Un saludo!


PHP 7: Empezando con clases y objetos

2014-03-29 - Categorías: PHP
Objetos relacionados

A partir de ahora vamos a entrar en la programación orientada a objetos, POO para los amigos. En las técnicas de programación utilizar objetos es básico para poder hacer programas bien estructurados que se puedan reutilizar o  modificar.

En programación, una clase es un objeto, y un objeto es una clase. Éstas clases de PHP tienen unas variables y unos métodos o funciones.

Dicho ésto vamos al grano.

Una primera clase básica

A continuación tenemos un objeto, que es una clase de PHP. Éste objeto representa un avión que está en unas coordenadas, tiene un tipo de motor, cierta matrícula, y está en un estado determinado. Por ejemplo:

<?php

// se declara el objeto
class Avion {

    // variables
    public $x, $y, $z;
    private $tipoMotor;
    public $matricula;
    private $estado;

    // a partir de aquí estan las funciones
    // constructor de la clase
    function __construct() {
        $this->x = $this->y = $this->z = 0;
        $this->tipoMotor = 1;
        $this->matricula = "No definida";
        $this->estado = "No definido";
    }

    public function getTipo() {
        switch ($tipoMotor) {
            case 1: $descripcion = "Hélices";
                break;
            case 2: $descripcion = "Propulsión a chorro";
                break;
            default:
                $descripcion = "Tipo no encontrado";
        }
        return $descripcion;
    }

    public function getEstado() {
        return "El avión con matrícula >" . $this->matricula . "< está: " . $this->estado;
    }

    public function despegar() {
        $this->estado = "Volando";
    }

    public function aterrizar() {
        $this->estado = "Esperando";
    }

    public function setMatricula($m) {
        $this->matricula = $m;
    }

    // destructor de la clase
    function __destruct() {
        echo "El avión con matrícula >" . $this->matricula . "< se ha destruido.";
    }

}

// fin del objeto
// a partir de aquí éste código usa el objeto avión
$miavion = new Avion();
$miavion->setMatricula("ABC123");
$miavion->despegar();
dispose($miavion);
echo "Mi avión está en (" . $miavion->x . ", " . $miavion->y . ", " . $miavion->z . ")<br>";
echo $miavion->getEstado() . "<br>";

Para empezar los objetos se crean usando la palabra reservada class. Tenemos dos partes principales dentro de la clase. La primera parte donde se declaran las variables, y después las funciones para ejecutar los algoritmos de programación.

Tenemos $this, que es especial. ¡Ojo! ésta variable es muy importante. Representa la clase, se usa dentro de dicha clase, y con ella accederemos a las variables y funciones cuando desarrollemos dicha clase. Con el símbolo -> después del $this accederemos así: $this->variable

De igual manera con el objeto $miavion->nombreDeVariable o $miavion->nombreDeFuncion() fuera de la clase.

Los tipos básicos de variables y funciones son public y private. Los private, como su nombre indica, son privados y sólo se pueden usar dentro de la clase. Los públicos se pueden usar desde fuera. Si vemos abajo del todo en la línea 62 de código se usa $miavion->x porque x es una variable pública. No podremos por ejemplo acceder a la variable estado de la forma $miavion->estado porque es privada. Lo mismo pasa con la variable $tipoMotor, no podemos acceder directamente, por ello se declara la función getTipo() que lo hace por nosotros y nos dice el tipo de motor que tiene el avión.

Constructor y destructor de una clase

El resto de funciones no tiene misterio, salvo dos especiales, el constructor y destructor de la clase. Si ejecutamos el ejemplo nos mostrará lo siguiente:

Mi avión está en (0, 0, 0)
El avión con matrícula >ABC123< está: Volando
El avión con matrícula >ABC123< se ha destruido.

El constructor empieza en la línea 14 y el destructor en la 50. Éstas dos funciones se ejecutan automáticamente cuando se crea un objeto avión y cuando se destruye respectivamente. Se suelen usar para hacer tareas de inicialización en el caso del constructor o para terminar procesos con el destructor. En el ejemplo el constructor simplemente le da unos valores a las variables de la clase y el destructor simplemente muestra un mensaje. Al ejecutarlo el ejemplo podemos ver que cuando termina el código PHP se llama automáticamente al destructor.

Terminando

Hay otros tipos de variables y funciones. También se pueden crear varios constructores.  Y muchas otras cosas más. Para terminar con éste minitutorial para empezar con los objetos de PHP me remito una vez más a la documentación oficial: http://www.php.net/manual/es/language.oop5.php

Si te ha gustado, te ha parecido útil o quieres que siga escribiendo dale aquí abajo al +1, al me gusta, a compartir, etcétera.. también puede dejar un comentario 😉

Un saludo!


PHP 6: Dividir en varios ficheros, includes, requires..

2014-03-25 - Categorías: PHP

Después de ir dividiendo nuestra aplicación, programa o algoritmo que estemos haciendo usando funciones, tenemos también lo includes y requires.

Siguiendo con aquello de «divide y vencerás». Podríamos por ejemplo dividir las secciones del menú, cabecera, contenido
Al grano..

include y require

Includo y require son igual, por ejemplo si tenemos el siguiente archivo php6.php:

<?php
include "cabecera.php";
include "menu.php";
include "contenido.php";
?>

Que incluye al archivo cabecera.php siguiente:

<?php
echo «Aquí va la cabecera»;
?>

Por ejemplo un menú así:

<?php
echo «Aquí el menú»;
?>

Y el fichero que escribe el contenido:

<?php
echo "Y el contenido";
?>

Sea lo que sea que tengamos en los ficheros incluidos se ejecutarán desde el primer archivo en el orden y posición desde donde se llamen. Si no encuentra el archivo incluido mostrará entonces una advertencia (warning). Sin embargo, si usamos require y no encuentra el archivo incluido entonces parará y mostrará un error.

include_once y require_once

Para terminar con éste minitutorial, tenemos los once. La diferencia con los anteriores es que si ya hemos incluido o requerido un fichero y lo intentamos volver a require_once o include_once no lo va a hacer por segunda vez.

include_once significa incluir una vez y require_once siginifica requerir una vez. Con un poco de inglés nos acordaremos fácilmente. Sencillo verdad?¿

Sólo me queda remitirme a la documentación oficial. Si te ha gustado, te ha parecido interesante, quieres que siga escribiendo, quieres colaborarme, dale +1, comparte, o deja un mensaje.. 🙂

Espero pronto seguir con éstos minitutoriales.

Un saludo.


PHP 5: Funciones

2014-03-20 - Categorías: PHP

Hoy les dejo un resúmen sobre las funciones. Tenemos con ellas la primera herramienta para dividir nuestra aplicación en pequeñas partes más fáciles de desarrollar. Éstas funciones se pueden después reutilizar para no tener que repetir el mismo código una y otra vez.

Al programar, se aplica mucho el dicho «Divide y vencerás». Cuando tienes un problema lo bastante grande para resolverlo directamente conviene dividirlo en funciones. O simplemente para ver el programa más claro también conviene usar funciones.

El ejemplo

Es un tema sencillo así que con éste resúmen y un ejemplo seguro que puede quedar claro:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <p>
            <?php

   function tareaCompleja($totalrepeticiones) {
    $total = 0;
    for ($i = 0; $i < $totalrepeticiones; $i++) {
     $total = $total + $i;
    }
    return $total;
   }

   $mivariable = 1000;
   echo tareaCompleja($mivariable);
   
            ?>
        </p>
    </body>
</html>

Vamos a comentar el ejemplo. Tenemos un documento que es una web, que tiene dentro incrustado código PHP. Tenemos una función llamada tareaCompleja que realiza un bucle for.

Fijémonos primero después de la declaración de la función. Tenemos una variable que vale 1000 y en la última línea 19 del ejemplo tenemos un echo que usa la función.

Tenemos dos cosas importantes: una el echo anterior que llama a la función, la otra es la función que devuelve un valor. Cuando la función se llama desde el echo anterior, se ejecuta el código calculando el total. Con el return se devuelve el valor de total, en éste caso 499500. Entonces el echo al final lo que hace es un ‘echo 499500’ con lo que en la página web se imprimirá dicho número.

Tenemos entonces que con la palabra reservada function creamos las funciones. Dichas funciones pueden recibir información, dicha información se recibe en éste caso con la variable $mivariable que se pone entre paréntesis al usar la función. Y por último la función puede devolver o no un valor con la palabra reservada return.

Terminando

También tenemos muchas funciones que el propio PHP nos da. Ya en anteriores capítulos puse la función phpinfo() que escribía todas las configuraciones. Por ejemplo poniendo en un fichero .php lo siguiente lo veremos:

<?php 
phpinfo();

Antes de contruir una nueva función conviene mirar en la documentación si ya está y usarla directamente.

Para terminar me remito de nuevo a la documentación oficial de PHP.

Si te ha sido útil, te ha gustado, o simplemente quieres decirme que siga escribiendo en el blog o cualquier otra cosa puedes darle +1, compartir, dejar un comentario.. justo aquí debajo.

Un saludo.


PHP 4: Bucles

2014-03-17 - Categorías: PHP
Bueno, ya llegando a éste minitutorial se va poniendo divertido. Aquí tenemos las primeras estructuras de control que con pocas líneas de código nos van a permitir hacer muchas cosas. Ahora te preguntarás que como con programando pocas líneas podemos hacer muchas cosas. Sí!

Para entenderlo rápidamente, por ejemplo, si queremos hacer una tarea un millón de veces. Programando un bucle que podría tener apenas tres lineas podría hacerse.

for

El bucle for ejecuta un número de veces una tarea, por ejemplo:

for($i=1; $i<=1000000; $i++){
  // ésto es un comentario que no se ejecuta
  // porque tiene delante las barras
  echo $i;
}

Éste bucle usa una variable $i que va desde 1 hasta 1000000, saltando de uno en uno. Es decir se ejecuta un millón de veces el echo $i;

En la primera línea podemos ver el valor inicial, hasta cuándo ejecuta el bucle, y de cuánto es el incremento entre vuelta y vuelta del bucle. Éste miniprograma imprimirá «123456789101112131415… así sucesivamente hasta llegar a …9999991000000»

Si tratas de ejecutar éste bucle probablemente no terminará porque un millón de veces es demasiado, saltará un temporizador en el servidor y cortará la ejecución por tardar demasiado.

foreach

El foreach nos sirve para recorrer los vectores o arrays que hemos visto en otro tutorial anterior. Por ejemplo si tenemos un vector como el siguiente:

$vector = array("nombre" => "Pepe", "apellidos" => "Por Ejemplo");
$vector2[0] = "Pepe";
$vector2[1] = "Por Ejemplo";
   
foreach ($vector as $valor) {
  echo $valor . ", ";
}
foreach ($vector2 as $clave => $valor) {
  echo $clave . " => " . $valor . ", ";
}

El primer bucle va a imprimir lo siguiente: Pepe, Por Ejemplo,
El segundo bucle: 0 => Pepe, 1 => Por Ejemplo,

Si nos fijamos en los dos vectores, tenemos en $vector un vector de dos elementos donde la clave nombre almacena Pepe y la clave apellidos almacena Por ejemplo. En el segundo vector tenemos lo mismo en los valores pero las claves, en vez de ser nombre y apellidos son 0 y 1.

Si hubieramos puesto en el segundo bucle en vez del $vector2 al $vector, nos hubiera impreso lo siguiente: nombre => Pepe, apellidos => Por Ejemplo,

while

Supongamos que ahora queremos ejecutar una tarea mientras que se cumpla una condición, papra ésto es es el bucle while. Por ejemplo:

$variable = 1;
while($variable < 3){
  echo $variable . ", ";
  $variable++;
}

Éste bucle escribirá lo siguiente: 1, 2,

De forma que si la $variable tuviera en un principio el valor 20, no entraría en el bucle y no se ejecutaría nunca lo contenido entre llaves.

do.. while

Si lo que queremos es primero ejecutar una tareas y después comprobar si se cumple una condición para continuar el bucle usamos el do.. while. Al contrario que con el while simple, primero ejecuta lo contenido entre llaves, luego comprueba, ésta es la diferencia. Por ejemplo:

$variable = 3;
do {
  echo $variable . ", ";
  $variable++;
} while($variable < 3);

Éste código escribirá: 3,

Ahora es cuando uno piensa, pero si he puesto que la variable debe ser menor a 3. El problema es que primero ejecuta, como he puesto arriba..

Terminando

A partir de aquí ya empieza la imaginación, podemos poner un bucle dentro de otro, un foreach con varios for dentro o viceversa. Espero haberme explicado bien, sino haz un do.. while(noentender) xDD

O deja un comentario.

Me remito de nuevo, como de costumbre a la documentación oficial:

http://www.php.net/manual/es/language.control-structures.php

Si te ha gustado o te ha sido útil dale click a compartir, +1..

¡Un saludo!


PHP 3: Condicionales

2014-03-14 - Categorías: PHP

Siguiendo con la serie de minitutoriales, hoy les voy a dejar uno sobre los condicionales en PHP. Estamos viendo lo que se llaman estructuras de control, y dentro de ellas pretendo dividirlas y ver aquí sólo los condicionales if y switch.

Si buscas un tutorial breve y concreto, sin rodeos y sin entrar en detalles, aquí lo tienes.

A saber..

If

Los condicionales comprueban si se cumple una condición, como su nombre indica, y en ése caso ejecutan el código programado en él. Por ejemplo:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <p>
            <?php
   $variable = 2;
   if ($variable == 2) {
    echo "La variable vale dos.";
   } else {
    echo "La variable no vale dos.";
   }
            ?>
        </p>
    </body>
</html>

El código habla por sí sólo. Tenemos una web que utiliza el estándar HTML5 como indica su DOCTYPE, y en el cuerpo de la página tenemos incrustado código PHP. Simplemente mira si la variable vale 2 y como así es imprimirá ‘La variable vale dos.» en la web. Si no valiera dos entonces ejecutaría lo que hayas puesto en el else.

El meollo de los condiciones está en la expresión de comparación ($variable == 2). Tenemos disponibles varios operadores de comparadores, por ejemplo: ==, <=, >=, !=
Están todos muy bien explicados aquí http://www.php.net/manual/es/language.operators.comparison.php

Switch

Por otro lado tenemos el switch. Se usa para encontrar valores concretos. Un ejemplo para vero claro podría ser:

$otravariable = "patata";
switch ($otravariable) {
  case "patata" :
    echo "Es una patata.";
    break;
  case "boniato" :
    echo "Es un boniato.";
    break;
  case "cebolla" :
    echo "Es una cebolla.";
    break;
  default :
    echo "¡Alguien me ha cambiado el valor de la variable!";
    break;
}

Podriamos haber usado varios condicionales de tipo if para ir comprobando $otravariable. Pero cuando tenemos más de dos posibles valores es mejor usar la estructura del switch. Fíjate que dentro de cada caso hay un break para indicar que ahí termina el caso. Si no los ponemos estaremos uniendo varios casos.

Es importante notar también el caso especial default que se ejecutará sólo cuando no encuentre el valor.

De nuevo para terminar me remito a la documentación oficial http://www.php.net/manual/es/index.php, aquí tiene en la sección de Estructuras de control los condicionales y muchísima más información.

Si te ha sido útil o te ha gustado dale click al +1, compartelo.. también puede dejar un comentario.

¡Un saludo!


PHP 2: Variables

2014-03-13 - Categorías: PHP
Continuando con los minitutoriales para aprender rápidamente y en dos dias PHP, ahora las variables..
No hace falta declarar el tipo de variable que vamos a usar, simplemente le damos valor y la usamos. PHP no es fuertemente tipado. No hace falta definir el tipo de variables que usamos, además de que la naturaleza de las variables puede cambiar a lo largo de la ejecución de los programas.
PHP tiene características muy buenas para aprender a programar gracias a su flexibilidad. Quizá por esto es bien popular. Pero a la vez, esta flexibilidad, libertad, o libertinaje, da lugar a quizá códigos fuentes a veces confusos i no lo mejor posibles. Pero esto es otro tema para otro post, así que vamos al grano..

Variables simples

Las variables utilizan el símbolo $ delante del nombre de la variable.
$variable = "cadena";
$variable2 = 1;
$variable3 = 1.2;
$variable4 = true;
echo $variable;
Ésto escribirá ‘cadena’ en la web. Es sencillo ¿verdad? simplemente le damos valores y las usamos.

Variables no tan simples

A modo de curiosidad, en un test me preguntaron para qué servían las variables con doble $, pues mira el código siguiente:
$variable2 = "cadena2";
$$variable2 = "otro valor";
echo $cadena2;
Ésto escribirá ‘otro valor’. Pero ¿cómo? ¡si no le he dado valor a la variable $cadena2! Ésto es lo que en la documentación oficial se llaman variables variables. Sirve para usar nombres de variables que cambien. Dejo aquí el enlace con todo ésto mejor explicado http://php.net/manual/es/language.variables.variable.php

Vectores

También tenemos vectores, de la forma que tenemos una ‘lista’ de elementos. Con un ejemplo podemos verlo claramente cómo se puede usar.
$unvector[] = "valor1";
$unvector[] = "valor2";
$unvector["algo"] = "valor3";
$unvector[0] = "primer valor";
echo $unvector[1] . " - " . $unvector["algo"]; // valor2 - valor3
var_dump($unvector);
Fijándonos en el código anterior, podemos ver que los vectores comienzan por la clave 0 de forma automática. Otra forma de utilizarlos en vez de usar un entero para los elementos, es usando cadenas. Examinando el resultado de la última instrucción especial:

array(3) { [0]=> string(12) «primer valor» [1]=> string(6) «valor2» [«algo»]=> string(6) «valor3» }

Podemos ver que tenemos un vector de 3 elementos. Lo que tenemos entre corchetes [] son las claves para darle valor o usarlo. Y después del => tenemos el valor.

Matrices y otros

Hay muchas más posibilidades, podemos tener también matrices, de forma que en vez de tener vectores de elementos, tenemos vectores de vectores, similar a una tabla.
$matrix[0][0] = 1;
$matrix[0][1] = 2;
$matrix[1][0] = 3;
$matrix[1][0] = 4;

También podemos usar tres dimensiones.

// una matriz tridimensional
$matrix[0][1][5] = 27;

..cinco dimensiones..

// una matriz de cinco dimensiones
$matrix[0][1][5][2][3] = 2723;
Así sucesivamente. Queda añadir que los elementos de los vectores, matrices y otras formas multidimensionales que podamos usar pueden ser de todos los tipos disponibles.
De nuevo, me remito para más información a la documentación oficial http://www.php.net/manual/es/index.php

PHP 1: Escribiendo la respuesta

2014-03-13 - Categorías: PHP
Aquí desde Spain la crisis sigue apretando, no hay mucho trabajo así que aprovecho para seguir con los minitutoriales. Continuando con éste nuevo post, sin demasiada teoría, vemos dónde ponemos el código PHP. Al grano..

Escribiendo la respuesta

Partimos de que ya tenemos un esqueleto básico en HTML de nuestra página index.html o cualquier otra web con incluso CSS, Javascript, etc. Por ejemplo:
<!DOCTYPE html>
<html>
    <head>
        <title>PHP 1: Escribiendo la respuesta</title>
        <meta charset="utf-8">
    </head>
    <body>
        <!-- AQUÍ VA EL CONTENIDO DE LA
        WEB -->
        <?php
 echo "<p>¡Hola mundo!</p>";
        ?>
    </body>
</html>

En cualquier lugar podemos usando las etiquetas <?php código fuente ?> incluir nuestra programación que se ejecutará antes de enviar al navegante. Éste código dará de resultado, simple y llanamente el siguiente resultado que enviará al navegador:

<!DOCTYPE html>
<html>
    <head>
        <title>PHP 1: Escribiendo la respuesta</title>
        <meta charset="utf-8">
    </head>
    <body>
        <p>¡Hola mundo!</p>
    </body>
</html>

Existen otras formas de escribir la respuesta, pero para escribir simple texto con echo tenemos bastante. Tenemos también print, printf, fprintf, etcétera..

También podemos tener una página completamente en PHP, en la que sólo hace falta que abramos la etiqueta <?php y sin cerrar. Pero en éste caso, todo debe generarse desde PHP. Es decir, todas las etiquetas HTML o contenido cliente debe generarse.
<?php
// código fuente de nuestro programa..
Lo habitual es usar éste formato cuando dividimos la aplicación en varios ficheros. Por ejemplo, podemos tener funciones, objetos, variables y otras cosas separadas en otros ficheros .php e incluirlos o requerirlos. Más adelante escribiré sobre cómo incluir o dividir la aplicación en trozos. Todo éste código PHP se ejecutará en el servidor, escribiendo la respuesta que se le va a enviar al visitante, y posteriormente se le enviará al navegador sin que el navegador del visitante pueda ver nada de la programación PHP.

Para más información me remito a la documentación oficial http://www.php.net/manual/es/index.php


PHP 0: Preparando las herramientas

2014-03-10 - Categorías: PHP
PHP

Inaguro con éste post una serie de pequeños tutoriales que pretendo publicar para auto-reciclado de nuestros conocimientos. O para aprender los nuevos, los que los lleguen a leerlos, de una manera no demasiado técnica, aprendiendo los conceptos básicos sobre programar en PHP.

La sintáxis de PHP es parecida a C/C++, Java, JavaScript, así que si ya conoces alguno de éstos lenguajes verás más claros los codigos.

Sobre navegar

En Internet, mientras navegamos, todo ocurre de la forma: el navegador pide una página aun servidor web, el servidor web se encarga de hacer lo que tenga que hacer y construye la respuesta, y finalmente ésta respuesta se la envía al nevagador web. Hay una arquitectura cliente-servidor, donde el cliente (navegador) hace peticiones al servidor (servidor web) y éste le devuelve lo pedido.

Navegador ------------------> realiza petición ---------------------> Servidor Web
..el servidor procesa la petición, aquí PHP se ejecuta..
Navegador <------------------ recibe la petición <------------------- Servidor Web
PHP se ejecuta en el servidor, aunque también permite ejecutarse en línea de comandos, como el antiguo MSDos o el bash de Linux. Es decir, lo que programemos en PHP va a ejecutarse en el servidor web que tengamos antes de enviarsa nada a nuestros navegadores. PHP se usa para construir la respuesta que vemos en el navegador. Dicha respuesta puede contener noticias, un foro.. todo tipo de contenido dinámico generado según lo que se haya programado.

Herramientas

Vamos a necesitar, como para cualquier desarrollo web, unas herramientas:
  • Editor de texto: Notepad, Notepad++, Eclipse, Aptana Studio, Vi, Nano, Gedit.. cada cual con el que más le guste, si tienes experiencia con Eclipse recomiendo ver el Aptana Studio, si no mejor algo más simple para empezar como el Notepad++, si usas Linux no tendrás problema para encontrar el tuyo y tal vez ya tengas alguno bueno instalado. También los hay de pago como PhpStorm que últimamente está muy de moda.
  • Navegador web: imprescindible tener varios para probar en caso de querer máxima compatibilidad. Internet Explorer, Chrome, Opera, Firefox y Safari son los más utilizados. De entre ellos Firefox es que más respeta los estándares y ya todos suelen traer herramientas de desarrollador que nos faciliten la tarea.
  • Servidor web con PHP: ahora viene lo complicado, tenemos muchos servidores web disponibles y le podemos. Para programar nos puede valer con cualquiera decente que tenga PHP aunque no está de más elegir uno bastante estable y completo. Directamente recomiendo Apache en sus versiones XAMPP, WAMPP, LAMPP, Uniform Server para Windows o el propio Zend Server en su versión gratuita, que ya nos traerá todo el paquete listo para usar y no tendremos que meternos a hacer tareas de administrador de sistemas.
Una vez instalado y configurado todo podemos empezar con un primer proyecto para comprobar que todo funcione.

Primer proyecto

Doy por sentado unos conocimientos mínimos sobre programación, soltura en el manejo de tu ordenador, ficheros, directorios, etc..
Tenemos mucha información de instalación sobre cada servidor en Internet, las versiones de XAMPP son muy fáciles de instalar y seguro que siguiendo las instrucciones lo instalas rápidamente. En mi caso tengo instalado Uniform Server, que simplemente se descomprime y dentro de su carpeta tengo otra llamada ‘www’ que es donde apunta ‘localhost’. Configurar el servidor se sale del propósito de éste minitutorial así que tal vez en otro..

Cabe destacar que desde la versión 5.4.0 tenemos un servidor embebido que tan sólo instalando PHP. Es muy básico pero es simple para empezar. Entramos en línea de comando al directorio donde tenemos la web y ejecutamos lo siguiente:

C:directorioDeLaWebphp -S localhost:12345

Debemos tener el ejecutable de PHP en el path del sistema. Luego accediendo a http://localhost:12345/ podremos ver nuestro index.php o index.html

Una vez tengamos configurado el servidor elegido podremos acceder a http://localhost/ o al host virtual http://hostvirtual/ y vamos a crear nuestro primer ‘hola mundo’. Escribimos en un fichero de texto lo siguiente y lo ponemos en el directorio del servidor web donde está nuestro host:
<?php
echo "¡Hola mundo!";
?>
Una opción al clásico ‘hola mundo’ es mostrar la información del PHP instalado con lo siguiente veremos todas las variables de la instalación, así como la versión y otras configuraciones:
<?php
phpinfo();
?>
Debemos ver algo parecido a la imagen siguiente:

Terminando

Si te has instalado un entorno de desarrollo, un navegador, el servidor web y has conseguido ver en el navegador la imagen anterior del phpinfo te puedes dar por satisfecho. Espero pronto poder seguir escribiendo.

Para terminar no me queda más que remitirme a la documentación oficial de donde he sacado muchos conceptos. También hay muy buenas webs con más contenido sobre PHP, como por ejemplo el proyecto http://www.phptherightway.com/

Un saludo!

Joomla! Platform 4: Autocarga de clases con JLoader

2013-07-07 - Categorías: PHP
Empieza el domingo interesante. Un poco desesperado porque el framework de Joomla no tiene mucha documentación para usarlo independientemente del CMS pero ahí seguiré atento a los cambios, que seguro que algún día se convertirá en un framework de la categoría de Symfony o Codelgniter, por ejemplo. Con 2700 desarrolladores en todo el mundo, más de 6000 extensiones, con un 2,7% de portales en Internet que usan Joomla! ésto promete.
A fecha de hoy leo en los foros de grupos de desarrollo que con la separación de Joomla Platform del desarrollo del CMS se están cambiando los espacios de nombres y añadiendo más y más funcionalidades. Una de éstas últimas es el nuevo método para autocargar clases.

Con un ejemplo se ve bien sencillo:

<?php

// se importa la Plataforma Joomla.
require_once 'libraries/import.php';

// directorio base que se usa para el autocargador de clases
const JPATH_BASE = __DIR__;

// registra un prefijo cualquiera
JLoader::registerPrefix('Jnj', JPATH_BASE);

// crea una instancia de la clase nueva
$app = JApplicationWeb::getInstance("JnjUnDirectorioEjemploWeb");

// se supone que debemos guardar la applicación en el core
JFactory::$application = $app;

// y entonces podemos ejecutarla desde el core
JFactory::getApplication()->execute();

// así queda todo ordenado en el núcleo del framework

Éste podría ser un index.php del directorio principal. Con JLoader se establece un prefijo para las clases, en éste caso, ‘Jnj’. Ahora al cargar la instancia de la clase ‘JnjUnDirectorioEjemploWeb’, la clase se buscará en el directorio ‘/Un/Directorio/Ejemplo/web.php’ y la clase se deberá llamar ‘JnjUnDirectorioEjemploWeb’. Aquí abajo tienen la clase web para ejecutarlo:
<?php
class JnjUnDirectorioEjemploWeb extends JApplicationWeb {
    protected function doExecute()
    {
        $this->setBody("");
        $this->appendBody("<h1>Plataforma Joomla! Autocarga de clases con JLoader</h1>");
        $this->appendBody("Si estas viendo ésto en el navegador es que está bien la autocarga...");
    }
}
Los dos ejemplos y la estructura de directorios se pueden descargar aquí.
Para que funcione debemos tener el framework descomprimido en el mismo directorio raiz de la web, y ejecutarlo desde un navegador, como viene siendo costumbre en éstos minitutoriales.
Ahora eligiendo un prefijo, y organizando las clases del proyecto en directorios podemos ‘autocargar’ todo fácilmente sin tanto import o require. De manera dinámica el framework se encargará de todo.
Espero que sirva. Saludos.

Joomla! Platform 3: Bases de datos

2013-06-25 - Categorías: PHP
Ya llegó el calor, terminaron los exámenes de junio y parece que ya llega el verano, aunque hace poco aún estaba lloviendo en la costa mediterránea de España. Yo sigo con lo mío y hoy les traigo un acceso a bases de datos usando SQLite, una base de datos de dominio público, embebida, no necesita instalación y simplemente con que PHP tenga activada la extensión para ello ya podemos usarla.
Como viene siendo costumbre de la serie que escribo, me voy a centrar en el uso en un servidor web, con lo que el ejemplo es una página web. Se puede también ejecutar en línea de comando pero yo no uso PHP de esa forma así que… vamos al grano.


Materiales

  1. El framework Joomla Platform. Yo he usado la versión 12.3, la oficial veo que es la 12.1 y está en desarrollo la 13.1. Aquí hay más información para los curiosos como yo.
  2. Un entorno de desarrollo. Aquí ya para gustos estan los colores, Eclipse va muy bien y es multiplataforma.
  3. Un servidor para ejecutarlo. XAMPP funciona muy bien y también es multiplataforma.

Empezando

Descomprimo el framework en el directorio si es que no lo tengo ya, entonces hay que crear un fichero .php como en el ejemplo siguiente y veremos rápidamente como funciona:
...
<?php

// se importa la Plataforma Joomla.
require_once 'libraries/import.php';

class laWeb extends JApplicationWeb {
protected function doExecute()
{
$this->setBody("<html><body>");
$this->appendBody("<h1>Plataforma Joomla! SQLite</h1>");

// vector de configuración de la base de datos
// para sqlite sólo hace falta ésto
$option = array();
$option['driver'] = 'sqlite'; // tipo de bd
//$option['host'] = 'direccionhost.com'; // host
//$option['user'] = 'usuario'; //
//$option['password'] = 'contraseña'; //
$option['database'] = 'bdpruebas.sqlite'; // nombre de la bd
//$option['prefix'] = 'pref_'; // prefijo
$dbo = JDatabaseDriver::getInstance($option);

// se puede abreviar usando:
//$dbo = JDatabaseDriver::getInstance(array('driver' => 'sqlite', 'database' => 'bdpruebas.sqlite'));


// crea una tabla para las pruebas, la borra si existe
$dbo->setQuery("DROP TABLE IF EXISTS aleatorios");
$dbo->execute();
$dbo->setQuery('CREATE TABLE IF NOT EXISTS aleatorios (id INTEGER PRIMARY KEY, numero INTEGER)');
$dbo->execute();
$this->appendBody("<p>Creada la base de datos...</p>");

// inserta unos datos en la BD
for ($i = 0; $i < 10; $i++) {
$dbo->setQuery('INSERT INTO aleatorios (id, numero) VALUES (' . $i . ', ' . rand(0,99) . ');');
$dbo->execute();
}
$this->appendBody("<p>Insertados datos...</p>");

// lee la tabla
$this->appendBody("Listando con loadRowList ");
$dbo->setQuery("SELECT * FROM aleatorios;");
$resultados = $dbo->loadRowList();
foreach ($resultados as $res){
$this->appendBody( "<p>" . $res[0] . ", " . $res[1] . "</p>");
}

// lee la tabla de otra forma
$this->appendBody("Listando con loadAssocList ");
$dbo->setQuery("SELECT * FROM aleatorios;");
$resultados = $dbo->loadAssocList();
foreach ($resultados as $res){
$this->appendBody( "<p>" . $res['id'] . ", " . $res['numero'] . "</p>");
}

// lee de nuevo la tabla de otra forma
$this->appendBody("Listando con loadObjectList ");
$dbo->setQuery("SELECT * FROM aleatorios;");
$resultados = $dbo->loadObjectList();
foreach ($resultados as $res){
$this->appendBody( "<p>" . $res->id . ", " . $res->numero . "</p>");
}

$this->appendBody("</body></html>");

}
}

JApplicationWeb::getInstance("laWeb")->execute();
...

El ejemplo en descarga está aquí.

El resultado de ejecutarlo desde el navegador debe ser algo tal que así:

Plataforma Joomla! SQLite

Creada la base de datos…
Insertados datos…
Listando con loadRowList
0, 55
1, 4
2, 1
3, 76
4, 95
5, 62
6, 63
7, 16
8, 52
9, 73
Listando con loadAssocList
0, 55
1, 4
2, 1
3, 76
4, 95
5, 62
6, 63
7, 16
8, 52
9, 73
Listando con loadObjectList
0, 55
1, 4
2, 1
3, 76
4, 95
5, 62
6, 63
7, 16
8, 52
9, 73

Explicaciones

Lo que hace el programa es crear el archivo bdpruebas.sqlite si no existe, es un comportamiento peculiar de SQLite. Si usásemos otra base de datos como PostgreSQL o MySQL podríamos usar las sentencias SQL propias de cada base de datos. El código usa las funciones para cargar tablas de datos loadRowList, loadAssocList y loadObjectList. Ésto nos devuelve un objeto que almacenará los datos de la base de datos en nuestro programa. Hay otras funciones para cuando la consulta devuelve sólo una fila o sólo un dato por ejemplo.
Hasta aquí todo bien, pero entonces ¿porqué usar el framework y no usar directamente PHP como siempre sin framework?
Ahora a partir de las últimas versiones se han añadido más bases de datos aparte de la original MySQL, tenemos PostgreSQL, SQLServer, y se preveen el acceso a muchas otras. Ahora bien, tenemos una capa extra que nos va a independizar totalmente de la base de datos, siempre que no usemos las tradicionales sentencias SQL, como en el ejemplo anterior, y construyamos nuestra aplicación usando ésta herramienta. Puede que en un futuro querramos cambiar de base de datos o hacer posible que dicho cambio sea dinámico según configuración del usuario.

Independizando de la base de datos

La historia está en crear la query usando el framework. Tenemos la clase JDatabaseDriver que es la que nos provee de la conexión a la base de datos. Ahora sí, contruimos la $query usando la clase JDatabaseQuery y entonces obtendremos esa compatibilidad de las consultas, inserciones, actualizaciones y borrados de nuestro programa con varios tipos de bases de datos. He simplificado el ejemplo anterior:
...
<?php

// se importa la Plataforma Joomla.
require_once 'libraries/import.php';

class laWeb extends JApplicationWeb {
protected function doExecute()
{
$this->setBody("<html><body>");
$this->appendBody("<h1>Plataforma Joomla! Independizando de la base de datos</h1>");

//
$dbo = JDatabaseDriver::getInstance(array('driver' => 'sqlite', 'database' => 'bdpruebas.sqlite'));

// borrando los datos de la tabla aleatorios
// para tenerla limpia
$query = $dbo->getQuery(true);
$query->delete('aleatorios');
$dbo->setQuery($query);
$dbo->execute();

$this->appendBody("<p>Borrados los datos...</p>");

// inserta unos datos en la BD
for ($i = 0; $i < 10; $i++) {
// crear una nueva consulta
$query = $dbo->getQuery(true);

// se construye
$query->insert('aleatorios')
->columns('id, numero')
->values($i . ', ' . rand(0,99));

// se establece
$dbo->setQuery($query);

// se ejecuta
$dbo->execute();
}
$this->appendBody("<p>Insertados datos...</p>");

// consultado datos
$query->select('*')->from('aleatorios');
$dbo->setQuery($query);
$resultados = $dbo->loadObjectList();
foreach ($resultados as $res){
$this->appendBody( '<p>' . $res->id . ', ' . $res->numero . '</p>');
}

$this->appendBody("</body></html>");

}
}

JApplicationWeb::getInstance("laWeb")->execute();
...

Éste segundo ejemplo está en descarga aquí.

Utilizando la base de datos creada con el primer ejemplo, si guardamos éste segundo en otro fichero .php y lo ejecutamos en el navegador funcionará de forma similar. Ahora, si tenemos la base de datos distinta de SQLite, simplemente con cambiar la línea:
$dbo = JDatabaseDriver::getInstance(array('driver' => 'sqlite', 'database' => 'bdpruebas.sqlite'));
Haciendo la conexión con la base de datos que tengamos, nos aseguramos que el resto de consultas, inserciones, actualizaciones o borrados van a funcionar.

Terminando

Otra vez más, me remito para más información a la documentación oficial:

http://docs.joomla.org/J3.1:Accessing_the_database_using_JDatabasehttp://api.joomla.org/Joomla-Platform/Database/JDatabaseQuery.html#insert

Éste post al final se ha hecho bien largo, ¡otro testamento! xDD Es que las bases de datos lo merecen ¿no cree?

Espero que sirva.
Saludos.


Joomla! Platform 2: La fábrica de objetos de Joomla

2013-06-08 - Categorías: PHP
Hoy les escribo un poco más sobre Joomla y su framework de desarrollo en PHP, la Joomla Platform. Esto es una joya, aunque no se usa mucho de manera independiente al CMS puede ser que pronto se haga. Por lo menos mi opinión es que es un buen framework; simple, rápido y eficaz, una buena alternativa.
Siguiendo con la carnicería, sacando toda la casquería, las tripas y demás de todo lo que es el CMS y el framework. Y nos encontramos con la fábrica de objetos, la clase JFactory.
La fábrica de objetos se usa constantemente en el CMS, en el desarrollo de extensiones, y si queremos desarrollar un sitio web a partir del framework podemos usarla y de esta manera tendremos todo el proyecto mejor estructurado.

Materiales

  1. El framework, Plataforma Joomla para los amigos.
  2. Un entorno de desarrollo o editor de texto: Eclipse, Notepad++, Gedit, Vi, Notepad o el que sea que use..
  3. Un servidor web con PHP: Va muy bien el XAMPP

El ejemplo

Con ésto pequeño ejemplo se puede ver una forma muy simple de usar el framework:

...
<?php

// se importa la Plataforma Joomla.
require_once 'libraries/import.php';

// en éste ejemplo tan simple la clase la pongo aquí pero
// se debería poner en otro fichero
class laWeb extends JApplicationWeb {
protected function doExecute()
{
$this->setBody("<html><body>");
$this->appendBody("<h1>Plataforma Joomla! probando la fábrica</h1>");

// declara una variable que es un objeto para trabajar con emails
$emiliator = JFactory::getMailer();
$this->appendBody("<p>Versión de MAILER de la plataforma: " . $emiliator->Version);

$this->appendBody("</body></html>");

}
}

// instancio un objeto de la aplicación web
$app = JApplicationWeb::getInstance("laWeb");

// guardo la aplicación en el core
JFactory::$application = $app;

// uso la aplicación web que guardé directamente desde el core
JFactory::getApplication()->execute();
...

Descargar archivo con el ejemplo.

JFactory es un objeto, que sirve para acceder al núcleo del framework, es decir, nos va a dar acceso a todo tipo de objetos que, al instanciarlos en nuestro programa, podremos usarlos y ahorrarnos el desarrollo de éstos.

Explicaciones

En el ejemplo he usado la función getMailer() para tener acceso al objeto de tipo JMail que tenemos en el framework. Es una interfaz con la que podremos construir en un email con destinatario, asunto, mensaje, etcétera… y configurando los parámetros del servidor de email podríamos enviar.
Hay muchos otros objetos, para hacernos una idea general, la fábrica de Joomla nos proporciona las siguientes funciones con las que acceder a éstos:
  • getACL: para manejo de autorizaciones.
  • getApplication: almacena la aplicación.
  • getCache: la caché.
  • getConfig: las configuraciones del sitio.
  • getDate: para manejo de fechas.
  • getDbo: manejo de bases de datos.
  • getDocument: manejo de documentos de varios tipos.
  • getEditor: el editor.
  • getFeedParser: te da un XML ya parseado.
  • getLanguage: el lenguaje.
  • getMailer: el mailer del ejemplo.
  • getSession: manejo de sesiones.
  • getStream: manejo de esos objetos tan útiles a veces, los streams.
  • getURI: para URIs.
  • getUser: el usuario.
  • getXML: para manajar ficheros XML.
Me remito a la documentación oficial, como siendo costumbre para más información sobre cada función: http://api.joomla.org/
Podemos ver la implementación completa de la JFactory en el archivo /libraries/joomla/factory.php
Me siento friki de nuevo, otros leen, juegan a videojuegos… cuando tienen tiempo. Yo me complico la vida tratando de averiguar cómo los desarrolladores de Joomla, han hecho el CMS y su framework, me saltan chispas y estoy hechando humo, pero lo he disfrutado.. ¿éso es de friki no? xD Espero haber dado algo de luz sobre la JFactory.
Para cualquier mensaje, aquí abajo lo pueden dejar.
Un saludo.

© 2024 JnjSite.com - MIT license

Sitio hecho con WordPress, diseño y programación del tema por Jnj.