sábado, 30 de abril de 2011

Instanciar Clase Forma Especial PHP


Hoy veremos una forma de instanciar una clase un poco especial a veces el monton de codigos de nuevos objetos puede ser que ensucien el codigo asi hoy veremos como evitar eso con un metodo un tanto repetitivo y no tan complicado para accesar a los metodos de nuestras clases.

Este metodo tiene que estar en todas nuestras clases para poder usarlo y accesar a los metodos de nuestras clases.

Si ven ahi hay :: yo tambien me pregunte que hace esa onda se conoce como operador de resolución. que sirve para acceder a los metodos de tu clase desde afuera.

luego el metodo devuelve una instancia y ya podemos usar los metodos de la clase como lo hacemos comunmente.

Descargar

comenten no sean bayuncos ...

viernes, 29 de abril de 2011

Mas sobre Interfaces en PHP


Bien hoy veremos un segundo ejemplo utilizando interfaces agregado a lo que hemos visto en los post anteriores.

EL ejemplo se trata de como manejar objetos genericamente ya que sabemos que una clase puede implementar una interface y no tenemos que preocuparnos por los elementos internos o lo que hace esa clase solo con saber que interfaz implementa nos da una informacion especifica de que es lo que hace.

Lo que tratare de explicar es que nos podemos ahorrar mucho codigo pensando bien las cosas y usando las herramientas que nos da la POO en php , en si el ejemplo se basa en una situacion en que subiremos documentos a nuestro servidor , los documentos los subira cualquier departamento de X empresa , todos los documentos tienen las misma propiedades entre si lo unico que cambia es el nombre y la categoria y otras cosas mas .

Lo primero que debemos de hacer es una interfaz que declare los metodos a usar.

Interfaz
Clase Departamento 1

Esta clase implementa los metodos setter y getter con propiedades privadas , estos metodos nos sirven para accesar a esas propiedades privadas.

Clase de procesos
Esta clase nos ayudara a capturar el objeto , ojo un objeto que implemente la interfaz que acabamos de aplicarle a nuestro departamento 1 , esto se llama type hinting que hace que nosotros especifiquemos cualquier objeto que implemente esa interfaz si importar el nombre u otras cosas y asi poder usar los metodos que tiene esa clase.

Por otro lado tenemos un metodo privado al cual le pasamos el objeto generico para que imprima los resultados viendo asi la encapsulacion del metodo que solo puede ser visible en esa clase .

Bien para que nos sirve esto para que a la hora de seguir expandiendo nuestro codigo osea a la hora de crear el departamento 2 no escribamos tanto codigo como vemos en la siguiente imagen.

Solo heredamos de la clase departamento 1 e implementamos la interfaz ya que si no hacemos eso la funcion hecha arriba no capturada el objeto ya que no posee esa interfaz ahi aplicamos que no necesitamos saber datos internos de nuestra clase basta solo que interfaz implementa.

La clase principal quedaria asi :

Instanciamos las dos clases y luego llenamos el objeto para identificar cual es y veremos los resultados :

Bien si probamos el codigo veremos que tenemos un metodo generico que recibe cualquier objeto que implemente la interfaz , eso nos ayuda a ponerle mas logica a la aplicacion al usar orientacion a objetos .

Bien no siempre lo generico es bueno asi que tendremos que identificar en nuestra aplicacion cuales serian los metodos genericos para ahorrarnos trabajo y tiempo el cual lo ocuparemos en otras cuestiones.

Descargar

Comenten no sean Bayuncos .

martes, 26 de abril de 2011

Interfaces en PHP

Entonces, ¿qué es Polimorfismo?

En sí la palabra solo refiere a “muchas formas” y aplicado a la POO es la capacidad de poder tomar varias clases que tiene operaciones iguales y poder invocar a cualquier instancia el mismo método común.

Ventajas: Poder hacer un diseño genérico que se apliquen a varios objetos que tienen operaciones comunes.

Las interfaces son similares a la herencia: la herencia “agrupa” clases que “son lo mismo” (relación de parentesco) y la interface “agrupa” clases que “que realizan las mismas operaciones” (pero no necesariamente son iguales).

Las interfaces son un sistema bastante común, utilizado en programación orientada a objetos. Son algo así como declaraciones de funcionalidades que tienen que cubrir las clases que implementan las interfaces.

