Está en la página 1de 6

Unidad 1: POO - PHP

Cátedra Introducción a Programación Orientada a Objetos


Tecnicatura en Desarrollo de Aplicaciones Web
Facultad de Informática
Buenos Aires 1400 (8300) Neuquén
Universidad Nacional del Comahue, Argentina

POO - PHP
En los temas que vimos hasta ahora nos hemos encontrado con numerosos tipos provistos por PHP, los
números, las cadenas de caracteres, las listas, los arreglos, etc. Cada uno de estos tipos tiene características y
operaciones propias que podemos utilizar para nuestros programas.
Que es un Objeto
En PHP, todos los tipos son objetos. Pero no en todos los lenguajes de programación es así. En general,
podemos decir que un objeto es una forma ordenada de agrupar datos (los atributos) y operaciones a utilizar
sobre esos datos (los métodos).
Es importante notar que cuando decimos objetos podemos estar haciendo referencia a dos cosas parecidas,
pero distintas. Por un lado, , donde se indican cuáles son los atributos y métodos que van
a tener todas las variables que sean de ese tipo. Esta denición se llama especícamente, la clase del objeto.
la denición del tipo

A partir de una clase es posible . A las variables que son de una


clase en particular, se las llama instancia de esa clase.
crear distintas variables que son de ese tipo

Se dice que los objetos tienen estado y un comportamiento, ya que los valores que tengan los atributos de una
instancia determinan el estado actual de esa instancia, y los métodos denidos en una clase determinan cómo
se va a comportar ese objeto.
Deniendo nuevos tipos
Sin bien PHP provee un gran número de tipos pre-denidos, en ocaciones, utilizar solo los tipos provistos
por el lenguaje resulta insuciente. El lenguaje nos provee herramientas para crear nuevos tipos de datos que
almacenen información relevante para el problema a resolver y contengan las funciones para operar con esa
información.
Por ejemplo, si se quiere representar un punto en el plano, es posible hacerlo mediante un arreglo asociativo
de dos elementos, donde uno de sus elementos es el valor correspondiente a la coordenada x y el otro el valor
correspondiente al valor de la coordenada y. Esta implementación es limitada, ya que si se quiere poder operar
con distintos puntos (sumarlos, restarlos o calcular la distancia entre ellos) se deberán tener funciones sueltas
para realizar las diversas operaciones.
Podemos denir un nuevo tipo , que almacene la información relacionada con el punto, e implemente
las operaciones necesarias para poder operar con elementos denidos con el nuevo tipo.
Punto

Ejemplo de una clase Punto


La clase Punto debe representar puntos en el plano. Existen varias formas de representar un punto en el
plano, por ejemplo, coordenadas polares o coordenadas cartesianas. Además, existen varias operaciones que se
pueden realizar sobre un punto del plano, e implementarlas todas podría llevar mucho tiempo.
Introducción a la Programación Orientada a Objeto - TSDAW - TSASSL
En esta primera implementación, se utiliza la representación en coordenadas cartesianas, y se implementan
algunas operaciones básicas.
En primer lugar, creamos una clase Punto que simplemente almacena las coordenadas.
1 <?php
2 c l a s s Punto {
3 // R e p r e s e n t a c i ó n de un punto en e l p l a n o
4 // l o s a t r i b u t o s son : $coordenada_x e $coordenada_y
5 // r e p r e s e n t a n l o s v a l o r e s de l a s c o o r d e n a d a s c a r t e s i a n a s .
6 private $coordenada_x ;
7 private $coordenada_y ;
8
9
10 public function __construct ( $x , $y ) {
11 // Metodo c o n s t r u c t o r de l a c l a s e Punto
12 // $x y $y son v a l o r e s n u m e r i c o s
13 // que r e p r e s e n t a n puntos en e l e j e c a r t e s i a n o
14 $this −>coordenada_x = $x ;
15 $this −>coordenada_y = $y ;
16 }
17 public function getCoordenada_x ( ) {
18 return $this −>coordenada_x ;
19 }
20 public function getCoordenada_y ( ) {
21 return $this −>coordenada_y ;
22 }
23 }
24 // s e c r e a un o b j e t o punto y s e a s i g n a a l a v a r i a b l e
25 $p = new Punto ( 5 , 7 ) ;
26
27 // s e v i s u a l i z a e l o b j e t o
28 p print_r ( $p ) ;
29
30 // s e o b t i e n e y v i s u a l i z a e l v a l o r c o n t e n i d o en l a v a r i a b l e i n s t a n c i a coordenada_x
31 echo $p−>getCoordenada_x ( ) ;
32
33 // s e v i s u a l i z a e l v a l o r c o n t e n i d o en l a v a r i a b l e i n s t a n c i a y coordenada_y
34 echo $p−>getCoordenada_y ( ) ;
35 ?>

