Sie sind auf Seite 1von 17

Universidad Gerardo Barrios

Facultad de Ciencia y Tecnologa

Fecha: Gua Practica 9:Clases y Objetos


04/04/17 Programacin Computacional IV

Objetivos:
- Conocer el concepto de herencia de clases
- Implementar herencia entre clases
- Manejo de Excepciones

Introduccin.

La programacin orientada a objetos es una metodologa de programacin avanzada y bastante


extendida, en la que los sistemas se modelan creando clases, que son un conjunto de datos y
funcionalidades. Las clases son definiciones, a partir de las que se crean objetos. Los objetos son
ejemplares de una clase determinada y como tal, disponen de los datos y funcionalidades definidos en la
clase. La programacin orientada a objetos permite concebir los programas de una manera bastante
intuitiva y cercana a la realidad. La tendencia es que un mayor nmero de lenguajes de programacin
adopten la programacin orientada a objetos como paradigma para modelizar los sistemas. Prueba de
ello es la nueva versin de PHP (5), que implanta la programacin de objetos como metodologa de
desarrollo. Tambin Microsoft ha dado un vuelco hacia la programacin orientada a objetos, ya que .NET
dispone de varios lenguajes para programar y todos orientados a objetos.

As pues, la programacin orientada a objetos es un tema de gran inters, pues es muy utilizada y cada
vez resulta ms esencial para poder desarrollar en casi cualquier lenguaje moderno. En este artculo
vamos ver algunas nociones sobre la programacin orientada a objetos en PHP.

Aunque es un tema bastante amplio, novedoso para muchos y en un principio, difcil de asimilar, vamos
a tratar de explicar la sintaxis bsica de PHP para utilizar objetos, sin meternos en mucha teora de
programacin orientada a objetos en general.

Clase.

Una clase es un conjunto de variables, llamados atributos, y funciones, llamadas mtodos, que trabajan
sobre esas variables. Las clases son, al fin y al cabo, una definicin: una especificacin de propiedades y
funcionalidades de elementos que van a participar en nuestros programas. Por ejemplo, la clase "Caja"
tendra como atributos caractersticas como las dimensiones, color, contenido y cosas semejantes. Las
funciones o mtodos que podramos incorporar a la clase "caja" son las funcionalidades que deseamos
que realice la caja, como introduce(), muestra_contenido(), comprueba_si_cabe(), vaciate()...

Las clases en PHP se definen de la siguiente manera:


<?php

class Caja{

var $alto;
var $ancho;
var $largo;
var $contenido;
var $color;

function introduce($cosa){
$this->contenido = $cosa;
}
function muestra_contenido(){
echo $this->contenido;
}
}

?>

En este ejemplo se ha creado la clase Caja, indicando como atributos el ancho, alto y largo de la caja, as
como el color y el contenido. Se han creado, para empezar, un par de mtodos, uno para introducir un
elemento en la caja y otro para mostrar el contenido.

Si nos fijamos, los atributos se definen declarando unas variables al principio de la clase. Los mtodos se
definen declarando funciones dentro de la clase. La variable $this, utilizada dentro de los mtodos la
explicaremos un poco ms abajo.

Herencia.

Algunos lenguajes OO soportan herencia mltiple, esto significa que una subclase puede heredar de varias
clases padres. PHP no permite esto y una subclase solo puede heredar de una clase padre, sin embargo
en PHP no hay ningn tipo de restriccin en cuanto a el nmero de subclases que pueden heredar de una
misma clase padre o superclase.

La programacin orientada a objetos tiene un mecanismo llamado herencia por el que se pueden definir
clases a partir de otras clases. Las clases realizadas a partir de otra clase o mejor dicho, que extienden a
otra clase, se llaman clases extendidas o clases derivadas.

Las clases extendidas heredan todos los atributos y mtodos de la clase base. Adems, pueden tener
tantos atributos y mtodos nuevos como se desee.
Polimorfismo.

Cualquier lenguaje de programacin orientado a objetos debe soportar el polimorfismo, esto significa que
clases diferentes tendrn un comportamiento distinto para la misma operacin. Esto lo veremos ms claro
con el siguiente ejemplo.

