Curso PHP orientado a objetos – Clases de terceros, encapsulamiento

Una de las grandes ventajas, además de todas las ya explicadas y comentadas, es la facilidad con que se puede encapsular todo, para que en desarrollos posteriores no haya problema alguno. La implementación pasa a un segundo plano y se utiliza como una caja negra que funciona de manera simple. Los atributos: públicos, privados y protegidos; que hemos comentado en un punto anterior, son la base del encapsulamiento.

Imaginad que en una aplicación web, necesitamos generar un fichero PDF o interactuar con el servidor de correo de Gmail o Google Apps. Como es lógico, sería costoso perder tanto tiempo en desarrollar algo de cierta dificultad y que ya existe. La solución, encontrar una clase que se encargue de alguna de estas labores. Quien dice estas dos labores, dice otras muchas, pero he puesto estos dos ejemplos porque he tenido que hacer uso de los mismos hace no mucho.

¿Cómo utilizar dichas clases?

Lo primero es encontrarlas. Por ejemplo, en el caso de interactuar con el servicio de correo de Google tenemos PHP Mailer. Las clases se presentan en ficheros fuente de PHP que deberemos agregar convenientemente a nuestro código con algunas de las instrucciones (elegiremos cada una en función a nuestras necesidades) que mostramos a continuación y que seguro que habéis usado en más de una ocasión:

  • require(ruta_fichero);
  • include(ruta_fichero);
  • require_once(ruta_fichero);
  • include_once(ruta_fichero);

Una vez agregado a nuestro código ya podremos interactuar con ella. Primero la instanciaremos y luego interactuaremos con sus atributos y sus métodos. Con PHPMailer podríamos hacer algo así:

<?php require_once 'class.phpmailer.php'; $correo = new PHPMailer (); $correo->From = "nombre_usuario@gmail.com"; $correo->FromName = "Foo"; $correo->AddAddress ("destinatario@dominio.com"); $correo->Subject = "Mensaje de parte del equipo Linux Hispano"; $correo->Body = "<h3>Enviando con Gmail<h3/>"; $correo->IsHTML (true); $correo->IsSMTP(); $correo->Host = 'ssl://smtp.gmail.com'; $correo->Port = 465; $correo->SMTPAuth = true; $correo->Username = 'nombre_usuario@gmail.com'; $correo->Password = '******'; if(!$correo->Send()) { echo 'Ha ocurrido un error: ' . $mail->ErrorInfo; } else { echo 'Correo enviado con éxito'. } ?> read more

Leer más » 6 Comentarios

Curso PHP orientado a objetos – Herencia

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”.

Árbol de herencia

En PHP la palabra clave para definir la herencia es: “extend” y la forma en que se define es:

  • class Padre
  • class Hija extends Padre

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>" ?> read more

Leer más » 5 Comentarios

Curso PHP orientado a objetos – Sobrecarga

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:

  • Usuario(id, nombre, apellidos, códigoPostal): Recibe los cuatro valores y los inicializa.
  • Usuario(nombre, apellidos, códigoPostal): Recibe los tres valores, los inicializa y el identificador también lo inicializa pero de forma aleatoria (o viendo cuál le corresponde si trabajáramos con una base de datos).

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:

  • Si se llama con tres argumentos, el valor del identificador lo iguale a cero y por lo tanto entre en la parte inferior de la condición, donde se calcula el identificador aleatorio.
  • Si se llama con cuatro argumentos, el identificador tomará el valor que el usuario le pase y por lo tanto funcionará como lo ha hecho hasta ahora.Veamos un par de ejemplos de invocación de este constructor.

$usuario_1 = new Usuario("José", "Gómez Martínez", 14004); $usuario_2 = new Usuario("José", "Gómez Martínez", 14004, 10); read more

Leer más » 11 Comentarios

Cursos PHP orientado a objetos – Crear una clase (constructor)

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&oacute;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&oacute;digo postal - " . $elemento_vector->getCodigoPostal() . "</li> </ul> </div>"; } ?> read more

Leer más » 7 Comentarios

Cursos PHP orientado a objetos – Crear una clase (atributos y propiedades)

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?

  • Público (public): Se puede acceder desde fuera de la clase.
  • Privado (private): Sólo se puede acceder desde dentro de la clase.
  • Protegido (protected): Se puede accede desde dentro de la clase y desde clases herederas.

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; } read more

Leer más » 4 Comentarios

Curso C# con Mono – Interfaces

Si la última vez que hablamos de C#, estuvimos comentando la herencia, hoy hablaremos de las interfaces.

Interfaces en lenguajes de programación orientados a objetos

Todos conoceréis las interfaces gráficas de usuario. Son el mecanismo software que nos permite interactuar de manera más o menos intuitiva con unas funcionalidades que nos provee el programa. Es decir, es un mecanismo de comunicar distintos niveles, ocultando los detalles de la implementación.

Eso mismo son las interfaces en lenguajes de programación orientados a objetos como son C# o Java. Se trata de un conjunto de métodos, delegados o eventos, que no tienen implementación. El desarrollo de la funcionalidad de los mismos, se hace en la clase que implementa la interfaz. Es un concepto similar a los prototipos de funciones en lenguajes como C.

Declaración

Siguiendo con el ejemplo de los motores, comentado en la entrega anterior dedicada a la herencia, vamos a crear un interfaz IMotor, a la que luego haremos referencia desde la implementación de la clase. He incluido un método más para que se vean más claras las posibilidades.