En la primera línea del código se dene una nueva clase llamada Punto.

ATENCIÓN:

Por convención, los nombres de las clases denidas por el programador se escriben con mayúsculas junto a cada
nueva palabra que comienza . Ejemplos: Punto, ListaEnlazada, Hotel.
Luego se denen cada una de las variables instancias de la clase, por convención cada una de las varibles in-
stancias deben ser creadas como privadas y solo se pueden obtener los valores de dichas variables a traves de
sus métodos de acceso get/set.
La función __construct es una función particular, es el método constructor de la clase Punto. Este método
se ejecuta cada vez que se crea una nueva instancia de una clase.
Con la sentencia , se crea un nuevo objeto punto (una nueva instancia de la clase Punto),
y se almacena una referencia a ese punto en la variable . Los valores que se asignaron a y
new Punto(5,7)

son 5 y 7 respectivamente. Si bien el constructor no fue invocado explícitamente, internamente el


$p coordenada_x

interprete PHP realizó la llamada al método__construct, asignando los valores como se indica en el constructor.
coordenada_y

Incorporar validaciones al constructor


La implementación realizada para clase Punto, permite guardar valores e que representan puntos del
eje cartesiano . Si bien en la documentación se indica que los posibles valores de x e y deben ser numéricos, el
x y

código no impide que a o a se les asigne un valor no numérico.


x y

2
Introducción a la Programación Orientada a Objeto - TSDAW - TSASSL
A continuación se utiliza una función propia de PHP para vericar que los valores asignados a
los atributos coordenada_x e coordenada_y son valores numéricos.
is_numeric,

En el caso de que alguno de los valores no sea numérico, se lanza una excepción del tipo TypeError. A
continuación se visualiza el constructor de la clase Punto con la vericación de los datos.
1 public function __construct ( $x , $y ) {
2 // Metodo c o n s t r u c t o r de l a c l a s e Punto
3 i f ( is_numeric ( $x ) && is_numeric ( $y ) ) {
4 $this −>coordenada_x = $x ;
5 $this −>coordenada_y = $y ;
6 } else
7 throw new E r r o r E x c e p t i o n ( "x e y deben s e r v a l o r e s n u m é r i c o s " ) ;
8 }

Este nuevo constructor impide que se creen instancias con valores inválidos para x e y.
1 $p = new Punto ( " j " , 7 )
2 PHP N o t i c e : Use o f u n d e f i n e d c o n s t a n t j − assumed ' j '
3 i n . . / f a c u / poo /2015/ ws/ t e o r i a / Punto . php on l i n e 29
4 PHP F a t a l e r r o r : Uncaught e x c e p t i o n ' Exception ' with message
5 ' x e y deben s e r v a l o r e s numéricos ' i n . . / f a c u / poo /2015/ ws/ t e o r i a / Punto . php : 1 7
6
7 Stack t r a c e : #0 . . / f a c u / poo /2015/ ws/ t e o r i a / Punto . php ( 2 9 ) : Punto−>__construct ( ' j ' , 7 )
8 #1 {main} thrown i n / media /DATOS/ Dropbox / f a c u / poo /2015/ ws/ t e o r i a / Punto . php on l i n e 17

*Métodos de una clase


La clase Punto implementada, solo permite crear objetos de la clase con valores para las variables
y que deben ser sí o sí numéricos, pero no es posible operar con esos valores. Por ejemplo,
coordena-

si se desea calcular la distancia entre dos puntos es necesario der un nuevo método que recibe por
da_x coordenada_y

