Páginas

viernes, 17 de diciembre de 2010

Introduccion a la POO en PHP


Buenas en esta nueva entrada se hablara sobre un tema que a los que comenzamos a trabajar con PHP nos cuesta un poco y es la Programación Orientada a Objetos, como muchos cuando comencé con el PHP la manera como me indicaron que se tenía que programar era de forma estructurada,a pesar de que ya existía PHP5+ (para mí una maravilla ya que se me hacia fácil resolver problemas mediante pseudo-códigos estructurados), a medida que me fui interesando por el desarrollo en PHP en mi investigación veía que habían personas que hablaban de Programación Orientada a Objetos, PHP5,  patrones de diseños y demás, entonces surgió la duda en PHP se utiliza la programación orientada a objetos??  Pues luego de varias semanas de lectura me di cuenta lo atrasado que estaba, la mayoría realizando sistemas con POO y yo de manera estructurada en mi forma "tradicional", pues para no quedarme atrás me adentre poco a poco en esto y con lecturas y cometiendo errores y la gente de los foros corrigiéndome me cree un concepto sencillo para mí:

Es una técnica de programación basado en abstracción y polimorfismo de datos, utilizada para el desarrollo de sistemas informáticos (Web en mi caso), ofreciéndonos ventajas como la reutilización de código, la abstracción de datos, herencia entre otras, haciendo mas fácil el mantenimiento de nuestros sistemas y permitiéndonos crear sistemas más complejos.

Pero Como se implementa??.
La Programación Orientada a Objetos como su nombre lo indica trabaja mediante objetos que son creados mediante clases.
Entonces surge la pregunta que es una clase?? Sencillamente es la manera por la crearemos los objetos. un pequeño ejemplo:

<?php
class clase{
//definimos los métodos y atributos la clase
}
?>

y como la instanciamos??

$objeto = new clase();

El ejemplo anterior creamos una clase llamada "clase", luego la instanciamos y la asignamos a la variable "$objeto" convirtiendo esta variable en un objeto de tipo clase y mediante de este acceder a sus atributos y métodos.

Pero atributos, métodos que son y para que se usan??.
Una clase se compone de varios componentes que debemos tomar en cuenta y estos:
-Atributos.
-Métodos.

Un atributo no es más que los datos propios de nuestro objeto, en PHP son definidos como variables y se accede a ellos de la siguiente forma

class clase
{
   public $atributo;  
   public function metodo()
   {
     $this->atributo = "hola";
   }
}

y como accedemos a ellos??

$objeto = new clase();
echo $objeto->atributo;
Como podemos observar los atributos dentro de nuestras clases los definimos con una visibilidad (public, private, protected) y una variable de PHP y los manejamos con la palabra "$this->atributo;", luego para acceder a ellos desde la instancia del objeto solo debemos indicarle al objeto cual deseamos instanciar sencillo no??. Normalmente los atributos son declarados de visibilidad privada "private" para que solo se pueda acceder a ellos mediante los métodos de la misma clase.

Continuando hemos hablado de métodos y colocamos uno en el ejemplo anterior y todavía no definimos que son. Un Método es la acción que deseamos que ejecute nuestro objeto, en PHP se definen por medio de la palabra "function", al igual que los atributos podemos indicarle una visibilidad, si no indicamos ninguna sencillamente tomara visibilidad publica.  Veamos cómo se trabajan.

class clase
{
     private $atributo;
     public function metodo()
     {
         $this->atributo = "hola";
         return $this->atributo;
     }
}

Como se accede a los métodos??

$objeto = new clase;
echo $objeto->metodo();

si se fijan acá estamos indicándole al objeto que ejecute la acción método en este caso sencillamente asignara al atributo la palabra "hola" y luego la retornara mostrando  en la pantalla al hacer el echo de esta acción hola.

Pues ya que conocemos que son los atributos y que son los métodos y que estos tienen una visibilidad vamos a indicar cuáles son las posibles visibilidades que estos pueden tomar:

-Visibilidad Pública: Declaramos un atributo o un método publico antecediendo del nombre del atributo o la declaración del método la palabra public.

public $atributo;#atributo publico
public function metodo()#metodo publico
{
}

Si declaramos un atributo o un método con esta visibilidad pueden ser accedidos desde cualquier lugar de nuestro programa como lo veíamos cuando hablamos de estos anteriormente para poder acceder a alguno de ellos desde la instancia colocábamos la palabra public.

