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.

Descargar un fichero vía web y enviarlo por email con PHP

2016-06-06 - Categorías: GNU/Linux / PHP
Logo de PHP

Este es otro pequeño how to para hacer una tarea rutinaria. Simplemente, como indica el título de la entrada, se hace lo que dice, en este caso mediante PHP. Esta tarea se puede programar en línea de comandos para ejecutarse todos los días. Es algo habitualmente necesario, y ya que PHP es un lenguaje de scripting muy sencillo y a la par potente, vamos a ver cómo hacer esto sin complejos sistemas intermedios.

Para este manual se usa Linux, y se ha probado sobre Ubuntu 14.

Continuar leyendo..

Magento 2: conociendo a la bestia parda

2015-12-07 - Categorías: Magento / PHP
Magento back-end

De todos las soluciones de tienda online que he conocido hasta la fecha, Magento es de lo más robusto y potente que he visto de código abierto. Estoy conociendo poco a poco los entresijos de Magento 1 en el trabajo, y es buen momento de ver las mejoras que trae Magento 2 y así cotejar.

Es un sistema de información dedicado a la venta robusto, flexible y muy personalizable. Alrededor de Magento se mueve todo un ecosistema de soluciones empresariales de la más alta gama. Todo esto es posible gracias a las características de Magento.

Para explicar todo lo que tiene Magento necesitamos mucho tiempo, terminaríamos antes buscando qué no tiene. Pero también encontrar qué no tiene va a ser difícil porque Magento es todo un referente mundial de las soluciones eCommerce existentes.

Un poco de historia

Nació como proyecto de código abierto en el 2007. Ya en el 2008 fue premiado como mejor nuevo proyecto de código abierto del año. En el año 2009 la empresa Varien lanzó la versión Enterprise con el modelo de negocio de suscripción anual. Ahora mismo es propiedad de Ebay, la cual es propietaria del 100% de la empresa.

Lanzaron también una versión Profesional, pero no debe de haber tenido mucho éxito esta segmentación porque ahora mismo sólo disponemos de la Community Edition y la Enterprise Edition.

Requisitos para la instalación

Instalando Magento

Se necesita de una buena máquina para correr Magento, por lo menos se recomiendan 2 Gigas de RAM y échale CPUs que cuantos
más mejor. Yo le he puesto una máquina virtual con Vagrant de 4 Gigas de RAM y 2 CPUs. Se ha dejado instalar después de preparar un poco el servidor sin demasiadas configuraciones.

Instalando

Haciendo unas pruebas jugueteando con Vagrant, me ha quedado un script bien sencillo. Ejecutando lo siguiente tenemos automatizada la instalación de todo lo necesario en un servidor Linux para poder instalar Magento 2. Dejo aquí el script para Ubuntu Server con todo en el mismo servidor, Apache y MySQL:

apache_config_file=”/etc/apache2/envvars”
apache_vhost_file=”/etc/apache2/sites-available/magentohost.conf”
php_config_file=”/etc/php5/apache2/php.ini”
mysql_config_file=”/etc/mysql/my.cnf”

sudo apt-get -y install build-essential binutils-doc git npm nodejs htop apache2
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/server.key -out /etc/ssl/server.crt -subj “/C=ES/ST=Alicante/L=Alicante/O=MiMagento2/OU=IT Department/CN=mimagento2.local” -passin pass:””
cat <<EOI > ${apache_vhost_file}
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
LogLevel debug

ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined

<Directory /var/www/html>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:443>
DocumentRoot /var/www/html
LogLevel debug

ErrorLog /var/log/apache2/error.ssl.log
CustomLog /var/log/apache2/access.ssl.log combined

<Directory /var/www/html>
Options Indexes Includes
Require all granted
</Directory>

SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /etc/ssl/server.crt
SSLCertificateKeyFile /etc/ssl/server.key
</VirtualHost>
EOI

sudo a2dissite 000-default
sudo a2ensite magentohost.conf
sudo a2enmod rewrite ssl
sudo service apache2 reload

sudo apt-get -y install php5 php5-curl php5-mysql php5-sqlite php5-xdebug php5-mcrypt php5-gd php5-intl php5-xsl
sudo php5enmod mcrypt
sudo sed -i “s/display_startup_errors = Off/display_startup_errors = On/g” ${php_config_file}
sudo sed -i “s/display_errors = Off/display_errors = On/g” ${php_config_file}