parámetro el punto con el cual se quiere calcular la distancia.


distancia

1 public function d i s t a n c i a ( $otroPunto ) {


2 // Devuelve l a d i s t a n c i a e n t r e e l o b j e t o Punto y e l r e c i b i d o por parametro
3 $dx = $this −>getCoordenada_x ( ) − $otroPunto −>getCoordenada_x ( ) ;
4 $dy = $this −>getCoordenada_y ( ) − $otroPunto −>getCoordenada_y ( ) ;
5 $ l a D i s t a n c i a = pow ( ( $dx ∗ $dx + $dy ∗ $dy ) , 0 . 5 ) ;
6 return $ l a D i s t a n c i a ;
7 }

Una vez agregado este método a la clase Punto, será posible obtener la distancia entre dos puntos, de la
siguiente manera:
1 $p = new Punto ( 5 , 7 ) ; // s e c r e a un o b j e t o punto y s e a s i g n a a l a v a r i a b l e $p
2 print_r ( $p ) ; // s e v i s u a l i z a e l o b j e t o
3 $p2 = new Punto ( 2 , 3 ) ; // s e c r e a un o b j e t o punto y s e a s i g n a a l a v a r i a b l e $p2
4 echo "La d i s t a n c i a e n t r e l o s punto e s : " . $p−>d i s t a n c i a ( $p2 ) ;

Podemos ver, sin embargo, que la operación para calcular la distancia incluye la operación de restar dos
puntos y la de obtener la norma de un vector. Sería deseable incluir también estas dos operaciones dentro de
la clase Punto. Agregaremos, entonces, el método para restar dos puntos:
1 public function r e s t a r ( $otroPunto ) {
2 $x = $this −>getCoordenada_x ( ) − $otroPunto −>getCoordenada_x ( ) ;
3 $y = $this −>getCoordenada_y ( ) − $otroPunto −>getCoordenada_y ( ) ;
4 $nuevoPunto = new Punto ( $x , $y ) ;
5 return $nuevoPunto ;
6 }

La resta entre dos puntos es un nuevo punto. Es por ello que este método devuelve un nuevo punto, en lugar
de modicar el punto actual.
A continuación, denimos el método para calcular la norma del vector que se forma uniendo un punto con
el origen.
1 public function norma ( ) {

3
Introducción a la Programación Orientada a Objeto - TSDAW - TSASSL
2 $x2 = $this −>getCoordenada_x ( ) ∗ $this −>getCoordenada_x ( ) ;
3 $y2 = $this −>getCoordenada_y ( ) ∗ $this −>getCoordenada_y ( ) ;
4 return pow ( ( $x2 + $y2 ) , 0 . 5 ) ;
5 }

En base a estos dos métodos es posible implementar el método distancia de la siguiente manera:
1 public function d i s t a n c i a _ 2 ( $otroPunto ) {
2 $ r = $this −>r e s t a r ( $otroPunto ) ;
3 return $r −>norma ( ) ;
4 }

En denitiva, se denieron tres operaciones en la clase Punto, que nos sirve para calcular restas, normas de
vectores al origen, y distancias entre puntos.
1 $p = Punto ( 5 , 7 ) ;
2 $q = Punto ( 2 , 3 ) ;
3 $ r = $p . r e s t a r ( $q ) ;
4 print_r ( $ r ) ;
5 echo $r −>norma ( ) ;
6 echo $q−>d i s t a n c i a ( $ r ) ;

ATENCIÓN:

Cuando denimos los métodos que va a tener una determinada clase es importante tener en cuenta que el
listado de métodos debe ser lo más conciso posible.
Es decir, si una clase tiene algunos métodos básicos que pueden combinarse para obtener distintos resultados,
no queremos implementar toda posible combinación de llamadas a los métodos básicos, sino sólo los básicos y
aquellas combinaciones que sean muy frecuentes, o en las que tenerlas como un método aparte implique una
ventaja signicativa en cuanto al tiempo de ejecución de la operación.
Este concepto se llama ortogonalidad de los métodos, basado en la idea de que cada método debe realizar
una operación independiente de los otros. Entre las motivaciones que puede haber para agregar métodos que
no sean ortogonales, se encuentran la y la
facilidad de uso .
eciencia