class clase
{
     public $atributo;
     public function metodo()
     {
         $this->atributo = "hola";
         return $this->atributo;
     }
}
$objeto = new clase;
$objeto->metodo();
echo $objeto->atributo;

si colocamos el siguiente código nos mostrara la palabra hola, ya que primero estamos ejecutando el método donde asignamos al atributo esta cadena de texto y luego estamos imprimiendo el atributo, como observamos pudimos acceder tanto al método como al atributo desde la instancia de nuestro objeto ya que estaban con visibilidad publica.

-Visibilidad Privada: Declaramos un atributo o un método privado antecediendo del nombre del atributo o la declaración del método la palabra private.

private $atributo;#atributo privado
private function metodo()#metodo privado
{
}

Cuando declaramos un método privado solo podemos acceder a este mediante un método de nuestro objeto, siguiendo el ejemplo anterior vemos

class clase
{
     private $atributo;
     public function metodo1($texto)
     {
         $this->atributo = $texto;
         $this->metodo2();
         return $this->atributo;
     }
     private function metodo2()
     {              
                         $this->atributo .= " agregando del metodo privado";
     }
}
$objeto = new clase;
echo $objeto->metodo1("hola");


si nos fijamos se creo un método publico para poder acceder al método y atributo privado si hubiéramos echo como en el ejemplo anterior que lo instanciamos de esta manera

$objeto = new clase;
$objeto->metodo2();
echo $objeto->atributo;

nos hubiera salido el siguiente error de sintaxi Fatal error: Call to private method clase::metodo2() from context ''  debido a que estábamos intentando acceder a un atributo o método privado desde la instancia de la clase y la visibilidad privada solo permite acceder a estos desde la misma clase.

-Visibilidad Protegida: cuando declaramos un atributo o método protegido (protected) toma la misma forma que la visibilidad privada con la salvedad de que también se puede acceder a ellos por medio de la herencia, cuando hablemos de la herencia se colocara un ejemplo de este tipo de visibilidad.


Constructores: Los constructores son sencillamente la primera acción que se ejecuta al momento de instanciar una clase, estos se ejecutan de manera automática, es decir cuando realizamos algo como esto

$objeto = new clase();

Automáticamente se ejecuta el constructor de la clase "clase", este tipo de métodos mayormente es utilizado para inicializar los atributos que se van a utilizar dentro de nuestras clases ya que se ejecuta antes que cualquier otro método.

Como declaramos un constructor?? en PHP 4 los constructores se declaraban creando un metodo con el mismo nombre de la clase al estilo "C++", a partir de PHP5+ los constructores se declaran mediante un metodo llamado "__construct" un ejemplo


php4


class clase
{
     function clase()
     {
     }
}

en PHP5+
class clase
{
     public function __construct()
     {
     }
}


muchos autores recomiendan declarar constructores aunque sean vacios, yo personalmente casi siempre los declaro para inicialización de atributos e incluso a veces llamo a funciones privadas desde el constructor.


Continuando con nuestro articulo ahora hablaremos sobre la herencia

La herencia: No es más que el crear una clase a partir de una clase existente, esto se realiza de la siguiente manera:

<?php
class nombre_clase extends clase_padre
{
/*atributos y metodos de la clase*/
}
?>

Sencillamente para crear una clase que herede de otra colocamos el nombre de la clase seguido de la palabra “extends” y el nombre de la clase de la que va a derivar
, como se implementa??
Veamos un ejemplo: supongamos que tenemos un aula de clases, dentro de esta aula tenemos personas, las personas tienen atributos como nombre,apellido,cedula,dirección y ejecutan acciones como saludar, despedirse entre otras, en el aula de clase las personas se dividen en dos tipos los que son alumnos y los que son profesores, los profesores tienes atributos como su nombre, apellido, dirección, materias impartidas y ejecutan acciones como saludar, despedirse, iniciar la clase, aplicar prueba, corregir la prueba, los alumnos también tienen sus atributos como nombre, apellido, dirección, carrera que estudia y ejecutan acciones como saludar, despedirse, realizar prueba, ver notas, por poner un ejemplo, entonces podemos crear dos clases una para alumno y una para profesores con todos sus métodos y atributos cierto?? Diciéndole los atributos y métodos de los alumnos y otra diciéndole todos los atributos y métodos de los profesores?? Pues aunque pudiera hacerse de esa manera y funcionar no es la manera más optima porque en  la POO existe lo que llamamos herencia, entonces de este planteamiento podemos indicar 3 clases una clase PADRE llamada persona esta clase tendremos los atributos y métodos que indicamos que realizan normalmente las personas sin indicar titulo ni nada parecido, atributos(nombre,apellido,direccion) y acciones (saludar y despedirce) estos atributos y estas acciones son comunes para los alumno ya que como persona pueden saludar tanto al otro alumno como a un docente y viceversa, ahora que acciones realiza un docente que un alumno no segun las establecidas?? bueno es ahi donde creamos la clase hijo docente, pero hijo porque?? porque como docentes también tenemos los atributos de persona como son el nombre el apellido, etc, igual pasa con la clase alumno, seria un hijo de persona ya que como alumnos también tenemos un nombre, apellido, etc y tendríamos acciones que se realizan como alumno que como profesor no, bueno espero no haberme hecho un lio. Vamos a la implementación de nuestro pequeño ejemplo dijimos que la solución mas correcta  es crear una clase padre llamada persona para ello creamos un archivo llamado

