informaticaPC

Tutorial de PHP

Clases y objetos en PHP, herencia, interfaces


Regístrate

Tus datos no serán compartidos, solo nosotros te enviaremos información y novedades

Programación Orientada a Objetos en PHP

Desde la versión de PHP 5.0 se ha ido mejorando progresivamente la implementación del uso de Clases y Objetos con el fin de permitir el desarrollo de páginas y aplicaciones web mediante Programación Orientada a Objetos (OOP en español).

El crear una página o aplicación web haciendo uso de una correcta Programación Orientada a Objetos nos facilitará en gran medida la organización y reutilizacion del código y la depuración de errores, con lo cual nuestros proyectos web podrán ser mantenidos y ampliados de forma mucho más sencilla.

En el presente curso de PHP nos limitaremos a explicarte el manejo de Clases y Objetos en PHP. Para aprender conceptos básicos sobre Programación Orientada a Objetos haz clic en los enlaces relacionados, al final de cada sección.

Crear Clases y Objetos

A continuación te mostraremos un sencillo ejemplo de cómo crear una Clase en PHP.

Persona.php:

<?php
    class Persona
    {
        // Propiedades
        private $nombre    = null;
        private $apellidos = null;

        // Constantes:
        const PERSONA_HOMBRE = "HOMBRE";
        const PERSONA_MUJER  = "MUJER";

        // Constructor:
        function __construct() {
            echo "<p>En el Constructor de la Clase</p>";
        }

        /*
        // El constructor también puede hacerse así (con el mismo nombre del Clase):
        function Persona() {
            echo "<p>En el Constructor de la Clase</p>";
        }
        */

        // Destructor:
        function __destruct() {
            echo "<p>En el Destructor de la Clase</p>";
        }

        // Métodos:

        public function getNombre() {
            return $this->nombre;
        }

        public function setNombre( $nombre ) {
            $this->nombre = $nombre;
        }

        public function getApellidos() {
            return $this->apellidos;
        }

        public function setApellidos( $apellidos ) {
            $this->apellidos = $apellidos;
        }
    }
?>

01_crear_clase_objeto.php:

<?php
    require_once("Persona.php");

    // Crear un Objeto (una instancia de la Clase):
    $objPersona = new Persona();
    $objPersona->setNombre("MARTINA");
    $objPersona->setApellidos("MARRERO MEDINA");

    echo "Nombre: [".$objPersona->getNombre()."]<br/>";        // Devuelve: "Nombre: [MARTINA]"
    echo "Apellidos: [".$objPersona->getApellidos()."]<br/>";  // Devuelve: "Apellidos: [MARRERO MEDINA]"

    echo "Sexo: [".Persona::PERSONA_MUJER."]<br/>";            // Devuelve: 2
?>

Descargar ejemplo

Programación Orientada a Objetos

Observa que antes de poder crear un Objeto es necesario incluir el archivo con la definición de la Clase, y que el Constructor de la Clase puede crearse de dos formas: usando el mismo nombre de la Clase o bien usando el método mágico __construct() (si creamos ambos métodos sólo se procesará éste último).

En el ejemplo anterior hemos creado también un Destructor de la Clase cuyo uso es opcional, y que se ejecutará al destruir un Objeto (si no lo hacemos manualmente, se destruirán al finalizar el script).

Fíjate también en que para obtener el valor de una constante escribimos el nombre de la Clase seguido del operador :: y finalmente el nombre de la constante.

Información

Si al definir una Clase no se especifica la visibilidad de alguno de sus miembros (public, private, protected), será tratado como public.

Información

PHP no soporta sobrecarga de funciones, así pues una Clase no puede tener dos constructores o métodos con el mismo nombre.

Herencia en PHP

Para aprender qué es la Herencia en Programación Orientada a Objetos, consulta el enlace al final de la sección.

Persona.php:

<?php
    class Persona
    {

        // Propiedades
        private $nombre	   = null;
        private $apellidos = null;
        private $sexo	   = null;
        protected $caminando = false;

        // Constructor:
        function Persona() {
        }

        // Métodos:

        function getNombre() {
            return $this->nombre;
        }

        public function setNombre( $nombre ) {
            $this->nombre = $nombre;
        }

        public function getApellidos() {
            return $this->apellidos;
        }

        public function setApellidos( $apellidos ) {
            $this->apellidos = $apellidos;
        }

        public function getSexo() {
            return $this->sexo;
        }

        public function setSexo( $sexo ) {
            $this->sexo = $sexo;
        }

        public function caminar()
        {
            if( $this->caminando == true )
            {
                echo "Ya está caminando...<br />";
            }
            else
            {
                $this->caminando = true;
                echo "Comienza a caminar...<br />";
            }
        }

        public function detenerse()
        {
            if( $this->caminando == true )
            {
                $this->caminando = false;
                echo "Se detiene...<br />";
            }
            else
            {
                echo "No está caminando...<br />";
            }
        }

    }
?>

Usuario.php:

<?php
    // Incluimos el archivo con la definición de la Clase de la que heredamos
    require_once("Persona.php");

    class Usuario extends Persona
    {

        // Propiedades
        private $nombreUsuario = null;
        private $password = null;

        // Constructor:
        function Usuario() {
        }

        // Métodos:

        public function getNombreUsuario() {
            return $this->nombreUsuario;
        }

        public function setNombreUsuario( $nombreUsuario ) {
            return $this->nombreUsuario = $nombreUsuario;
        }

        public function getPassword() {
            return $this->password;
        }

        public function setPassword( $password ) {
            return $this->password = $password;
        }

        // Redefinimos este método que existe también en la Clase padre:
        public function detenerse()
        {

            /* Si quisiéramos que se procese también el método de la Clase padre
            descomentaríamos la siguiente línea: */
            // parent::detenerse();

            if( $this->caminando == true )
            {
                $this->caminando = false;
                echo "El usuario se detiene...<br />";
            }
            else
            {
                echo "El usuario no está caminando...<br />";
            }
        }

    }
?>

02_objetos_herencia.php:

<?php
    // Incluimos el archivo con la definición de la Clase usada
    require_once("Usuario.php");

    // Crear un Objeto (una instancia de la Clase):
    $objUsuario = new Usuario();

    $objUsuario->setNombre("MARTINA");
    $objUsuario->setApellidos("MARRERO MEDINA");
    $objUsuario->setNombreUsuario("MMMedina");
    $objUsuario->setPassword("1234");

    echo "Nombre: [".$objUsuario->getNombre()."]<br/>";         // Devuelve: "Nombre: [MARTINA]"
    echo "Apellidos: [".$objUsuario->getApellidos()."]<br/>";   // Devuelve: "Apellidos: [MARRERO MEDINA]"

    echo "Usuario: [".$objUsuario->getNombreUsuario()."]<br/>"; // Devuelve: "Usuario: [MMMedina]"
    echo "Contraseña: [".$objUsuario->getPassword()."]<p/>";    // Devuelve: "Contraseña: [1234]"

    $objUsuario->caminar();
    $objUsuario->detenerse();
    $objUsuario->detenerse();
?>

Descargar ejemplo

Herencia en PHP

Observa que para poder acceder a una propiedad de la Clase padre desde la Clase hija, debe estar definida como protected.

Observa también que al redefinir un método en una Clase hija en ocasiones nos puede interesar se procese también, el mismo método de la Clase padre: para ello, usaremos la palabra reservada parent que explicaremos en el siguiente punto.

Más información

Vea también: [ Herencia en PHP ] - [ extends ]

Información

A día de hoy, hasta la versión 5.3 de PHP no se soporta la herencia múltiple, aunque como en otros lenguajes de Programación Orientada a Objetos se puede simular mediante el uso de interfaces (los explicamos en el siguiente apartado).

Por ejemplo:

  • En primer lugar creamos una Clase Persona que contenga las propiedades nombre, apellido1, apellido2, y sexo, así como los métodos necesarios para acceder a ellas.
  • A continuación creamos una Interface de nombre Localizacion que defina los métodos setxxx() y getxxx() necesarios para acceder a unas propiedades llamadas direccion, cpostal, poblacion, provincia, pais, así como los métodos correspondientes (las propiedades no hay que definirlas en la interface, como veremos en el siguiente apartado).
  • Finalmente, creamos otra Clase Profesor que extienda o herede de Persona e implemente la interface Localizacion (con lo cual deberán crearse los métodos definidas en ella).

Interfaces en PHP

Para aprender qué son las Interfaces en Programación Orientada a Objetos, consulta el enlace al final de la sección.

A continuación te mostramos un ejemplo de cómo crear una interface en PHP:

iGenero.php:

<?php

    Interface iGenero
    {
        public function getGenero();
        public function setGenero($genero);
    }

?>

Persona.php:

<?php
    // Incluimos el archivo con la definición de la Interface usada:
    require_once("iGenero.php");

    class Persona implements iGenero
    {
        // Propiedades
        private $nombre	   = null;
        private $apellidos = null;
        private $genero    = null;

        // Constructor:
        function Persona() {
        }

        // Métodos:

        function getNombre() {
            return $this->nombre;
        }

        public function setNombre( $nombre ) {
            $this->nombre = $nombre;
        }

        public function getApellidos() {
            return $this->apellidos;
        }

        public function setApellidos( $apellidos ) {
            $this->apellidos = $apellidos;
        }

        // Métodos obligatorios según la interface (si se elimina alguno se generará un error):

        public function getGenero() {
            return $this->genero;
        }

        public function setGenero( $genero ) {
            $this->genero = $genero;
        }

    }
?>

03_objetos_interfaces.php:

<?php
    // Incluimos el archivo con la definición de la Clase usada:
    require_once("Persona.php");

    // Crear un Objeto (una instancia de la Clase):
    $objPersona = new Persona();

    $objPersona->setNombre("MARTINA");
    $objPersona->setApellidos("MARRERO MEDINA");
    $objPersona->setGenero("FEMENINO");

    echo "Nombre: [".$objPersona->getNombre()."]<br/>";         // Devuelve: "Nombre: [MARTINA]"
    echo "Apellidos: [".$objPersona->getApellidos()."]<br/>";   // Devuelve: "Apellidos: [MARRERO MEDINA]"
    echo "Usuario: [".$objPersona->getGenero()."]<br/>";		// Devuelve: "Usuario: [FEMENINO]"
?>

Descargar ejemplo

Interfaces en PHP

Ten en cuenta que si no existieran los dos métodos definidos en la interface iGenero se generaría un error.

Más información

Vea también: [ Interfaces en PHP ]

Primera página Anterior Siguiente Última página
Usamos cookies para ofrecerte una experiencia mejorada, el continuar navegando supone que aceptas su uso