Supongamos que tenemos dos clases distintas coche y ciclomotor. Ambas tienen sus propios mtodos de
movimiento, stos tienen diferentes comportamientos, pero su nombre es el mismo.

class coche {

function avanza() {

function para() {

function girar_derecha() {

class ciclomotor {

function avanza() {

function para() {

function girar_derecha() {

Supongamos que queremos mover cualquier vehculo hacia adelante entonces haramos:

$obj_coche = new coche();

$obj_ciclomotor = new ciclomotor();

$obj_movimiento = new movimiento();

// con esta sentencia el coche avanzaria hacia adelante.

$obj_movimiento->mover_adelante($obj_coche);

// con esta sentencia el ciclomotor avanzara hacia adelante.

$obj_movimiento->mover_adelante($obj_ciclomotor);

Como podemos ver el mismo mtodo del objeto movimiento acta de dos formas diferentes dependiendo
del objeto que le pasamos como parmetro.
Ejemplo:

function estadoPersona($persona) {
if($persona instanceof empleado)
echo $persona->trabaja();
elseif($persona instanceof estudiante)
echo $persona->estudia();
elseif($persona instanceof bebe)
echo $persona->comeyduerme();
else
echo "ERROR: Se desconoce la ocupacin de esta persona.";
}

El operador instanceof se utiliza para determinar la clase a la que pertenece un objeto o si un objeto es una
instancia de una determinada clase. Tambin su utiliza para determinar si un objeto implementa alguna
interfaz dada. Puede notar este tipo de implementacin es poco escalable. Por ejemplo, si aadimos un
nuevo tipo de persona a la aplicacin, tendramos que modificar el cdigo de la funcin estadoPersona. Sin
embargo, existe una mejor solucin que consiste en hacer uso del polimorfismo. De modo, que cada una
de las clases hijas implementar un mtodo especfico, denominado ocupacionPrincipal(). As, dado un
objeto de cualquiera de las tres clases hijas (empleado, estudiante y beb), se podra realizar la llamada al
mtodo correspondiente utilizando la sintaxis:

$objeto->ocupacionPrincipal();

Como podemos observar, ambas clases tienen los mismos mtodos, supongamos ahora que tenemos otra
clase que controla el movimiento de todos los vehculos, es aqu donde entra en juego el polimorfismo,
que dependiendo del objeto que tratemos actuar de una forma u otra el mtodo al que llamamos.

class movimiento {

function mover_adelante($obj) {

$obj->avanza();

De este modo la funcin estadoPersona sera:

function estadoPersona($persona) {

if($persona instanceof persona)

echo $persona->ocupacionPrincipal();

else

echo "ERROR: Se desconoce la ocupacin de esta persona.";

}
Encapsulamiento.

El encapsulamiento consiste en unir en la Clase las caractersticas y comportamientos, esto es, las
variables y mtodos. Es tener todo esto es una sola entidad. En los lenguajes estructurados esto era
imposible. La utilidad del encapsulamiento va por la facilidad para manejar la complejidad, ya que
tendremos a las Clases como cajas negras donde slo se conoce el comportamiento pero no los detalles
internos, y esto es conveniente porque nos interesar ser conocer qu hace la Clase pero no ser
necesario saber cmo lo hace.

Autocarga de clases.

Cuando se trabaja con clases produciendo un script independiente por cada definicin de clase, es
necesario incluir cada una de estas definiciones de clase en el script principal de la aplicacin final. En el
caso que el nmero de clases definidas sea considerable, puede llegar a ser molesto tener que crear una
instruccin include o require por cada una de las clases necesarias para el script.

Para brindar un mecanismo para que los programadores puedan cargar las clases en tiempo de ejecucin
o cargar las clases de forma dinmica o automtica, en PHP 5 se ha incorporado un mtodo conocido
como mtodo mgico, denominado __autoload(). La llamada a este mtodo se realiza de forma
automtica, no se puede invocar desde cdigo. Esta llamada se produce cuando se intenta instanciar a
una clase, sin que exista en el script una definicin para esta. En ese momento, PHP buscar el mtodo
__autoload() para localizar la definicin de esa clase en un archivo externo. Si no se encuentra un archivo
con la definicin de la clase ni con este mtodo, entonces el script terminar con un error fatal.

El objetivo de esta tcnica es facilitar al programador la inclusin de clases sin tener que recurrir a la
inclusin de un sin nmero de instrucciones include o require.

La implementacin de esta tcnica requiere que se programe el mtodo __autoload() en el script. Una
implementacin simple sera la siguiente:

function __autoload($clase){

include_once($clase . ".php");

El mtodo __autoload() ser invocado de forma automtica cuando se instancie a una clase para crear un
objeto, de esta forma:

$objeto = new clase1();

Si no se encuentra en el script o en un script externo incluido mediante una instruccin include o require,
PHP intentar, como ltimo recurso, encontrar la definicin de la clase en el mtodo __autoload(). Si no
la encuentra, entonces lanzar un error fatal.

Hay algunas consideraciones a tomar en cuenta para usar el mtodo __autoload():

1. El mtodo __autoload() se autoejecuta, lo que significa que no puede ser invocado por el programador
mediante cdigo PHP.
2. El mtodo recibe como argumento el nombre de la clase que se ha intentado instanciar sin que haya
sido encontrada su definicin en el script. PHP es quien enva el valor adecuado de este argumento, siendo
este el nombre de la clase.

3. Dentro de la funcin __autoload() se intenta incluir un script que debe haber sido nombrado igual que
la clase para que sea encontrado.

4. Por ltimo, para que esto funcione, debe haber creado un script PHP, por cada definicin de clase.

Clases y mtodos abstractos

La abstraccin es un recurso que se utiliza para brindar mayor control sobre el proceso de herencia. La
caracterstica principal de una clase abstracta es que no puede instanciarse, lo que quiere decir que no
puede utilizarse de forma directa, nicamente se puede acceder a sus miembros a travs de una subclase
o clase derivada de esta. A esta subclase se le denomina tambin clase concreta.

Una clase abstracta, como cualquier clase padre, adems de declarar e implementar, propiedades,
constantes y mtodos, puede definir mtodos tambin abstractos, los cuales no pueden ser
implementados; es decir, no poseen cdigo. La implementacin de los mtodos abstractos corresponde
a las clases hijas. Adems, las clases hijas pueden volver a declarar estos mtodos abstractos, lo que
significa que la responsabilidad de la implementacin del mtodo recaer en el siguiente nivel jerrquico.

Interfaces

Las interfaces son similares en algunos aspectos a las clases abstractas. Permiten definir protocolos de
comportamiento para los objetos en cualquier punto de la jerarqua de clases. Una interfaz permite definir
un nombre a un conjunto de definiciones de mtodos y a un conjunto de constantes. Una clase que
cumple con una determinada interfaz debe implementar todos los mtodos incluidos en la misma,
adquiriendo por tanto, un cierto comportamiento. La clase podra tambin, declarar alguno de los
mtodos definidos por la interfaz, como abstracto, forzando a que dicho mtodo sea implementado por
alguna de sus clases hijas. Adems, una clase puede implementar ms de una interfaz.

Una diferencia entre las clases abstractas y las interfaces es que mientras las primeras proporcionan un
medio para expresar conceptos abstractos en programacin, las segundas, se han diseado para asegurar
la funcionalidad dentro de una clase.

Para declarar una interfaz en PHP se utiliza la palabra clave interface y, a continuacin, el identificador de
la interfaz. De la siguiente forma:

interface printable {

public function printme();

Para que una interfaz sea til, debe ser implementada mediante una o ms clases. Tambin, es posible
que una sola clase pueda implantar mltiples interfaces diferentes.

interface printable {

public function printme();

interface Inumber {

public function reset();

class integer implements printable, Inumber {

private $value;

function __construct($value) {

$this->value = $value;

//Implementacin de la interfaz printable

public function printme() {

echo (int)$this->value;

public function reset() {

$this->value = NULL;

public function value() {

return (int)$this->value;
}

function resetNumber(Inumber $obj) {

$obj->reset();

function printNumber(printable $obj) {

$obj->printme();

Para probar la interfaz:

$entero = new integer(12);

printNumber($entero);

resetNumber($entero);

Manejo de excepciones

Una de las incorporaciones ms interesantes de PHP 5 es el manejo de excepciones. Las excepciones


proporcionan un mecanismo para gestionar errores en el contexto de los objetos. Las excepciones
tambin proporcionan ventajas significativas sobre las tcnicas tradicionales de gestin de errores. Uno
de los principales inconvenientes del manejo tradicional de errores es que la gestin del error est
entrelazada con el flujo normal del cdigo del script o programa. Incluir el tratamiento de errores en el
punto donde este se produce provoca que el cdigo sea poco flexible y difcil de reutilizar, ya que el mismo
error puede precisar de tratamientos distintos en funcin de las circunstancias en las que se produzca.

La gestin de excepciones utilizando objetos intenta resolver estos problemas, permitiendo delegar el
tratamiento de errores al lugar ms apropiado, haciendo posible manejar mltiples condiciones de error
en un nico punto, separando el procesamiento de la excepcin de la lgica del programa.

La clase Exception

En la prctica, las excepciones son instancias de clases que contienen informacin sobre el error que se
ha producido durante la ejecucin de la secuencia de comandos. PHP 5 proporciona internamente una
clase denominada Exception.

Las excepciones en PHP contienen dos valores principales que son: una cadena con el mensaje que
describe el error que se ha producido y un valor entero que representa el cdigo del error. De forma
predeterminada, PHP asignar automticamente a la excepcin la lnea y el nombre del archivo donde se
ha producido el error, as como una localizacin de pila que representa la ruta de acceso a la ejecucin
que ha resultado en error.

Arrojar y capturar excepciones

Como programadores, tenemos la posibilidad de derivar la clase Exception, para definir nuestras propias
excepciones. Cuando se lance una excepcin, se puede definir un mensaje descriptivo sobre el error y un
cdigo de error. Del resto de la clase no debemos preocuparnos como programadores, puesto que PHP
maneja los mtodos por nosotros.

Uno de los mtodos ms interesantes de la clase Exception es el mtodo __toString(), el cual pertenece a
la categora de los mtodos conocidos como mtodos mgicos. Al igual que __construct(), __destruct(),
__clone(), __autoload() y otros que hemos mencionado anteriormente. Este mtodo es susceptible de ser
sobrescrito en las clases derivadas de Exception.

Para lanzar una excepcin se puede instanciar a la clase Exception o a una clase derivada de esta, incluso
aunque no se haya creado un objeto como tal para su uso posterior. Para lanzar la excepcin desde la
secuencia de comandos se utiliza la sentencia throw junto con la instancia de la excepcin a arrojar.

El manejo de excepciones en PHP 5 se lleva a cabo utilizando una estructura de control, denominada
try/catch. Dentro del bloque try se incluye el cdigo de programa que podra llegar a producir una
excepcin. Todo bloque try dentro de la secuencia de comando debe tener asociado, al menos un bloque
catch. Con el bloque catch se realiza la gestin de las excepciones.

El funcionamiento es, en teora, simple. Si la excepcin es una instancia de la clase capturada en el primer
bloque catch, ser procesada en ese punto. En caso contrario, se buscar otro bloque catch que admita
la clase de excepcin generada u otra estructura por encima de try/catch en la que capturarla. Si no se
encuentra dicho bloque, se generar un error fatal.
Ejemplo Clase Abstracta.

La clase abstracta Figura puede ser el padre de muchos tipos de Figuras (bidimensionales).
1.- Definimos la clase figura: abstract class Figura {
2.- Definimos el primer metodo abstracto: abstract protected function obtenerArea();

Esta linea dice que cualquier clase que se extiende de la clase Figura necesita definir un metodo
obtenerArea(). Ademas, este metodo no deberia tener ningun argumento y la visibilidad tiene
que ser publica o protegida (la misma visibilidad o mas debil).
3.- Definimos el segundo metodo abstracto: abstract protected function obtenerPerimetro();
4.- Completamos la clase:
1.- Comenzamos declarando la clase Triangulo: class Triangulo extends Figura {
2.- Declaramos los atributos:
private $_lados = array();
private $_perimetro = NULL;

El primer atributo almacenara el tamao de los tres lados (como alternativa puede hacer tres
variables independientes), la segunda variable almacenara el perimetro.
Solo estoy aadiendo este atributo por que el perimetro sera utilizado en el calculo del area, asi
que es bueno tener una variable en lugar de recuperarla a traves de un metodo. Todos los
atributos son privados, ya que no deben ser accedidos fuera de cualquier clase y no puedo
imaginar como una clase Triangulo sera heredada (en cuyo caso pueden estar protegidos).
3.- Definimos el constructor:
function __construct($s0 = 0, $s1 = 0, $s2 = 0){
// Almacenamos los valores en un Array:
$this->_lados[] = $s0;
$this->_lados[] = $s1;
$this->_lados[] = $s2;

// Calculamos el perimetro:
$this->_perimetro = array_sum($this->_lados);
} // Fin del construtor

El constructor toma tres argumentos para los tres lados del triangulo. Esos valores se colocan en
el array $_lados, y luego se calcula el perimetro. La funcion array_sum() suma todos los
elementos del array.
4.- Creamos un metodo obtenerArea():
public function obtenerArea(){
// Calculamos y devolvemos el area:
return (sqrt(
($this->_perimetro/2) *
(($this->_perimetro/2) - $this->_lados[0]) *
(($this->_perimetro/2) - $this->_lados[1]) *
(($this->_perimetro/2) - $this->_lados[2])
))
} // Fin del metodo obtenerArea().

Si recuerda la geometria, sabe que el area del triangulo es igual a la mitad de la base por altura.
Por supuesto, para hacer este calculo la base tendria que determinar la base (el lado mas largo,
no es un problema) y la altura (que requiere trigonometria). En lugar de eso utilizaremos la
Formula de Heron's. Para implementarlo en el codigo PHP.

Ejemplo: Cul es el rea de un tringulo en el que cada lado es de 5?

Paso 1: s = (5 + 5 + 5) / 2 = 7,5 (perimetro)


Paso 2: A = (7,5 2,5 2,5 2,5) = (117,1875) = 10.825 ...

5.- Creamos el metodo obtenerPerimetro():


public function obtenerPerimetro(){
return $this->_perimetro;
} // Fin del metodo obtenerPerimetro().
Este es el segundo metodo abstracto en Figura que debe ser implementado aqui. Para este
ejemplo, simplemente retorna el atributo perimetro. No tiene que crear el atributo perimetro,
este metodo fue devuelto por $this->_perimetro = array_sum($this->_lados);

6.- Completamos la clase: } // Fin de la clase Triangulo.


Para usar la clase Triangulo:
Ejercicios:
Elegir un tema para realizar los ejercicios.
1. Realice un ejemplo donde pueda aplicar el concepto de herencia.
2. Escriba un ejemplo de clases donde implemente una clase abstracta.
Se pide:

Realizar el script para cada ejercicio


Crear el script para utilizacin de las clases.
Cree una pgina web con un men donde enlace cada uno de los ejercicios.
Subir archivos en un documento zip en la plataforma virtual.
Fecha Limite: 07/04/17.

Das könnte Ihnen auch gefallen

  • Practica 7
    Practica 7
    Dokument12 Seiten
    Practica 7
    api-293578740
    Noch keine Bewertungen
  • Edubuntu
    Edubuntu
    Dokument15 Seiten
    Edubuntu
    api-293578740
    Noch keine Bewertungen
  • PHP y Los Diferentes Dbms
    PHP y Los Diferentes Dbms
    Dokument11 Seiten
    PHP y Los Diferentes Dbms
    api-294163027
    100% (1)
  • Guia 8
    Guia 8
    Dokument7 Seiten
    Guia 8
    api-293578740
    Noch keine Bewertungen
  • Asignar Permisos A Carpetas
    Asignar Permisos A Carpetas
    Dokument7 Seiten
    Asignar Permisos A Carpetas
    api-293578740
    Noch keine Bewertungen
  • Practica 2
    Practica 2
    Dokument14 Seiten
    Practica 2
    api-293578740
    Noch keine Bewertungen
  • Api Canvas Grupo7
    Api Canvas Grupo7
    Dokument11 Seiten
    Api Canvas Grupo7
    api-293578740
    Noch keine Bewertungen
  • Practica 6
    Practica 6
    Dokument4 Seiten
    Practica 6
    api-293578740
    Noch keine Bewertungen
  • Guia Ejercicios
    Guia Ejercicios
    Dokument1 Seite
    Guia Ejercicios
    api-294163027
    Noch keine Bewertungen
  • Practica 1
    Practica 1
    Dokument14 Seiten
    Practica 1
    api-293578740
    Noch keine Bewertungen
  • Practica 4
    Practica 4
    Dokument16 Seiten
    Practica 4
    api-293578740
    Noch keine Bewertungen
  • Xfce
    Xfce
    Dokument16 Seiten
    Xfce
    api-293578740
    Noch keine Bewertungen
  • Clases c1
    Clases c1
    Dokument4 Seiten
    Clases c1
    api-293578740
    Noch keine Bewertungen
  • Practica 3
    Practica 3
    Dokument8 Seiten
    Practica 3
    api-293578740
    Noch keine Bewertungen
  • Manualdll
    Manualdll
    Dokument5 Seiten
    Manualdll
    api-293578740
    Noch keine Bewertungen
  • Clases So c3
    Clases So c3
    Dokument2 Seiten
    Clases So c3
    api-293578740
    Noch keine Bewertungen
  • Manual w7 y Ubuntu
    Manual w7 y Ubuntu
    Dokument29 Seiten
    Manual w7 y Ubuntu
    api-293578740
    Noch keine Bewertungen
  • Hilos de Procesos
    Hilos de Procesos
    Dokument2 Seiten
    Hilos de Procesos
    api-293578740
    Noch keine Bewertungen
  • Manual y Ejercicios en Debian
    Manual y Ejercicios en Debian
    Dokument17 Seiten
    Manual y Ejercicios en Debian
    api-293578740
    Noch keine Bewertungen
  • Entornos de Escritorios de Linux
    Entornos de Escritorios de Linux
    Dokument16 Seiten
    Entornos de Escritorios de Linux
    api-293578740
    Noch keine Bewertungen
  • Asterisk Now
    Asterisk Now
    Dokument11 Seiten
    Asterisk Now
    Ben Ramos
    Noch keine Bewertungen
  • Clases So c2
    Clases So c2
    Dokument4 Seiten
    Clases So c2
    api-293578740
    Noch keine Bewertungen
  • Manual Windows XP
    Manual Windows XP
    Dokument23 Seiten
    Manual Windows XP
    api-293578740
    Noch keine Bewertungen
  • Ejemplo de Base de Datos SQL
    Ejemplo de Base de Datos SQL
    Dokument2 Seiten
    Ejemplo de Base de Datos SQL
    Isco Reyes
    Noch keine Bewertungen
  • Guia de Ejercicios Computo 2
    Guia de Ejercicios Computo 2
    Dokument10 Seiten
    Guia de Ejercicios Computo 2
    api-293578740
    Noch keine Bewertungen
  • Manual de Instalador VB
    Manual de Instalador VB
    Dokument19 Seiten
    Manual de Instalador VB
    api-293578740
    Noch keine Bewertungen
  • Clases Sistemas
    Clases Sistemas
    Dokument5 Seiten
    Clases Sistemas
    api-293578740
    Noch keine Bewertungen
  • Guia Progra
    Guia Progra
    Dokument13 Seiten
    Guia Progra
    api-293578740
    Noch keine Bewertungen
  • Librerias de C
    Librerias de C
    Dokument10 Seiten
    Librerias de C
    api-293578740
    Noch keine Bewertungen