En una interfaz se definen habitualmente un juego de funciones que deben codificar las clases que implementan dicha interfaz. De modo que, cuando una clase implementa una interfaz, podremos estar seguros que en su código están definidas las funciones que incluía esa interfaz.

Las interfaces permiten el tratamiento de objetos sin necesidad de conocer las características internas de ese objeto y sin importar de qué tipo son... simplemente tenemos que saber que el objeto implementa una interfaz.

Vemos que tanto interfaces como clases abstractas son muy parecidos, los dos muestran declaraciones que debemos implementar más adelante, pero veamos algunas diferencias:
Una interfaz no puede contener atributos ni métodos implementados, mientras que una clase abstracta sí que puede contenerlos

Una clase sólo puede heredas una clase abstracta, mientras que en una misma clase se pueden implementar varias interfaces.

Las clases abstractas pueden declarar los métodos con diferente visibilidad (public, protected, internal, etc; private no, esto indicaría que una clase derivada no podría ver el método, por tanto no tendría sentido; final tampoco, porque no admitiría implementaciones futuras, aunque una clase derivada sí podría contener un método como final), mientras que en los interfaces todos los métodos deben ser públicos (también static)

Los métodos que no implementamos en una clase abstracta, deben ser abstract, en un interface, todos los métodos son abstract, y ninguno debe ser implementado.

Ejemplo :

Bien el ejemplo usaremos una clase abstracta y una interfaz para que nos comprometa a implementar metodos que son indispensables en un proyecto como el metodo para conectarse a la base de datos o cualquier fuente de datos Luego utilizaremos una clases que herede de la abstracta e implemente la interfaz creada .

Clase abstracta

Interfaz

Clase que que hereda e implementa

Clase que ejecuta


resultado en el navegador

Bien algunos se preguntaran porque tanta vuelta solo para un metodo si lo podemos hacer en un archivo de php con una llamada al metodo , pues si es cierto se puede hacer asi pero la programacion orientada a objetos nos da una creatividad para moldear nuestras aplicaciones porque de una clase abstracta , porque yo quiero que solo sea para heredar que no se pueda instanciar , luego para que una interfaz , la ocupo para que me obligue a implementar ese metodo y algunos diran si por logica tendria que ir ese metodo de conectar a la base pero ya en una aplicacion grande solo bastara ver que todas nuestras clases implementen esa interfaz y sabremos que ese metodo va ahi , y tambien para que cuando programemos en grupo los demas esten obligados a implementar esos metodos, asi nos ahorramos muchos errores.

Descargar

comenten no sean bayuncos...

lunes, 25 de abril de 2011

Sobrescritura de Metodos PHP

Herencia Múltiple
La mayoría de los lenguajes POO no implementan la herencia múltiple, no porque les falte, se considera que lo único que aporta es más posibilidades de errores en los diseños.
Lo que no se podría hacer es heredar de dos o más padres (siempre uno solo):

Aclaración
PHP no implementa Herencia Múltiple como la gran mayoría de los lenguajes POO por considerarse inconveniente. Tampoco es un sustituto hacer uso de las interfaces (que veremos mas adelante) y argumentar que “se puede hacer herencia múltiple”, ya que no es lo mismo y aunque se pudiera, seguiría siendo no recomendado su uso.

“Sobre-escritura” de métodos

Otro elemento del lenguaje es poder sobre escribir un método que heredamos de nuestro padre. Esto se puede hacer simplemente volviendo a definir en la case “hija” un método con el mismo nombre.


Si quisiéramos usar el comportamiento original y solo modificar parte en la clase hija, deberíamos hacer lo mismo que vimos anteriormente en el constructor, invocando desde “parent”.

Consejo
Nuevamente, si heredamos de una clase para luego sobre escribir el método que recibimos significará que muy probablemente el diseño está mal (o que necesita ser rediseñado), ya que carece de sentido heredar algo para luego modificarlo.

domingo, 24 de abril de 2011

Clases Abstractas en PHP

Hay que tener cuidado con la traducción al castellano del manual de PHP donde dice “abstracción de clases”, cuando en realidad es “clases abstractas”.

Técnicamente lo que hacemos definir que la clase no puede ser instanciada, por lo que se le antepone a “class” la palabra “abstract”.

