Php orientado a_objetos

364 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
364
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Php orientado a_objetos

  1. 1. http://www.webestilo.com/php/articulo.phtml?art=27PHP orientado a objetos. Parte ILa mayoría de los lenguajes de programación modernos son orientados a objetos( abreviado OO ) o en su defecto se aproximan mucho a éstos permitiendo algunas de suscaracterísticas como es el caso de PHP.La programación OO principalmente hace uso de clases, objetos, relaciones, instancias,propiedades y métodos.Objetos y clasesCuando hablamos de software OO los objetos casi siempre son elementos físicos, comopuede ser un cliente, proveedor, etc. o elementos conceptuales que existen en el entornosoftware, por ejemplo un objeto encargado del mantenimiento de archivos. El objetivo esrepresentar a éstos elementos de la vida real y a los conceptuales como unidades desoftware.La programación OO esta pensada para construir objetos que contienen atributos yoperaciones de manera que cubran nuestras necesidades. Los atributos son variables quecontienen información del estado de un objeto. Y las operaciones también conocidas comométodos, funciones y acciones realizan modificaciones del propio objeto o realizan algunaacción externa a éste.Una de las principales ventajas de la programación OO es el concepto de encapsulación,conocido también como protección de datos, mediante el cual solo se pueden modificar losdatos de un objeto accediendo a través de sus métodos u operaciones (interfaz del objeto).Nunca se pueden modificar directamente desde la aplicación principal.La funcionalidad de un objeto esta sujeta a los datos que este maneja, una ventaja de usarobjetos es que podemos modificar la funcionalidad de éste, añadir mejoras o corregirerrores sin necesidad de cambiar su interfaz. Ya que en caso contrario un proyecto estaríasujeto a un mayor número de fallos y los cambios serían más costosos.En algunas áreas de la programación de aplicaciones Web el uso de la programación OOestá desestimada, usándose una metodología estructurada basada en funciones, esto esdebido a que determinados proyectos no son lo suficientemente extensos como paraaplicarles una metodología OO.
  2. 2. En la programación OO los objetos son únicos y son instancias a una clase determinada. Enprincipio se define la clase con los atributos y métodos correspondientes y luego se crea elobjeto que esta basado en una determinada clase (esto se conoce como instancia). Se puedecomparar a un objeto con una variable y la clase sería un tipo de dato definido por nosotros.Cómo crear clases, atributos y operaciones en PHPHasta ahora hemos hablado de las clases de una forma conceptual, a continuación veremoscomo se crean, para crear una clase en PHP usaremos la palabra reservada class.La estructura mínima de una clase es la siguiente:class NombreClase {}Para que una clase sea útil, necesita atributos y operaciones. Podemos crear atributos comosi de variables se trataran, con la palabra reservada varclass NombreClase {var $atributo1;var $atributo2;}Podemos crear métodos declarando funciones dentro de la definición de la clase, elsiguiente código crea una clase llamada NombreClase con dos operaciones que no hacennada. A metodo1 no le pasamos ningún parámetro y a metodo2 le pasamos dos parámetros.class NombreClase {function metodo1() {}function metodo2($param1, $param2) {}}
  3. 3. PHP orientado a objetos. Parte IIQué es el constructor de una claseLas clases soportan un tipo de función especial que se conoce como constructor. Elconstructor es llamado cuando se crea el objeto. Normalmente utiliza para inicializar tareascomo: asignación de valores a determinados atributos, crear nuevos objetos necesarios parael correcto funcionamiento de el objeto, etc.El constructor se declara de la misma forma que los métodos, lo único que debemos teneren cuenta es que debe tener el mismo nombre que la clase. A pesar de que nosotrospodemos llamar a el constructor, su principal propósito es ser llamado automáticamentecuando un objeto es creado. A continuación veremos como se declara el constructor de unaclase:class NombreClase {function NombreClase($param) {echo "Constructor llamado con el parámetro $param";}}Cómo usar objetos, instanciar una claseDespués de haber declarado una clase, ya podemos usarla creando un objeto que es unainstancia a esa clase como ya se ha mencionado anteriormente. Es muy importante que estoquede claro, los objetos son instancias a una clase, por lo tanto cada objeto es único.En php creamos un objeto usando la palabra reservada new. También debemos indicar aque clase va a instanciar el objeto que creemos y pasarle los parámetros (si los requiere) alconstructor, en el siguiente código vamos a ver un ejemplo de esto, para ello tomamoscomo referencia la clase anterior NombreClase:$a = new NombreClase("Primero");$b = new NombreClase("Segundo");
  4. 4. $c = new NombreClase();Como resultado de este código vemos que el constructor es llamado cada vez que se crea elobjeto, y vemos que los objetos son únicos aunque sean instancias de la misma clase, elresultado es el siguiente:Constructor llamado con el parámetro PrimeroConstructor llamado con el parámetro SegundoConstructor llamado con el parámetroCómo usar los atributos de una claseUna clase, tiene un puntero especial al que podemos referenciar como $this. Si nuestraclase tiene un atributo llamado $atributo, podemos hacer referencia a este desde nuestraclase (métodos) de la siguiente forma $this->atributo, a continuación podemos ver elcódigo de ejemplo del acceso a un atributo de clase desde un método de la propia clase.class NombreClase {var $atributo;function metodo($param) {$this->atributo = $param;echo $this->atributo;}}Algunos lenguajes permiten limitar el acceso desde fuera a los atributos de una clasedeclarándolos como privados o protegidos ("private", "protected"). PHP no soporta estacaracterística y todos atributos y métodos pueden ser vistos desde fuera de la clase, lo quequiere decir que siempre son públicos.Podemos realizar la misma acción que anteriormente desde fuera de la clase, usando estasintaxis.NombreClase {var $atributo;}$a = new NombreClase();$a->atributo = "valor";echo $a->atributo;Las sentencias anteriores están permitidas en PHP, pero no es una práctica recomendableacceder directamente a los atributos de una clase desde fuera de ésta. Como se hacomentado anteriormente una de las ventajas de la POO es que permite realizarencapsulación por esta razón aunque PHP no permita ocultar los atributos o métodos de unaclase, nosotros deberíamos no acceder directamente a ellos, para diferenciarlos de lospúblicos es conveniente también poner "m_" (de miembro lo cual significa que solo serán
  5. 5. usados dentro de la clase) delante de los nombres de métodos y atributos a los cuales no sequiera acceder directamente desde fuera de la clase.Para los atributos que queramos acceder directamente desde fuera de la clase, deberíamosescribir funciones de acceso, tanto para establecer como para coger valores. Deberíamostener un código como el siguiente:class NombreClase {var $atributo;function get_atributo() { //devuelve el valor de atributoreturn $this->atributo;}function set_atributo($valor_nuevo) { //establece el valor de atributo$this->atributo = $valor_nuevo;}}La finalidad de hacer esto, es clarificar el código y tener una sección de código encargadade acceder a los atributos para mantener la encapsulación, y que no sean accedidosdirectamente. Además si seguimos estas prácticas aumentará la calidad de nuestro softwareya que podremos introducir comprobaciones de datos, como rangos, valores permitidos,etc. Veamos un ejemplo de validación de datos a la hora de asignar un valor a atributomediante el método set_atributo:function set_atributo($valor_nuevo) {if ($valor_nuevo > 100) {$this->atributo = $valor_nuevo;}}En el código superior vemos que cuando queremos asignar a atributo valores inferiores a100 no nos deja, y atributo seguirá manteniendo su valor.Cómo usar los métodos de una claseLos métodos de una clase se pueden llamar de la misma forma que se llaman a losatributos, supongamos que tenemos la siguiente clase:class nombreClase {function metodoa() {return "Has llamado al método A";}function metodob($parametro1) {return "Método B llamado con parámetro: ".$paramtro1;}}
  6. 6. Creamos un objeto de la case nombreClase con el nombre $obj de la siguiente forma:$obj = new nombreClase();Los métodos de un objeto, son llamados de la misma forma que se llaman a funcionesnormales, pasándoles como es el caso de metodob el parámetro que necesiten. Como losmétodos son funciones que pertenecen a un objeto, deberemos indicar en la llamada elobjeto que los incluye, la forma de llamar a un método es idéntica a como llamamos a losatributos de un objeto.$obj->metodoa();$obj->metodob("parámetro que pasamos");Si nuestras operaciones, devuelven algún valor, lo capturamos asignándoselo a unavariable, podemos ver el siguiente ejemplo$txt_retorno = $obj->metodob("Hola");$txt_retorno contendrá la cadena de texto:"Metodo B llamado con parámetro: Hola"PHP orientado a objetos. Parte y IIIQué es la Herencia en PHP y como implementarlaComo su nombre indica el concepto de herencia se aplica cuando creamos una clase, que vaa heredar los métodos y atributos de una ya definida, entonces la clase que hemos creado esuna subclase. Para que una clase sea subclase de otra ya creada deberemos usar la palabrareservada extends en el siguiente código podremos ver como creamos una clase llamadaSubClaseA que heredará los métodos y atributos de una clase definida con anterioridadllamada ClaseA.class SubClaseA extends ClaseA {var $atributo2;function operacion2() {}}Tenemos la clase ClaseA que es definida de la siguiente forma:Class ClaseA {var $atributo1;function operacion1(){}}
  7. 7. Si creamos un objeto de la clase SubClaseA este heredará todos los métodos de la claseClaseA, por lo tanto el siguiente código es válido:$x = new SubClaseA();$x->operacion1();$x->atributo1 = 100;$x->operacion2();$x->atributo2 = 200;Como podemos observar aunque declaremos un objeto de la clase SubClaseA, al ser unaclase extendida de ClaseA podemos hacer uso de todos los métodos y atributos definidos enClaseA como si estuvieran contenidos en SubClaseA.Debemos tener en cuenta que la herencia solo trabaja en una dirección, la subclase o clasehija hereda las características de su clase padre o superclase, pero la clase padre no poseelas características de la hija. Para el caso anterior ClaseA no tendría atributo2 ni metodo2();Como sobrescribir métodos y atributosComo hemos visto anteriormente, una subclase declara atributos nuevos y operacionessobre una superclase. Es posible y en muchos casos útil sobrescribir las mismasoperaciones o atributos declarados en la superclase. Esto se hace para dar a un atributo unvalor diferente en la subclase que el que tiene en la superclase o en el caso de lasoperaciones para cambiar la funcionalidad de estas. Veamos un ejemplo, por ejemplo sitenemos la clase A:class A {var $atributo = valor inicialfunction operación() {echo Clase A:<br>;echo El valor de $atributo es $this->atributo<br>;}}Queremos crear una subclase B y alterar el valor de atributo y la funcionalidad deoperación de la clase A, entonces escribimos:Class B extends A {var $atributo = valor cambiado;function operación() {echo Clase B:<br>;echo El valor de $atributo ahora es $this->atributo<br>;}}Como podemos observar hemos definido una variable y una operación en B con el mismonombre que tenían en A.
  8. 8. Como se ha comentado anteriormente aunque declaremos B no afecta a la definición de A,y si creamos un objeto de la superclase A esté mantendrá sus valores originales. Solosobrescribiremos los valores y funcionalidad de A cuando creemos un objeto de la clase B.A diferencia de otros lenguajes OO, PHP no nos permitirá sobrescribir una función oatributo y poder llamar a los valores de la clase padre.La herencia puede tener muchas capas de profundidad, por ejemplo podemos tener unaclase C que es subclase de B y está última ser subclase de A, la subclase C heredará ysobrescribirá aquellos atributos y métodos de sus clases padres, en este caso A y B.¿Soporta PHP la herencia múltiple?Algunos lenguajes OO soportan herencia múltiple, esto significa que una subclase puedeheredar de varias clases padres. PHP no permite esto y una subclase solo puede heredar deuna clase padre, sin embargo en PHP no hay ningún tipo de restricción en cuanto a elnúmero de subclases que pueden heredar de una misma clase padre o superclase.Qué es el polimorfismo y como implementarloCualquier lenguaje de programación orientado a objetos debe soportar el polimorfismo,esto significa que clases diferentes tendrán un comportamiento distinto para la mismaoperación. Esto lo veremos más claro con el siguiente ejemplo.Supongamos que tenemos dos clases distintas coche y ciclomotor. Ambas tienen suspropios métodos de movimiento, éstos tienen diferentes comportamientos, pero su nombrees el mismoclass coche {function avanza() {}function para() {}function girar_derecha() {}}class ciclomotor {function avanza() {}function para() {}function girar_derecha() {}}Como podemos observar, ambas clases tienen los mismos métodos, supongamos ahora quetenemos otra clase que controla el movimiento de todos los vehículos, es aquí donde entra
  9. 9. en juego el polimorfismo, que dependiendo del objeto que tratemos actuará de una forma uotra el método al que llamamos.class movimiento {function mover_adelante($obj) {$obj->avanza();}}Supongamos que queremos mover cualquier vehículo hacia adelante entonces haríamos:$obj_coche = new coche();$obj_ciclomotor = new ciclomotor();$obj_movimiento = new movimiento();// con esta sentencia el coche avanzaria hacia adelante.$obj_movimiento->mover_adelante($obj_coche);// con esta sentencia el ciclomotor avanzaría hacia adelante.$obj_movimiento->mover_adelante($obj_ciclomotor);
  10. 10. en juego el polimorfismo, que dependiendo del objeto que tratemos actuará de una forma uotra el método al que llamamos.class movimiento {function mover_adelante($obj) {$obj->avanza();}}Supongamos que queremos mover cualquier vehículo hacia adelante entonces haríamos:$obj_coche = new coche();$obj_ciclomotor = new ciclomotor();$obj_movimiento = new movimiento();// con esta sentencia el coche avanzaria hacia adelante.$obj_movimiento->mover_adelante($obj_coche);// con esta sentencia el ciclomotor avanzaría hacia adelante.$obj_movimiento->mover_adelante($obj_ciclomotor);

×