A través de la herencia, una clase hija hereda de su padre los atributos y métodos, de manera que si por ejemplo tenemos una clase padre “Figura” con un atributo “área”, y dos clases hijas: “Rectángulo” y “Triángulo”.
En PHP la palabra clave para definir la herencia es: “extend” y la forma en que se define es:
El constructor y los atributos, “base” y “altura” están definidos en la clase “Figura”. El método “área” es propio de cada hija. Veamos la implementación y el resultado:
<?php class Figura { protected $base; protected $altura; function __construct($base, $altura) { $this->base = $base; $this->altura = $altura; } } class Rectangulo extends Figura { function area(){ return $this->base * $this->altura; } } class Triangulo extends Figura { function area(){ return $this->base * $this->altura /2; } } $rectangulo = new Rectangulo(2,2); $triangulo = new Triangulo(2,2); echo "<div>Para base = 2 y altura = 2: <ul> <li>Área para el rectángulo: " . $rectangulo->area() . ">/li> <li>Área para el triángulo: " . $triangulo->area() . "</li> </ul> </div>" ?>
Corregir errores en CSS – Kabytes
¡Hola a todos!
Acaba de lanzarse el quincuagésimo tercer número de El podcast de Linux Hispano, un podcast sobre Linux y Software Libre.
Tal como lo prometí, en este episodio hablaré sobre la vida y obra de Richard Stallman, fundador de GNU y del movimiento del Software Libre.
GUIÓN:
Richard Stallman: Vida, obra, opinión personal y curiosidades.
ESCUCHA EL PODCAST:
DESCÁRGATE EL PODCAST: MP3, OGG.
SUSCRÍBETE AL PODCAST: PC, Apple, Android (feed), otro.
Gracias a todos los correos electrónicos que nos habéis enviado, así como los comentarios, lo hemos leído y contestado todos y gracias a ellos nos esforzamos por mejorar.
Otro concepto importante de la orientación a objetos es la sobrecarga de funciones. En lenguajes que no permiten la sobrecarga debemos definir dos métodos distintos (con nombre distinto) para poder trabajar con dos funciones que hacen lo mismo, pero reciben distintos tipos de datos. La sobrecarga es muy importante para el constructor ya que normalmente tendremos distintas formas de crear la clase.
En PHP no existen las sobrecargas como tal. Sin embargo, existen mecanismos para imitarla. Como ya he dicho, la sobrecarga es muy importante en el caso del constructor, así que haremos el ejemplo siguiente, sobrecargando esta función.
El mecanismo que seguimos para imitar a la sobrecarga es usar los atributos opcionales. Imaginad que queremos tener dos constructores distintos:
La implementación, sería tal como indicamos a continuación (tenemos que poner el parámetro $id al final para poder jugar con los atributos opcionales):
function __construct($nombre, $apellidos, $codigoPostal, $id = 0)
{
if($id != 0)
{
$this->id = $id;
$this->nombre = $nombre;
$this->apellidos = $apellidos;
$this->codigoPostal = $codigoPostal;
}
else
{
$this->id = rand(0,100);
$this->nombre = $nombre;
$this->apellidos = $apellidos;
$this->codigoPostal = $codigoPostal;
}
}Al poner el identificador al final, igualado a cero en la declaración, lo que le estamos diciendo al compilador es que:
$usuario_1 = new Usuario("José", "Gómez Martínez", 14004); $usuario_2 = new Usuario("José", "Gómez Martínez", 14004, 10);
Ya podemos descargar el número 38 de la revista Tux Info. Este mes los temas tratados son:
Últimamente llevo insistiendo en la temática de HTML y Javascript. No es para menos, me parecen tecnologías con mucho futuro a pesar de que el lenguaje Javascript tenga mucho que mejorar.
Debido a mi afán de estas tecnologías, aquí os dejo Milokoban, el típico juego de empujar cajitas. Lo publiqué hace un año tanto en mi web como en Android y pongo a vuestra disposición el código fuente. La licencia es GPLv3. ¡Espero que os guste! 😀
Juego:
Código fuente: milokoban.zip.
Android Market: Milokoban.
Constructor
El constructor en PHP se define como se muestra a continuación:
function __construct($id, $nombre, $apellidos, $codigoPostal){
$this->id = $id;
$this->nombre = $nombre;
$this->apellidos = $apellidos;
$this->codigoPostal = $codigoPostal;
}Como podéis apreciar, es una función, con un nombre determinado “__construct” que recibe los parámetros necesarios para la clase y los asigna a los atributos de la clase.
Creando nuestra primera clase
Con todo lo que ya hemos explicado, podemos crear un ejemplo completo. Crearemos un par de objetos inicializándolos con unos valores que introduciremos nosotros y luego los mostraremos por pantalla. Para representarlo haremos uso de HTML.
Si en lugar de incluir nosotros los datos a mano, los incluyéramos a través de, por ejemplo, una conexión con una base de datos MySQL, en la que la clase también apareciera como una tabla, estaríamos creando las bases para una completa aplicación de usuarios con base de datos, que a la vez de fácil de implementar, sería fácil de modificar, mantener y mejorar.
Crearemos los objetos llamando al constructor, los insertaremos en un array y al final, los mostraremos por pantalla recorriendo el array de objetos que acabamos de crear. Usaremos las funciones de acceso a los atributos, ya que si intentamos acceder directamente a ellos nos devolverá el siguiente error al tratarse de atributos privados: “Fatal error: Cannot access private property Usuario::$id”.
<?php include("clases.php"); $vector_usuarios = array(); $tmp = new Usuario(1, "José", "Gómez Martínez", 14004); array_push($vector_usuarios, $tmp); $tmp = new Usuario(2, "Javier", "Pérez García", 28080); array_push($vector_usuarios, $tmp); $tmp = new Usuario(3, "Jorge", "Reina Ramírez", 18001); array_push($vector_usuarios, $tmp); echo "<h2>Ejemplo orientación a objetos con PHP para Linux Hispano</h2>"; foreach($vector_usuarios as $elemento_vector) { echo "<div> <h3>Usuarios sistema</h3> <ul> <li>Id. - " . $elemento_vector->getId() . "</li> <li>Nombre - " . $elemento_vector->getNombre() . "</li> <li>Apellidos - " . $elemento_vector->getApellidos() . "</li> <li>Código postal - " . $elemento_vector->getCodigoPostal() . "</li> </ul> </div>"; } ?>
Últimamente venía notando que mi equipo no dejaba de usar los ventiladores aunque pensara que no estaba haciendo un uso excesivo de la CPU como para que requiera mejor ventilación. Así pues, me doy cuenta de que el sensor de los ventiladores no es detectado y que siempre están al 100%.
Para algunos estos puede ser una ventaja, pero esta claro que en el día en que vivimos y con la de avances tecnológicos que tenemos, usar un dispositivo sin control mientras que sí podemos controlarlo puede parecer absurdo, de hecho lo es. El ventilador debe de ser controlado en función del nivel de temperatura de nuestro equipo.
Lo primero que haremos será declarar la clase con sus atributos en PHP. La operación es muy similar a la declaración de un struct en C o de otro elemento similar en otro lenguaje.
Comenzaremos definiendo los atributos. Delante de cada uno indicamos el tipo de atributo del que se trata (público, privado o protegido). Si no indicamos nada, el atributo será considerado público (además, es posible que nos lance algún tipo de advertencia el intérprete de PHP).
¿Qué es eso de público, privado y protegido?
Como éste es un artículo de introducción a la programación orientada a objetos con PHP no voy a centrarme demasiado en definir estos términos, ni otros relacionados como la herencia o el polimorfismo.
Pasemos a implementar ya la creación de nuestra clase usuario siguiendo el diseño propuesto en el punto anterior.
class Usuario{
private $id;
private $nombre;
private $apellidos;
private $codigoPostal;
}Pero si son privados, ¿cómo accedemos a los atributos? La solución es crear métodos, funciones propias de la clase, pública que accedan al atributo.
¿Qué ventajas tenemos con esta metodología? Aunque en este caso el acceso va a ser directo, en casos donde haya que realizar una comprobación, nos aseguramos que los objetos de la clase siempre tienen datos válidos, además de ocultar la implementación interna de la clase, creando una caja negra mucho más útil en grandes proyectos. Por ejemplo, un método “setNIF” en el que antes de igualar el atributo al valor enviado por el usuario, se compruebe si la letra del NIF es válida, y en caso de no serlo, no se almacene el nuevo valor.
Veamos la implementación de esos métodos dentro de la clase.
function getId(){ return $this->id; } function setId($id){ $this->id = $id; } function getNombre(){ return $this->nombre; } function setNombre($nombre){ $this->nombre = $nombre; } function getApellidos(){ return $this->apellidos; } function setApellidos($apellidos){ $this->apellidos = $apellidos; } function getCodigoPostal(){ return $this->codigoPostal; } function setCodigoPostal($codigoPostal){ $this->codigoPostal = $codigoPostal; }