Conceptualmente lo que estamos diciendo es que la clase no puede ser usada directamente y que nos servirá de molde para crear otras clases que sí serán concretas y candidatas a instanciar.

La clase abstracta definira las propiedades y metodos que se necesitaran para implementar las clases derivadas.

Caracteristicas:
  • Las clases abstractas no se pueden instanciar.
  • Las clases que heredan de esta deben implementar todos los metodos abstractos.
  • Las clases abstractas pueden heredar de otras clases.
  • Los parametros de los metodos deben ser iguales, ya que sino sera tratado como otro metodo.
  • Si una clase tiene un metodo abstracto esta debe declararse también como clase abstracta.
Bien ahora veamos un ejemplo de una clase abstracta a la cual necesitamos un metodo generico que necesitemos en alguno momento en nuestras clases como es la de obtener la ip de nuestro visitante.

Clase abstracta
Clase que hereda de la abstracta .
Si nos fijamos es una Final Class la que nos impide que esa clase pueda tener hijos o pueda heredar ya que no nos interesa que tenga hijos sino que sea unica. tambien podemos declarar metodos finales los cuales no sean sobrescritos eso lo veremos mas adelante.

Clase Principal
Lo unicos que hacemos es el require mas la instanciacion y llamamos al metodo e imprimimos el resultado.

Bien este tipo de clases las podemos usar cuando querramos hacer metodos abstractos y genericos que todas las clases que estemos utilizando las necesiten tenemos que pensar en reutilizar nuestro codigo y hacerlo generico.

descargar


comenten no sean bayuncos....

sábado, 23 de abril de 2011

Visibilidad De Los Atributos Y Metodos En PHP

Bien luego de un descanzo merecido seguimos con php-poo y hoy veremos algo basico pero no por eso menos importante , que es la visibilidad de los atributos y metodos en php existen 3 posibilidades Publico,Privado Y protegido .

Visibilidad Publica :

Se puede considerar como “sin restricciones”, lo que es público todos lo pueden acceder o modificar.

Por regla antigua de la POO, en el 99.99% de los casos, ningún atributo debe ser público.
Para la herencia, todo lo que sea “público” se hereda a sus hijos, de igual forma que cualquiera que acceda a la clase puede ver sus atributos y métodos públicos.

Bien la imagen muestra un parque el cual significa que es publico que cualquiera puede acceder a el asi mismo pasa con los atributos y metodos publicos.

Visibilidad Privada :

Esta es la forma mas recomendada de utilizar los metodos y que sean accedidos por otros metodos ya sean asesores esto nos sirve para encapsular nuestro codigo y implementar aquello que dicen que los metodos son escrictamente para esa clase y nadie mas le interesan que a esa clase que los utiliza.

Como vemos en la imagen un centro privado no cualquiera a menos que tenga la autorizacion para acceder a el, asi mismo pasa en la programacion.


Visibilidad Protegida :

Siguiendo este paralelismo, un padre puede prestar el auto a su hijo de la misma forma que podría prestarlo a otro familiar, pero no a “todo el mundo” sin restricciones.

Un punto intermedio entre lo privado y lo público, lo “protegido” son los atributos y métodos que pueden ser accedidos de forma directa como “propios” por parte de los “hijos” de la clase “padre”. Para las clases que no tienen una relación de parentesco su significado es igual al de privado.

Recomendación
No hacer abuso de la visibilidad protegida, solo en casos excepcionales donde se justifique. En los casos habituales todos los atributos deben ser privados y en casos excepcionales a través de algunos métodos getter/setter permitir de forma restringida cargar un valor o consultarlo, de la misma forma crear atributos y métodos protegidos, nunca aplicar estas posibilidades de forma general, mecánica y sin meditar.

Como vemos en la imagen el estado protegido es la visibilidad mas estricta asi como no sabemos que pasa en el pentagono .

comenten no sean bayuncos ...

miércoles, 20 de abril de 2011

Herencia en PHP Parte 3

Bien siguiendo con los ejemplos de herencia hoy veremos uno parecido al anterior solo que con un metodo mas.

Definamos que Usuario es una Persona y que además de tener todos los datos de ella, se define ahora en la clase Padre el método toString

Clase Persona Y el metodo ToString

Clase Usuario con su Constructor.

Solo instanaciamos la clase y le mandamos los parametros al constructor.

