paginas web barcelona

Centro Web Barcelona

Soluciones en Internet

PHP Orientado a Objetos II



programacion phpLa encapsulación el la capacidad de agrupar varios elementos con límites definidos.
La abstracción, primero generalizamos, encapsulación establecemos los límites.

Cuando me preparo para salir en bicicleta no me preocupa el modo en cómo funciona ésta, solo estoy preocupado en la condición de mis piernas, si ya desayuné, y si llevo lo necesario —agua, alimentos— para mi entrenamiento. Una vez en la práctica si necesito ir más rápido en la bicicleta basta con subir una marcha, pero no estoy pensando cómo la bicicleta interactúa con los demás elementos para realizar la acción que le acabo de indicar. Y en especial a mí no me interesa saber cómo ocurre la magia, solo estoy enfocado en subir de marcha, no en el proceso que implica esto.


La encapsulación se encarga de mantener ocultos los procesos internos, dándole al programador acceso sólo a lo necesario, como las APIs, no puedes cambiar procesos, sólo tienes acceso a unos métodos ya definidos. La encapsulación brinda dos ventajas:
Las acciones del usuario pueden ser controladas internamente.
La segunda ventaja es poder realizar cambios/mejoras sin que esto afecte el modo en que los usuarios interactúan con la aplicación. Solo tienes que mantener igual la forma de acceder al método, en el caso de un control remoto, si el botón de apagado se encarga de apagar la televisión entonces que esa siga siendo su acción, así como los botones de volúmen o cambiar de canal, sería raro que al presionar el botón de apagado la T.V. ésta aumente de volumen o cambie de canal.


Ahora, relacionando con POO el aislamiento es algo que debemos tener en cuenta. Cada objeto está aislado del exterior, es un módulo, y cada clase especifica cómo pueden acceder a sus propiedades. El aislamiento protege a las propiedades de un objeto contra su modificación para quienes no tienen derecho a acceder a ellas, solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de manera inesperada. A esto se le conoce como principio de ocultación.


Tomaré el ejemplo de la hamburguesa.


class Burger {
    $ingredients = [];

    function make($ingredients)
    {
        $this->giveMeIngredients($ingredients);
        $this->prepare();
        $this->cook();
    }

    function giveMeIngredients($ingredients)
    {
        $this->ingredients = $ingredients;
    }

    function prepare()
    {
        // prepare
    }

    function cook()
    {
        // cook
    }
}

La declaración de atributos va precedido de una palabra que puede ser public, private o protected. El ejemplo anterior no tiene establecido el nivel de visibilidad:
Public. El atributo o método precedido de public podrá ser leído o llamado desde cualquier parte del código, sea desde la misma clase o fuera de ella, esto significa que también podrá ser alterado sin restricciones, por eso se aconseja que los atributos se declaren como privados salvo casos excepcionales.
Private. El atributo o método establecido como private solo puede ser leído desde el interior de la clase. Al intentar acceder desde fuera de la clase obtendríamos un error.
Protected. Los atributos o métodos protected son similares a los private, solo se puede acceder a ellos desde el interior de la clase, pero con una diferencia muy útil, las clases heredadas de está también podrán leer y alterar estos atributos.


Ahora, para modificar la visibilidad debemos pensar de forma abstracta, haciendo una analogía de la clase, ¿Al cliente le interesa preparar su hamburguesa?

¿Le interesa cocinarla? No, así que considero que esos métodos por ahora deberían ser privados, ojo, solo estamos trabajando con este pequeño ejemplo, porque lo correcto sería que una clase llamada Chef se encargue de cocinar la hamburguesa, y el mesero la persona encargada de tomar la orden y servir.


private function prepare()
{
    // prepare
}

private function cook()
{
    // cook
}

La propiedad ingredientes también me gustaría hacerla privada, y mediante el método make cada persona establece cómo quiere su hamburguesa. Y con eso, mi variable $ingredients también será privada, no me gustaría que cualquier objeto tuviera el permiso de modificarla.

private $ingredients = [];

private function giveMeIngredients($ingredients)
{
    $this->ingredients = $ingredients;
}

Y el método make lo haré público, porque quiero que sea el único que se puede acceder desde fuera de la clase.

public function make($ingredients)
{
    $this->giveMeIngredients($ingredients);
    $this->prepare();
    $this->cook();
}

Ahora, como he modificado la visibilidad del método ingredients puedo borrarlo de esta función. Y una manera limpia de implementar esto sería la siguiente:

$burger = new Burger();
$ingredients = ["bread", "lettuce", "ketchup"]; // Es una hamburguesa hipster
$burger→make($ingredients);

El objeto $burger no tiene idea de que existe otro método de nombre giveMeIngredints, prepare and cook, con esto encapsulamos nuestras variables porque él solo tiene accedo al método make, que se encarga de hacer la hamburguesa.
NOTA. En caso de omitir el grado de visibilidad se tomará por defecto como public, hay que prestar mucha atención a esto.

La Programación Orientada a Objetos (Object Oriented Programming) no es un lenguaje más, sino una forma o enfoque diferente de programación; nuestros programas ya no están conformados por un conjunto de funciones, como se hizo por un largo tiempo, sino por objetos que colaboran entre sí para realizar tareas distintas.