Métodos especiales
Así como el constructor, __construct existen diversos métodos especiales que, si están denidos en una
clase, PHP los invoca cuando se utiliza una instancia en determinadas situaciones.
Visualizar objetos
Para visualizar el valor de las variables instancias de un objeto en PHP hay incorporar en clase un método
especial llamado Este método debe retornar una cadena de caracteres con la informacion que
se desea visualizar. El método se invoca cada vez que se llama a la función . El método no
__toString.

requiere ningún parámetro.


echo __toString

Para visualizar al punto como un par ordenado es necesario implementar el siguiente método dentro de la
clase Punto:
1 public function __toString ( ) {
2 return " ( " . $this −>getCoordenada_x ( ) . " , " . $this −>getCoordenada_y ( ) . " ) " ;
3 }

Una vez denido este método, cada objeto Punto se visualizara como un par ordenado cuando se necesite
una representación de cadenas.
1 $p = new Punto ( − 6 ,18) ;
2 echo $p ;

4
Introducción a la Programación Orientada a Objeto - TSDAW - TSASSL

SABIAS QUE...
PHP se reserva todos los nombres de los métodos que comienzan con __ como mágicos. Se recomienda que no
utilice los nombres de métodos con __ en PHP a menos que desee alguna funcionalidad mágica documentada.
Los nombres de los métodos __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __is-
set(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() y __de-
bugInfo() son mágicos en las clases PHP. No se puede tener métodos con estos nombres en ninguna clase a
menos que se desee redenir la funcionalidad mágica asociada a estos.

Método destructor
PHP 5 introduce un concepto de destructor similar al de otros lenguajes orientados a objetos, tal como C++.
El método destructor será llamado tan pronto como no hayan otras referencias a un objeto determinado, o en
cualquier otra circunstancia de nalización.

1 public function __destruct ( ) {


2 echo $this . " i n s t a n c i a d e s t r u i d a , no hay r e f e r e n c i a s a e s t e o b j e t o " ;
3 }

*Resumen

Los objetos es una formas ordenadas de agrupar datos (atributos/características) y operaciones sobre estos
datos (métodos/comportamiento).

Cada objeto pertenece a una clase o tipo, que dene cuáles serán sus atributos y métodos. Y cuando se crea
una variable de una clase en particular, se crea una instancia de esa clase.

Para nombrar una clase denida por el programador, se utiliza una letra mayúscula al comienzo de cada
palabra.

El constructor de una clase es el método que se ejecuta cuando se crea una nueva instancia de esa clase.

Es posible denir una gran variedad de métodos dentro de una clase, incluyendo métodos especiales que
pueden ser utilizados por ejemplo para visualizar un objeto como una cadena de caracteres . __toString

5
Introducción a la Programación Orientada a Objeto - TSDAW - TSASSL

REFERENCIA DEL LENGUAJE PHP

class UnaClase{
Indica que se comienza a denir una clase con el nombre , que está basada en la clase
.
una_clase

Dentro de la clase se denen sus métodos y atributos.


object

public function __construct(..){


Dene el de la clase. En general, dentro del constructor se establecen los valores iniciales
de todos los atributos de la clase.
constructor

private $variableInstancia ;
Por convención todas las variables instancias de una clase van a ser declaradas como privadas y solo
van a poder ser accedidas a partir de sus métodos de acceso (get/set), denidos en la clase.
public function metodo(...) {
Dene un método de la clase que puede ser accedido de manera pública, es decir desde cualquier
instancia de la clase UnaClase .
private function metodo(...) {
Dene un método de la clase que SOLO puede ser accedido de manera privada, es decir solo desde
cualquier otro método denido en UnaClase .
$variable = new UnaClase(...)
Crea una nueva instancia de la clase , los parámetros que se ingresen serán enviados al
constructor.
UnaClase

$variable->metodo(...)
Invoca al método metodo de la clase de la cual $variable es una instancia.
public function __toString(){
Método especial que debe devolver una cadena de caracteres, con la representación en texto de la
instancia.

También podría gustarte