interface IMotor { // declaración de propiedades int Potencia { get; set; } decimal Par { get; set; } // declaración de métodos void printInfo(); // declaración de eventos } public class Motor : IMotor { int potencia; decimal par; public int Potencia { get { return this.potencia; } set { potencia = value; } } public decimal Par { get { return this.par; } set { par = value; } } public void printInfo() { Console.WriteLine("La potencia es " + Potencia.ToString() + " y el par: " + Par.ToString()); } } read more

Leer más » 8 Comentarios

Curso C# con Mono – Herencia

Siguiendo con características propias de los lenguajes de alto nivel con orientación a objetos, llegamos a la herencia.

¿Qué es la herencia?

En programación orientada a objetos, la herencia es el mecanismo básico para crear nuevas clases (hijas o derivadas), basándonos en clases anteriores (a la que llamaremos padre, base o superclase). La relación es similar a la que se produce en muchas situaciones de la vida cotidiana, por ejemplo en el campo de la biología en las relaciones padre-hijo.

Gracias a este mecanismo, podemos basarnos en clases anteriores, para crear nuevas clases sobre trabajo ya hecho, de forma que extendemos la funcionalidad de la clase padre hacia un campo nuevo, sin tener que volver a reescribir todo el contenido de la misma.

Ejemplos

Hay multitud de casos de este tipo. Por ejemplo, la clase padre excepción, provee unos métodos y atributos generales para todas las excepciones posibles. De ella derivan excepciones concretas, por ejemplo de división entre cero, que además de los métodos y atributos ya existentes, añaden funcionalidad extra, pero reutilizando toda la funcionalidad de la clase padre.

Otro ejemplo clásico es el de los controles de una interfaz gráfica. La clase control es la padre de todo un abanico de clases hijo. La clase control tiene por ejemplo la situación (todos los controles tienen situación) pero cada clase hijo aporta nuevas funcionalidades (por ejemplo, sus propios eventos).

Implementación

Veremos la implementación en C# con un ejemplo concreto. Ya que están tan de moda los vehículos eléctricos, vamos a implementar una serie de clases, con herencia, que reflejen la siguiente realidad:

  • Clase padre: motor, tendrá las características propias de toda clase de motores, gestionaremos potencia (entero en kW) y par (decimal en Nm)
  • Clase hijo: eléctrico, contendrá información exclusiva de los motores eléctricos, intensidad (entero en amperios), potencial (entero en voltios)
  • Clase hijo: de combustión interna, gestionará información de este tipo de motores. Cilindrada (entero en cc.), número de cilindros (entero) y emisiones de CO2 (decimal en gr/km)

public class Motor{ int potencia; decimal par; public int Potencia { get { return this.potencia; } set { potencia = value; } } public decimal Par { get { return this.par; } set { par = value; } } } public class Electrico : Motor{ int intensidad; int potencial; public int Intensidad { get { return this.intensidad; } set { intensidad = value; } } public int Potencial { get { return this.potencial; } set { potencial = value; } } } public class CombustionInterna : Motor{ int cilindrada; int cilindros; public int Cilindrada { get { return this.cilindrada; } set { cilindrada = value; } } public int Cilindros { get { return this.cilindros; } set { cilindros = value; } } } read more

Leer más » 8 Comentarios

Curso C# con Mono – Declaración de clases y estructuras

Llegados a este punto, podríamos hablar tan profundamente y durante tanto tiempo sobre clases, objetos, métodos, atributos… que desvirtuaría el sentido de este curso. Supongo que tenéis nociones básicas de todo este paradigma de la orientación a objetos y veremos cómo implementar clases en C# con Mono.

Podríamos decir a muy grosso modo que:

  • Las clases son la unidad básica de estructuramiento en un programa de C#
  • Las estructuras son una herencia de lenguajes más antiguos, como C, donde creamos un grupo común para varias variables, sin atribuirles posibilidades de ejecución (métodos)

En C#, las estructuras pueden tener métodos básicos para la lectura o modificación de las variables.

¿Cómo crear una clase?

Digo cómo crear y no cómo declarar una clase, porque el curso está basado en MonoDevelop y tras crear una clase con el interfaz, veremos cómo se declara en el código.

Declaración de nueva clase con MonoDevelop

Dentro del espacio de nombres, a la izquierda de la interfaz, hacemos: clic derecho, “Añadir”, “Nuevo archivo”, “Clase vacía” e indicamos el nombre. Se nos creará un esqueleto básico de clase como el que sigue:

using System;

namespace holaMundo
{
	public class persona
	{
		public persona ()
		{
		}
	}
}

Veamos ahora la clase un poco más rellena. Como veréis, estoy dentro del mismo espacio de nombres en el que hemos hecho los ejemplos anteriores, “holaMundo”. Incluimos: atributos, métodos para manejar los atributos, el constructor y un método de ejemplo.

using System; namespace holaMundo { public class persona { // atributos string nombre; int edad; // propiedades: métodos para manejar los atributos public string Nombre { get { return nombre; } set { nombre = value; } } public int Edad { get { return edad; } set { edad = value; } } // constructor public persona (string _nombre, int _edad) { // usamos los métodos para manejar atributos en lugar de this.nombre Nombre = _nombre; Edad = _edad; } // método para imprimir datos de la instancia public void print() { System.Console.WriteLine("Nombre: " + nombre + " - Edad: " + edad.ToString()); } } } read more

Leer más » 9 Comentarios