Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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
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)
interprete PHP realizó la llamada al método__construct, asignando los valores como se indica en el constructor.
coordenada_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
si se desea calcular la distancia entre dos puntos es necesario der un nuevo método que recibe por
da_x coordenada_y
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.
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.
*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
class UnaClase{
Indica que se comienza a denir una clase con el nombre , que está basada en la clase
.
una_clase
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.