personas.php

class persona
{
            protected $nombre;
            protected $apellido;
            protected $direccion;
            public function __construct($nombre = NULL,$apellido = NULL,$direccion = NULL)
            {
                        $this->nombre = $nombre;
                        $this->apellido = $apellido;
                        $this->direccion = $direccion;
            }
            public function saludar($quien = "alumnos")
            {
                        $saludar = "Buenos dias ".$quien;
                        return $saludar;
            }
            public function despedirce()
            {
                        $despedirce = "Hasta luego";
                        return $despedirce;
            }
}

que hicimos??
Creamos la clase persona definimos los atributos como protected esto como indicabamos cuando hablamos de la visibilidad para que solo la clase persona y las clases que derive de esta puedan tener acceso a estos atributos. siguiendo con el ejemplo creamos los metodos que son las acciones que va a realizar la clase persona, estas acciones seran simples mensajes que se mostraran un saludo y una despedida, ahora procedemos a crear ahora la clase profesor para esto creamos un archivo llamado profesor.php
<?php
#incluimos la clase padre persona
require_once( "persona.php" );
class profesor extends persona
{
            private $clases_impartidas;      
            public function  __construct($nombre = NULL,$apellido = NULL,$direccion = NULL)
            {
                        parent::__construct($nombre,$apellido,$direccion);                  
            }          
            public function iniciarClase($tema = NULL)
            {
                        $mostrar = $this->saludar("alumnos");              
                        $mostrar .= "<br/>La clase de hoy es sobre ".$tema." atentamente ".$this->nombre;
                        return $mostrar;
            }
            public function realizarPrueba($tema = NULL)
            {
                        $mostrar = $this->saludar("alumnos");  
                        $mostrar .= "<br/>La prueba de hoy es sobre ".$tema." Atentamente ”.$this->nombre;
                        return $mostrar;
            }          
}
$profesor = new profesor();
echo $profesor->realizarPrueba("matematica");
?>

que hicimos??

creamos una clase llamada profesor derivada de la clase persona, esto para acceder a los datos o atributos y acciones o métodos de la clase persona de manera que un profesor pueda indicar sus datos personales o sencillamente saludar o despedirse, si se fijan dentro de la clase profesor accedimos al método “datosPersonales” de personas y además dentro del inicio de clases y la realización de la prueba accedimos al atributo nombre de persona, esto es la grandeza de la herencia poder reutilizar los métodos en diferentes clases ya que al momento de realizar la clase alumno también se podrá acceder a estos métodos ahorrándonos el tiempo de estar escribiendo el mismo código varias veces.

La clase alumno la dejo para que la creen ustedes de manera de práctica ya que con la explicación de la clase profesor se explico los principios de la herencia.

Por este post creo que es todo cualquier observación o corrección la pueden realizar, acepto criticas ya que el blog es tanto para enseñar como para aprender saludos a todos los lectores hasta una próxima oportunidad.








5 comentarios:

  1. Excelente post compañero me ayudo a comprender un poco mas las clases en PHP, saludos

    ResponderEliminar
  2. Muchas gracias a ti tambien amigo por tu comentario me alegro que te alla ayudado cualquier sugerencia o critica es aceptada

    ResponderEliminar
  3. Fantastico POST, me ha servido mucho para entender mejor lo que muchas veces hacemos por repeticion.

    ResponderEliminar