¡Y funciona!!!!!
La explicación es que, a diferencia que el constructor, el toString se hereda porque es público pero este se ejecuta de forma automática, sin necesidad de explicitar como en el anterior caso (constructor).

Aquí es donde deberíamos entender que el principio de ocultación refuerza los diseños al ocultar y cerrar el acceso a detalles internos, pero no por eso nos impide poder aprovechar las implementaciones realizadas. Como es este caso, no tenemos acceso a los atributos de forma directa y no podemos modificarlos, pero perfectamente podemos asignarles información y usarlos.

Sigamos con el siguiente Ejemplo.

Los usuarios necesitan un id único “autogenerado”

Aprovecharemos la situación para explicar los “atributos estáticos” (static), o lo que podríamos traducir como “atributos / métodos de Clase”. Estos elementos son de acceso común para todas las instancias de la misma clase. Un ejemplo práctico puede ser que la clase sepa autogenerar un id nuevo (que no se repita cada vez que se construye un objeto), para ello, la clase tienen que contar el id actual para asignarle +1 al próximo usuario.

La clase Persona sigue igual, lo que cambia es la clase Usuario y se agrega un atributo protegido (lo cual permitirá que una clase herede de Usuario y acceder directamente al atributo como propio) y se ajusta el constructor de la clase para no solicitar más el id.
Atención: para que funcione el autogenerado de id el atributo ultimoId debe ser “estático” .

La forma de acceder al atributo estático es usando self::$atributo.

self y parent
Cuando queramos accesar a una constante o metodo estatico por ejemplo desde dentro de la clase podemos usar esta palabra reservada.
self.

Cuando queramos acceder a una constante o metodo de una clase padre, la palabra reservada parent nos sirve para llamarla desde una clase extendida.

Cabe destacar que esto ocurre dentro del mundo “stateless” (“estado desconectado”), por consiguiente él o los objetos se pierden luego de terminada la ejecución de la página, iniciando todo nuevamente (si restaura la pantalla volverá a contar desde “1”).

Descargar

comenten no sean bayuncos ...

martes, 19 de abril de 2011

Herencia en PHP parte 2

Bien hoy veremos un ejemplo sencillo el cual podria que la clase Persona tiene atributos privados nombre y apellido, el constructor del Padre donde carga estos datos es público, de la misma forma que el toString, por consiguiente la clase Hijo podrá construir el objeto, cargarlo con su nombre y apellido y desplegar sus datos cuando haga un echo de Hijo, todo, sin acceder directamente a los atributos de Persona (porque son privados) pero sí pudo hacer uso de ellos a través de métodos públicos o protegidos desde la clase Hijo y que fueron heredados de su padre.
Por consiguiente, veamos algunos ejemplos reales: definiremos una clase muy genérica llamada Persona que usaremos luego para crear distintas clases un poco más concretas y particulares, que se basarán siempre en esa clase. Aquí hay un claro reuso de código, ya que todas aprovecharán lo que ya tiene definido Persona, pero también es claro que existe una relación de parentesco con sus hijos (“no se hereda por el simple hecho de necesitar acceder al código”).

Presta atención, esta herencia no hace nada más que definir que un usuario es, además de tipo “Usuario”, de tipo “Persona”, pero como no hay atributos o métodos “no privados” (public, protected), no tiene acceso directo (“no es visible”) a lo que es “privado” en su Padre.
el usuario es ahora de dos tipos, por consiguiente un “Type Hinting” (validación de tipos) que filtre personas aceptará al usuario porque “el Usuario es una Persona”.

Ejemplo 2 Persona agrega un constructor

En este caso tendremos un método construir que es público, por lo tanto podemos usarlo desde la clase “hija” de forma automática.
Hay que prestar especial atención que en PHP el constructor del padre no se ejecuta de forma automática cuando el hijo define su propio constructor, por lo tanto hay que invocar de forma explícita el constructor del padre.
Repasando: si el hijo no define su constructor, igual que sucede con el toString, el destructor, etc, estos serán heredados de su Padre y sí son ejecutados de forma automática.
Si el usuario define su propio constructor:

Aquí, la clase usuario visualiza el método público de su padre, pero no ve directamente los atributos privados, pero, como ahora “Usuario es una Persona”, aunque no podamos “manipular directamente” los atributos, estos están ahí.

Continuara .....

comenten no sean bayuncos ...