sudo service apache2 reload

php -r “readfile(‘https://getcomposer.org/installer’);” | php
sudo mv composer.phar /usr/local/bin/composer
sudo chown root:root /usr/local/bin/composer
sudo chmod 755 /usr/local/bin/composer

# Instalar MySQL, la contraseña de root es root
echo “mysql-server mysql-server/root_password password root” | sudo debconf-set-selections
echo “mysql-server mysql-server/root_password_again password root” | sudo debconf-set-selections
sudo apt-get -y install mysql-client-5.6 mysql-server-5.6

sudo sed -i “s/bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/” ${mysql_config_file}

# Permitir acceso como root desde cualquier host
echo “GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ IDENTIFIED BY ‘root’ WITH GRANT OPTION” | mysql -u root –password=root
echo “GRANT PROXY ON ”@” TO ‘root’@’%’ WITH GRANT OPTION” | mysql -u root –password=root

sudo service mysql restart

echo “CREATE DATABASE magento2” | mysql -u root –password=root

Hay quien preferiría Nginx porque en sus inicios ejecutaba en multiples hilos de ejecución las peticiones HTTP, es ligero y sencillo. Ha llovido mucho desde que Nginx era el servidor más rápido del mercado con creces, viendo las últimas estadísticas comparativas entre Apache2 y Nginx más o menos van a la par en la fecha en que les escribo. No es objetivo hacer una comparativa Nginx-Apache en esta entrada así que lo dejaremos para otro momento si cabe.

A partir de aquí ya tenemos el servidor web Apache configurado con PHP, y una base de datos MySQL con la base de datos magento2 ya creada que usaremos para instalar nuestro nuevo Magento. También tenemos instalado globalmente en el sistema Composer, que cuando recién descomprimamos el nuevo magento y vayamos a instalar nos va a pedir que instalemos todas las librerías de PHP.

Descargamos la versión de Magento 2 en un fichero comprimido aquí:
https://www.magentocommerce.com/download

O si preferimos descargar desde el repositorio de códigos fuentes aquí:
https://github.com/magento/magento2/releases

Lo ponemos en el directorio del host principal de Apache que hemos configurado en /var/www/hml, vamos al directorio e instalamos las librerías de PHP:

cd /var/www/html
composer install

Ahora nos queda conectarnos a http://localhost/ para seguir las instrucciones de instalación. Si no vemos una imagen como la del instalador de arriba es que algo no ha ido bien. Para más información sobre Composer y cómo instalarlo de forma global, aparte del script de aquí arriba, podemos consultar una entrada del blog sobre esto o podemos ver las bondades de Composer y cómo la comunidad PHP se está organizando en librerías.

Después de la instalación

Instalación de Magento terminada con éxito

Tras esto podemos ver conectándonos a la base de datos que partimos de las no pocas 308 tablas, para empezar. Esto nos da una idea de la magnitud del programa que tenemos entre manos ¿cierto?

Las tareas cron, cachés..

El cron del sistema es el programador de tareas. Cuando recién hemos hecho la instalación, el panel de control nos notificará que instalemos las tareas automáticas para que funcione Magento o que las lancemos manualmente.

Esto hace necesario que tengamos acceso como root, como administradores del sistema, para que podamos configurar estas tareas en el servidor. No podemos instalar Magento en cualquier alojamiento web. O mejor dicho, sí que podemos, pero el funcionamiento va a ser una castaña si no hacemos los ajustes necesarios.

Otro tema que hace necesario un host con acceso como root son las cachés. En un sistema web tenemos caché de base de datos, compilación a bytecodes de PHP, generación de páginas HTML a partir de vistas. Y el gran Varnish, otro elemento a instalar y configurar para sacar el máximo partido a las prestaciones de nuestro servidor, aunque no es imprescindible tenerlo (al contrario de lo que dicen muchos administradores de sistemas). Evitar Varnish si no es necesario, como escuché a un experto en Magento en el último Meet Magento en España, nos puede aliviar las configuraciones ya que a veces este proxy inverso se mete en medio necesitando de más y más configuraciones a medida que instalamos extensiones o personalizamos nuestro Magento.

El sistema de cifrado SSL

En el script de instalación se crea un certificado autofirmado y se guarda en /etc/ssl/. A fecha de hoy ya queda poco para poder crear nuestros propios certificados 100% funcionales, para el entorno de producción o desarrollo, tantos como queramos, con Letsencrypt, pero mientras este sistema nos servirá.

Es de buena costumbre poner el cifrado en la zona de administración (back-end) y en el front-end. Para ello tenemos que configurar las URL base seguras y no seguras poniéndole el https delante. Por defecto se cifrará toda la navegación desde el momento en que haya datos personales de los usuarios. En el back-end se cifrará en todo momento.

Si vas a instalarlo en producción asegúrate de que esté todo funcionando antes de activar SSL en todo el sitio. Tener SSL mejorará el posicionamiento del sitio en los buscadores, pero me ha pasado que una extensión te fastidie todo porque no funcione correctamente, así que más vale probar y probar antes de dejarlo activado definitivamente. Aquí dejo la información para el que le sirva 😉

Características principales

Informes de inteligencia de negocio de Magento

Las bondades de Magento son una larga lista de características así que de entre las principales tenemos:

  • Multi-sitio web (varios dominios), multi-almacén y multi-vista de almacén, todo con un mismo panel de administración.
  • Multi-idioma, con packs de idiomas disponibles para instalar como extensiones.
  • Gestión total del catálogo; categorías y productos.
  • Gestión muy potente de atributos de productos.
  • Filtrado de productos para mejorar la navegación basado en atributos y características muy avanzado.
  • Integración con pasarelas de pago para poder instalar como extensiones.
  • Registro detallado que nos informa del estado actual con todo lujo de detalles: últimas ventas, ingresos, productos más vendidos..
  • Gestión de datos de clientes, registro, modificación.
  • Gestión de los usuarios que acceden al panel de administración.
  • Ventas; pedidos, facturas, facturas rectificativas, envíos..
  • Herramientas de marketing como emails transaccionales configurables, reglas de precios de catálogo o de carrito, herramientas SEO integradas.
  • Gestión de promociones basadas en características de productos o de carritos de la compra. Se pueden utilizar atributos personalizados para las reglas de promociones.
  • Temas para instalar; sistemas de páginas estáticas, bloques y widgets para personalizar.
  • También tenemos inteligencia de negocio con muchos informes detallados listos para ver en tiempo real.
  • Un sistema de gestión de índices y caché.
  • Muchas extensiones para personalizar nuestro Magento en su marketplace.
  • Por supuesto, acceso para interconectar con otros sistemas mediante punto de entrada a una API.
Home del panel de administración de Magento

Magento es enorme, parece el SAP de las soluciones eCommerce Open Source. Soy sincero, no conozco SAP en sus entrañas, pero ya sólo ver que tenemos 300 tablas para guardar los datos necesarios para funcionar me hice una idea. Entrar a detallar las características de cada zona de su panel de administración es una tarea interminable así que será mejor ir directamente a su funcionamiento, empaparse de su documentación, o ir buscando lo que necesites. Recomiendo dar una lectura rápida a las guías de usuario disponibles en su página oficial.

Terminando

Lo que destaca de esta solución eCommerce es su robustez y fiabilidad. Estoy viendo muchas mejoras en la versión 2 con respecto a la 1: aumento de velocidad, sistema totalmente cacheado, compatible con HHVM.. Destaca la integración de la herramienta de consola de Symfony. Tenemos disponible la integración con Odoo mediante la instalación de una extensión en Magento, se abre el acceso al Webservice, e instalando los módulos correspondientes en Odoo podremos sincronizar catálogo, stocks, clientes, pedidos, carros abandonados, etc.. esto último está disponible hasta para la versión 1.9, espero que pronto esté también para Magento 2 😉

Magento 2 front Luma

Al instalar los códigos me sorprendió que me pidiera ejecutar un ‘composer install’ para comenzar a correr la aplicación. Composer es una herramienta que organiza las librerías PHP, algo que venía haciendo falta. Es una herramienta PHP muy nueva, que están usando frameworks de desarrollo de la talla de Symfony o Laravel. Esto me hace preveer que el código fuente de Magento 2 puede incorporar pronto muchas nuevas mejoras del mundo PHP. Estaremos atentos.

Si has estado probando soluciones como Virtuemart, WooCommerce o Prestashop. Esta solución de código libre es más que interesante. Habrá que valorar qué es lo que necesitas para tu caso, pero lo que si puedo asegurar es que Magento es una gran solución.

El único inconveniente que le veo es que, por lo menos aquí en Spain donde resido, hay muy pocos desarrolladores especializados en Magento. Así que toma el dato, si quieres asegurarte el trabajo, aprende a desarrollar para Magento y no te faltará el trabajo.

Espero que haya dado una buena visión al sistema.

Un saludo.


PHP 11: Los traits, reutilizando funciones

2014-08-10 - Categorías: PHP

Sigo repasando las nuevas formas de programar que traen las últimas versiones de PHP. Así siguiendo un poco con la reutilización de código llego a los traits, que son una forma muy sencilla de tener funciones o variables en un sitio que luego puedo reutilizar fácilmente.

Desde PHP 5.4 que tenemos ésto disponible así que…

Venga, vamos con el ejemplo:

<?php
trait MiLibreria1 {
 public function funcion1() {
  echo 'Funcion1 ';
 }
 public function funcion2() {
  echo 'Funcion2 ';
 }
}
trait MiLibreria2 {
 public function funcion3() {
  echo 'Funcion3 ';
 }
 abstract public function funcion4();
 public static $variable1 = 'variable1';
}
class MiTipoDeObjeto {
 use MiLibreria1, MiLibreria2;
 // debemos implementar ésta función porque es abstracta
 public function funcion4(){
  echo 'Function4 ';
 }
}

$objeto = new MiTipoDeObjeto();
// funciones 'heredadas'
$objeto->funcion1();
$objeto->funcion2();
$objeto->funcion3();
$objeto->funcion4();
// variable estática 'heredada'
echo MiTipoDeObjeto::$variable1;

El código habla por sí sólo, es muy sencillo tener funciones o variables en un trait y luego usarlas dentro de una clase con la palabra reservada use. En éste caso tenemos dos librerías que se usan dentro de una clase.

También podemos hacer funciones y variables privadas, estáticas y abstractas como con las clases normales. De igual manera que las funciones abstractas de clases cuando se heredan a los objetos hijos, éstos deben implementarlas, con los traits ocurren lo mismo. De igual forma que las funciones, variables o métodos estáticos en las clases, también podemos usarlos con traits.

La principal diferencia es que podemos usar tantos traits como queramos en una clase.

Espero que haya servido. Para más información me remito a la documentación oficial:
http://php.net/manual/es/language.oop5.traits.php

Un saludo!


PHP 10: Objetos a partir de otros, las interfaces

2014-08-03 - Categorías: PHP
Siguiendo con la serie de mini-tutoriales para empezar a programar con PHP, ahora vamos con las interfaces..

Vienen a ser el siguiente paso en la encapsulación de objetos. Primero teníamos las clases que representan objetos únicos, con los cuales podemos construir otros a partir de ellos utilizando la palabra ‘extends’. Luego podíamos declarar clases abstractas que tenían métodos abstractos que no se implementaban (programaban) en la clase padre, sino que se obligaba a que se implementaran en las clases hijas. Las clases hijas extendían de la clase abstracta padre de igual manera que antes.

Ahora tenemos las interfaces, que vienen a ser clases que simplemente nos dicen los métodos que hay que implementar en las clases hijas. Unas interfaces se pueden extender en otras, con lo que heredan las declaraciones de los métodos utilizando la palabra clave extends, pero siguen sin implementar los métodos porque siguen siendo interfaces. Pero cuando llegamos a una clase hija que va a implementar dichos métodos utilizaremos la palabra clave implements. Con un ejemplo se verá claro y rápido.

El ejemplo

<?php

error_reporting(E_ALL);
ini_set('display_errors', '1');

// interfaz que obliga a implementar dos funciones
interface iVehiculo {
    public function escribirMatricula();
    public function coordenadas();
}

// clase que implementa la interfaz anterior
class vehiculo implements iVehiculo {
 public $x=0;
 public $y=0;
 public $matricula;
 
 public function coordenadas(){
  return '(' . $this->x . ', ' . $this->y . ')'; 
 }
 
 public function escribirMatricula() {
  return $this->matricula;
 }
}

// moto de tipo vehiculo que hereada las variables y funciones anteriores
class moto extends vehiculo  {

    public $velocidadMaxima;

    // funcion que devuelve los datos para escribirlos en la respuesta
    public function __toString(){
     $cadena = 'Esto es una moto con matrícula ' . $this->escribirMatricula() 
     . ', con velocidad máxima ' . $this->velocidadMaxima 
     . ' y coordenadas ' . $this->coordenadas() . '. <br>';
     
     return $cadena;
    }
}

// coche que hereda de vehiculo de igual manera que moto
class coche extends vehiculo {

    public $tipo;

    // igual que en moto, funcion que devuelve los datos para escribirlos en la respuesta
    public function __toString(){
     $cadena = 'Esto es un coche con matrícula ' . $this->escribirMatricula()
     . ', de tipo ' . $this->tipo
     . ' y coordenadas ' . $this->coordenadas() . '. <br>';
      
     return $cadena;
    }
}

$micoche = new coche();
$mimoto = new moto();

// tanto la moto como el coche tienen matrícula
// porque heredan la variable matrícula
$micoche->matricula = "ABC123";
// sólo es coche tiene tipo
$micoche->tipo = "utilitario";
$mimoto->matricula = "DEF123";
// sólo la moto tiene velocidad máxima
$mimoto->velocidadMaxima = 300;

echo '<html lang="es"><head><meta charset="utf-8"></head><body>';
echo $micoche;
echo $mimoto;
echo '</body></html>';

Si ejecutamos el script anterior debemos ver lo siguiente:

Esto es un coche con matrícula ABC123, de tipo utilitario y coordenadas (0, 0). Esto es una moto con matrícula DEF123, con velocidad máxima 300 y coordenadas (0, 0).

Resumiendo, las interfaces son una forma sencilla de obligar a programar de cierta manera las clases que implementan dicha interfaz. Un dato importante es que una clase puede extender sólo de otra, mientras que puede implementar varias interfaces. A fecha en que escribo no tenemos herencia múltiple en PHP, técnicamente las interfaces no nos dan herencia entre objetos, simplemente nos orientan sobre los métodos o funciones que debemos programar en las clases.

Documentación oficial: http://php.net/manual/es/language.oop5.interfaces.php


PHP 9: Objetos, clases y métodos abstractos

2014-04-20 - Categorías: PHP

Otro fin de semana, ésta vez con festivos por la semana santa. Tengo algo de tiempo así que voy a continuar con los minitutoriales para aprender sobre éste apasionante lenguaje de programación que tanto se está usando en el desarrollo de páginas web.

Según las últimas estadísticas que he estado viendo, ronda el 80% de las páginas web que estan hechas con PHP. Aparte de otros lenguajes que se usan junto con PHP como JavaScript, o los lenguajes de marcado.

Siguiendo con la construcción de objetos a partir de otros vamos ahora con las clases abstract.

Empezando

En el tutorial anterior veíamos como extender clases creando clases hijas que heredaban las variables y métodos de la clase padre. No teniendo entonces que volver a programar el mismo código.

Una clase abstract es cualquier clase que tenga al menos un elemento abstracto. Éstos elementos abstractos no deben programarse en la clase padre y es obligatorio hacerlo en las clases hijas. Por ejemplo:

<?php

// clase base
abstract class vehiculo {

public $matricula;

abstract public function escribirMatricula();
}

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

public $velocidadMaxima;

public function escribirMatricula() {
echo $this->matricula;
}

}

class coche extends vehiculo {

public $tipo;

public function escribirMatricula() {
echo $this->matricula;
}

}

class camion extends vehiculo {

public $numeroRuedas;

public function escribirMatricula() {
echo $this->matricula;
}

}

// 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;

$micoche->escribirMatricula();
echo " - ";
$mimoto->escribirMatricula();
echo " - ";
$micamion->escribirMatricula();

No tiene más historia, las clases abstractas lo que hacen es declarar métodos abstractos que no se implementan, y nos obligan a implementarlos en las clases hijas.

Como vienen siendo costumbre de nuevo me remito a la documentación oficial:

http://www.php.net/manual/es/language.oop5.abstract.php

..donde puede encontrar mucha más información sobre ésto y ejemplos mucho más elaborados. Espero que con mi mini-ejemplo haya ayudado, sino mensaje aquí abajo 😉

Un saludo y felices fiestas!


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

© 2021 JnjSite.com - MIT license

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