Tutorial del concepto de programación orientada a objetos (OOP) de PHP con ejemplo
¿Qué son los POO?
Orientado a objetos es un enfoque para el desarrollo de software que modela aplicaciones en torno a objetos del mundo real, como empleados, automóviles, cuentas bancarias, etc. Una clase define las propiedades y métodos de un objeto del mundo real. Un objeto es una ocurrencia de una clase.
Los tres componentes básicos de la orientación a objetos son;
- Análisis orientado a objetos – funcionalidad del sistema
- Diseño orientado a objetos – arquitectura del sistema
- Programación orientada a objetos – implementación de la aplicación
Principios de programación orientada a objetos
Los tres principios principales de la programación orientada a objetos son;
- La encapsulación – se trata de ocultar los detalles de implementación y exponer únicamente los métodos. El objetivo principal de la encapsulación es:
- Reduce la complejidad del desarrollo de software: al ocultar los detalles de implementación y exponer solo las operaciones, usar una clase se vuelve fácil.
- Protege el estado interno de un objeto: el acceso a las variables de clase se realiza mediante métodos como get y set, lo que hace que la clase sea flexible y fácil de mantener.
- La implementación interna de la clase se puede cambiar sin preocuparse por romper el código que usa la clase.
- Herencia – esto tiene que ver con la relación entre clases. La relación toma la forma de padre e hijo. El niño usa los métodos definidos en la clase padre. El objetivo principal de la herencia es;
- Reutilizabilidad: varios hijos pueden heredar del mismo padre. Esto es muy útil cuando tenemos que proporcionar funcionalidades comunes como agregar, actualizar y eliminar datos de la base de datos.
- Polimorfismo – Se trata de tener una forma única pero muchas formas de implementación diferentes. El objetivo principal del polimorfismo es;
- Simplifique el mantenimiento de aplicaciones y hágalas más extensibles.
UPS Concepts en PHP
PHP es un lenguaje de programación orientado a objetos; apoya todos los principios anteriores. Los principios anteriores se logran mediante;
- La encapsulación – mediante el uso de métodos “get” y “set”, etc.
- Herencia – mediante el uso de la palabra clave extends
- Polimorfismo – mediante el uso de la palabra clave implements
Ahora que tenemos el conocimiento básico de la programación orientada a objetos y cómo se soporta en PHP, veamos ejemplos que implementan los principios anteriores
¿Qué es UML?
El lenguaje de modelado unificado UML es una técnica utilizada para diseñar y documentar sistemas orientados a objetos.
UML produce varios documentos, pero veremos el diagrama de clases, que es muy importante para la programación PHP orientada a objetos.
Ejemplo de diagrama de clases
Clave del diagrama de clases
- Tu Caja superior contiene el nombre de la clase
- Tu caja del medio contiene las variables de clase
- Tu caja inferior contiene los métodos de clase
- Tu menos (-) Significa ámbito privado
- Tu más (+) signo significa alcance público
- Tu hash (#) signo significa alcance protegido
Cómo crear una clase en PHP
La palabra clave class se utiliza para definir una clase en PHP. A continuación se detallan las reglas para crear una clase en PHP.
- El nombre de la clase debe comenzar con una letra.
- El nombre de la clase no puede ser una palabra reservada de PHP
- El nombre de la clase no puede contener espacios.
Digamos que queremos crear una clase para representar animales.
Comenzaremos identificando las características que son comunes a todos los animales.
- Todos los animales pertenecen a una familia como herbívoro, carnaval, etc.
- Todos los animales comen comida.
El siguiente diagrama muestra el diagrama del animal.
Codifiquemos ahora nuestra clase animal.
<?php class Animal { private $family; private $food; public function __construct($family, $food) { $this->family = $family; $this->food = $food; } public function get_family() { return $this->family; } public function set_family($family) { $this->family = $family; } public function get_food() { return $this->food; } public function set_food($food) { $this->food = $food; } } ?>
AQUÍ,
- “privado $familia, $comida” significa que no se puede acceder a las variables directamente fuera de la clase (Encapsulación).
- “función pública __construct($familia…)” es el método constructor de php. Esta función se llama siempre que se ha creado una instancia de la clase. En este caso estamos ambientando la familia y la comida.
- “función pública get…()” es el método utilizado para acceder al valor familiar o alimentario (Encapsulación)
- “conjunto de funciones públicas…()” es el método utilizado para establecer el valor familiar o alimentario (Encapsulación)
Cómo implementar la herencia en PHP
Trabajaremos con una vaca y un león. Tanto la vaca como el león heredan de la clase Animal.
El siguiente diagrama de clases muestra las relaciones.
Tenga en cuenta que la vaca hereda de la clase animal y también define sus propias variables y métodos.
Codifiquemos ahora la clase Vaca.
<?php class Cow extends Animal { private $owner; public function __construct($family, $food) { parent::__construct($family, $food); } public function set_owner($owner) { $this->owner = $owner; } public function get_owner() { return $this->owner; } } ?>
Codifiquemos ahora la clase Lion.
<?php class Lion extends Animal { public function __construct($family, $food) { parent::__construct($family, $food); } } ?>
AQUÍ,
- “clase… extiende Animal” hace que la vaca y el león usen métodos de la clase Animal (Herencia).
Cómo crear un objeto de la clase.
Por razones de simplicidad, las clases Animal, Vaca y León deberían estar todas en el mismo directorio.
Creemos ahora la aplicación que utiliza nuestras clases.
Ejemplo de clase PHP
<?php require 'Animal.php'; require 'Cow.php'; require 'Lion.php'; $cow = new Cow('Herbivore', 'Grass'); $lion = new Lion('Canirval', 'Meat'); echo '<b>Cow Object</b> <br>'; echo 'The Cow belongs to the ' . $cow->get_family() . ' family and eats ' . $cow->get_food() . '<br><br>'; echo '<b>Lion Object</b> <br>'; echo 'The Lion belongs to the ' . $lion->get_family() . ' family and eats ' . $lion->get_food(); ?>
Probar nuestra aplicación
Veamos ahora nuestra aplicación en un navegador web.
Fantástico, ¡verdad! Veamos ahora el tercer principio de la programación orientada a objetos, el polimorfismo.
Digamos que queremos desarrollar una aplicación que se conecte a diferentes motores de bases de datos, como MySQL como SQL Servidor pero usa la misma interfaz uniforme.
Podemos crear una interfaz que defina los métodos estándar y una clase abstracta que implemente los métodos comunes.
- Fácil de usar – es similar a una clase. Solo define los métodos y parámetros.
- Clase abstracta – es una clase que no se puede utilizar para crear un objeto directamente. Su propósito es proporcionar implementaciones parciales o totales de métodos comunes.
El siguiente diagrama de clases ilustra la relación entre nuestra clase abstracta, interfaz y clases de implementación.
Creemos ahora nuestra clase abstracta.
<?php abstract class DBCommonMethods { private $host; private $db; private $uid; private $password; public function __construct($host, $db, $uid, $password) { $this->host = $host; $this->db = $db; $this->uid = $uid; $this->password = $password; } } ?>
AQUÍ,
- "clase abstracta" significa que la clase no se puede usar directamente para crear un objeto en PHP
- “$host,$db…” son variables de clase comunes a todas las implementaciones
- “función __construct(…)” es el método constructor de la clase php que establece los valores de las variables comunes en la inicialización
Ahora creemos la interfaz que contiene los métodos estándar que se implementarán de manera diferente según el motor de base de datos.
<?php interface DBInterface { public function db_connect(); public function insert($data); public function read($where); public function update($where); public function delete($where); } ?>
AQUÍ,
- "interfaz" es la palabra clave para crear interfaces
- “función pública…(…)” son los métodos estándar que deben implementarse
Ahora creemos las clases concretas que extenderán la clase DBCommonMethods y extenderán la interfaz DBInterface. MySQLcontrolador.php
<?php class MySQLDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { //connect code goes here } public function delete($where) { //delete code goes here } public function insert($data) { //insert code goes here } public function read($where) { //read code goes here } public function update($where) { //update code goes here } } ?>
MSSQLServerDriver.php
<?php class MSSQLServerDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { //connect code goes here } public function delete($where) { //delete code goes here } public function insert($data) { //insert code goes here } public function read($where) { //read code goes here } public function update($where) { //update code goes here } } ?>
AQUÍ,
- "clase... extiende DBCommonMethods" utiliza los métodos en DBCommonMethods
- "... implementa DBInterface" garantiza que la clase proporcione métodos estándar independientemente del controlador de base de datos utilizado.
Uso del código anterior El código que usa la clase anterior se vería así
<?php $db = new MySQLDriver($host,$db,$uid,$password); ?>
Or
<?php $db = new MSSQLServerDriver ($host,$db,$uid,$password); ?>
El resto del código sería el mismo para ambos controladores, como por ejemplo;
<?php $db->db_connect(); $db->insert($data); ?>
Resumen
- La programación orientada a objetos OOP es una poderosa técnica que modela aplicaciones a partir de objetos del mundo real.
- Una clase es una representación de objetos del mundo real con propiedades y métodos.
- Los tres principios básicos de la programación orientada a objetos son;
- La encapsulación
- Herencia
- Polimorfismo