Estos objetos se crean a partir de moldes denominados clases, por ejemplo la clase Estudiante, Producto, Usuario, y muchas veces lo nombres son deducidos de nuestras tablas de la base de datos.


La programación orientada a objetos o POO es la tendencia actual de todos los lenguajes de alto nivel, dadas las posibilidades que ofrece. Básicamente se trata de considerar analogías entre las situaciones que tenemos que resolver mediante la programación y los objetos del mundo real a los que estamos acostumbrados, nada raro. Pero, ¿Cuáles son las características de la POO? Abstracción, encapsulación, herencia y polimorfismo.


Abstracción


Expresa las características esenciales de un objeto, las cuales distinguen al objeto de los demás, dejando en segundo término los detalles. Para ser más claro, la abstracción es un término propio, cada quien tiene su propio punto de vista sobre algún evento, decimos que la política es esto o aquello, que la silla es muy incómoda para mí pero para mi compañero es bastante confortable, ¿Ven? Cada quien tiene su propia abstracción.


Sin embargo, ¿Cómo aplicamos la abstracción a la POO? ¿Han escuchado el dicho «divide y vencerás»? Bueno, lo que tenemos que hacer es dividir nuestro código en grupos de código más pequeños, que al unirlos, realizarán el trabajo. El cuerpo humano es un buen ejemplo de abstracción, aunque el cuerpo es una unidad, está constituido por un conjunto de sistemas —respiratorio, digestivo, cardiovascular— y éstos a su vez están compuestos por otros más pequeños. Entonces, ¿Qué es la abstracción? Básicamente es la capacidad de separar los elementos —por lo menos mentalmente— para poder analizarlos de forma singular.


Veamos un ejemplo. Vamos a abstraer una deliciosa hamburguesa.


class Burger {}

También necesito preparar la hamburguesa y cocinarla, por supuesto servirla. Entonces falta agregar esos métodos. Habrá quienes mencionen: “Oye, también falta comerla”. Bueno, eso no lo contemplo en mi abstracción. ¿Ahora se dan cuenta como cada persona tiene una abstracción distinta?

class Burger {
    $ingredients = [];
}

Ahora, ya tengo los ingredientes, necesito hacer la hamburguesa.

class Burger {
    $ingredients = [];

    function make($ingredients)
    {
        $this->giveMeIngredients($ingredients);
        $this->prepare();
        $this->cook();
    }
    function giveMeIngredients($ingredients)
    {
        $this->ingredients = $ingredients;
    }
    function prepare()
    {
        // prepare
    }
    function cook()
    {
        // cook
    }
}

He agregado un método más, el método make que sería el que controla la elaboración de la hamburguesa. Esa sería una abstracción, muy simple pero directa, no necesita nada más.


Ahora, cabe destacar que no solamente existe un solo tipo de hamburguesa. Y los ingredientes dependen del tipo de hamburguesa que necesitemos cocinar, así que eso se los dejo de tarea. ¿Cómo podríamos mejorar esta abstracción?


Cuando trabajamos con clases y objetos en la programación orientada a objetos, generalmente estamos escribiendo código de 2 tipos:
Código encargado de instanciar (o crear) otros objetos
Código que realiza operaciones con dichos objetos


Por ejemplo, consideren que están intentando conectarse al API de un servicio de E-mail o SMS, seguramente necesitarán un KEY para crear el objeto y quizás el email <from> por defecto:


$key = Config::get('mailer.key');
$mailer = new Vendor\Api\Mailer($key, 'i@styde.net');

Y ahora para enviar emails harían algo como:

$mailer->send($to, $subject, $message);

Como les comentaba, las primeras 2 líneas nos sirven para crear un nuevo objeto, la tercera: para enviar un email, son 2 códigos diferentes, pero por lo general los escribimos uno debajo del otro.


¿Cuál es el problema de mezclar ambos tipos de código?


Es la pregunta que responderé durante los próximos 30 minutos, además te daré una introducción a la Inyección de dependencias por constructor y por método (como verás en Laravel 5 a partir de Enero del 2015), también explicaré de nuevo el concepto de interfaces ¿Mi intención? Hacer que seas un programador de OOP sólido.


Espero disfrutes el siguiente video:


Quizás se han preguntado muchas veces acerca de la siguiente sintaxis:

$table→integer('section_id')→unsigned()→nullable();

Este estilo es llamado method chaining y se logra cuando un método devuelve una referencia a otro objeto o a sí mismo,
Explicado suena complicado pero en la práctica es muy sencillo, como veremos en el siguiente video…
David Barranco 14/12/2014 Aprende programación orientada a objetos con PHP, PHP 2 Comentarios
Comparte en Facebook Twitter Google+

¿Alguna vez te has preguntado cómo funcionan ORMs como Eloquent? Eloquent y otros ORMs en PHP hacen uso de algo llamado Métodos mágicos
Los métodos mágicos mágicos los provee PHP y nos permiten realizar ciertas tareas orientadas a objetos.
Los métodos mágicos identifican por el uso de dos guiones bajos “__” como prefijo, y funcionan como interceptores que se llaman automáticamente cuando ocurre una condición.


__get()


Este método se llama cuando intentamos acceder a una propiedad no accesible, acepta como parámetro un valor que es el nombre de la propiedad y deberíamos devolver el valor “virtual” de dic