Programación orientada a objetos en PHP4
Ocultación
PHP no soporta la ocultación de información mediante los típicos private, public y protected. Cualquier atributo y método que definamos en una clase será público, por lo tanto, si queremos utilizar algún tipo de ocultación tendrá que ser de forma artificial. Una solución bastante frecuente se basa en anteponer un guión bajo _
a todos aquellos atributos y métodos que deseemos que sean protegidos y privados. Desde luego esto no nos libra de poder utilizarlos desde fuera, ya que dependerá de nosotros el tratar de no utilizar fuera de la clase todo aquello que empiece por guión bajo. Yo no suelo diferenciar entre protegidos y privados, tratando a todo aquello que empieza por guión bajo como si fuera protegido, pudiendo acceder únicamente a ello desde la propia clase y sus herederas. Desde luego nada impide que si alguien necesita diferenciar entre protegido y privado pueda utilizar su propio mecanismo, en cualquier caso, no conviene utilizar dos guiones bajos seguidos, ya que esa nomenclatura la utiliza PHP para cosas internas.
<?php $a = 'salida por defecto'; $v1 =& $a; $v2 =& $a; echo $a."\n"; // -> salida por defecto echo $v1."\n"; // -> salida por defecto echo $v2."\n"; // -> salida por defecto $v2 = 'Salida modificada'; echo $a."\n"; // -> salida modificada echo $v1."\n"; // -> salida modificada echo $v2."\n"; // -> Salida modificada ?> |
En este ejemplo se define una clase con un atributo protegido al que se puede acceder mediante los típicos métodos públicos get y set. La clase dispone también de un método protegido _initialize, que debería ser llamado únicamente desde dentro de la clase, como si en realidad fuera protegida.
Sobrecarga
PHP no soporta la sobrecarga de métodos ni constructores, de forma que no podemos tener varios métodos con el mismo nombre y que se diferencian en el número de parámetros o en su tipo, para llamar a cada uno según sea necesario. La forma de conseguir algo similar es utilizar un conjunto de métodos protegidos y redirigir la llamada al que corresponda en función del número de parámetros o sus tipos, siendo esto último algo limitado debido a que PHP no es un lenguaje fuertemente tipado.
<?php class Punto{ var $x = 0; var $y = 0; function Punto($x, $y){ $this->x = $x; $this->y = $y; } } class Ejemplo{ function metodo1($p){ $p->x = 123; $p->y = 123; } function metodo2(&$p){ $p->x = 123; $p->y = 123; } } $punto =& new Punto(1,1); print_r($punto); Ejemplo::metodo1($punto); print_r($punto); // -> 1,1 Ejemplo::metodo2($punto); print_r($punto); // -> 123,123 ?> |
En este ejemplo se dispone de una clase con un método público de nombre «metodo», el cual acepta llamadas con un parámetro de tipo array, con un parámetro otro tipo, o con dos parámetros. Dentro del método mediante la utilización de las funciones func_num_args
y func_get_args
, obtenemos la información de los parámetros recibidos y redirigimos la petición al método protegido que corresponda.
Es importante tener en cuenta que este sistema nos puede causar problemas cuando trabajamos con objetos, ya que no es posible indicar que queremos pasar un determinado parámetro por referencia, recibiendo de esta forma todos por valor.
Excelente clase de PHP.
Muchas gracias.
me parece estupendo el concepto que utiliza el autor de este articulo.felicitaciones!
Muy buen documental, realmente.
Perfectamente explicado y con ejemplos muy aclaratorios.
Por otro lado, en el post Próximos artículos de PHP, indicabas como futura publicacion «Acceso a bases de datos». Estaría muy interesada en saber cuál sería una buena estructura de acceso a datos en una aplicación web en PHP4 basada en clases y objetos, y siguiendo el modelo MVC.
Muchas gracias!
¡¡ Excelente exposicion !!
Realmente de muy buen nivel, seguro de las cosas que hablas, las exlpicaciones de por qué referenciar un objeto (cuando lo creas), los tips.
Muy claros ejemplos y su desarrollo.
Mis felicitaciones.
Saludos
Gastón.