FRANCISCO MUNOZ
CATEDRATICO. Ing. Juan Espinoza
QUE SON CLASES
Una clase no es otra cosa que una especie de plantilla dentro de la cual se pueden definir una serie de variables llamadaspropiedades –que pueden contener valores predefinidos– y un conjunto de funciones denominadas métodos que pueden ser invocadasdesde cualquier parte del documento por un objeto o instancia de esa clase.
La sintaxis que permite definir una clase es siguiente:
class nombre {
....
... definición de variables y/o propiedades....
....
.. constructor (opcional)...
....
.. destructor (opcional)...
....
.. definición de métodos o funciones ...
....}
La palabra reservada class es obligatoria y ha de ir seguida de un nombre mediante el que será identificada la clase. La definición de la clase comienza con un llave de apertura ({) y acaba con una llave de cierre (}). Entre ambas llaves podemos incluir sus variables o propiedades y también sus métodos o funciones.
A las variables o propiedades pueden serles asignados valores, aunque no es imprescindible hacerlo. Los métodos o funcionestienen una sintaxis muy similar a la utilizada en la programación estructurada.
Entre los métodos o funciones susceptibles de ser incluidos en una clase existen dos bastante especiales. Son los llamadosconstructor y destructor. Ninguno de ellos tiene carácter obligatorio. Su peculiaridad estriba en que se ejecutan de forma automática en determinadas circunstancias. Hablaremos de ellas un poco más adelante.
DEFINICION DE LAS PROPIEDADES
Para definir una variable o propiedad en una clase es obligatorio anteponer a su nombre una de estas tres palabras reservadas:public, private o protected. Por compabilidad con versiones anteriores de PHP si se usa la palabra var será interpretada como un alias depublic. El nombre de la variable utiliza la sintaxis habitual de PHP y en el caso de que tratemos de asignarle un valor, bastará con poner detrás del nombre el signo = seguido de ese valor que en el caso de ser una cadena tienen que ir entre comillas.
A modo de ejemplo podemos decir que public $pepe="Jose" es una sintaxis válida, pero que $pepe="Jose" no lo es dado que le falta la palabra reservada (opción de visibilidad) que obligatoriamente debe llevar delante de su nombre y que de no ser incluida provocaría un error.
Lo que se conoce como encapsulamiento es uno de los pilares básicos de la Programación Orientada a Objetos. Permite establecer las condiciones y/o restricciones de visibilidad de los diferentes elementos (propiedades y métodos) de una clase. Cuando al definir una variable o propiedad anteponemos a su nombre la palabra public estamos estableciendo ese carácter público de visibilidad que significa que sus valores pueden ser vistos e incluso modificados desde cualquier parte del script en que sean invocadas.
Por el contrario, si establecemos la visibilidad como private (privada) estamos encapsulando la información de forma que sus valores sólo son accesibles a través de métodos o propiedades incluidos en la propia clase. La tercera de las posibilidades, protected (protegida), flexibiliza un poco la condición private al permitir que el método o propiedad sea ser visible desde la propia clase y desde sus clases extendidas (las trataremos un poco más adelante cuando nos refiramos a la herencia).
FUNCIONES O METODOS DE UNA CLASE
Los métodos o funciones definidas en las clases que tienen una sintaxis casi idéntica al resto de las funciones PHP
function nombre( ){
... instrucciones....
....}
Las diferencias más sustanciales respecto a las funciones de la programación estructurada son:
- – Los métodos siguen los mismos criterios de encapsulamiento que hemos comentado al hablar de las propiedades. Se establecen anteponiendo a la palabra function una de las tres palabras public, private o protected aunque en este caso si se omite no se genera error sino que el método es considerado como public.
- – Siempre que desde un método se invoque una variable o propiedad definida en la misma clase ha de hacerse mediante la sintaxis: $this ->propiedad.
- – Los métodos de la propia clase se invocan de esta forma: $this->nombre_de_la_funcion(). Como es lógico dentro del paréntesis pueden incluirse los parámetros o argumentos que sean necesarios.
Prestemos mucha atención. El $ va siempre delante de la palabra this y solo se escribe una vez y en esa posición. El nombre de la variable (que va siempre después de -> no lleva el $.
Este es un ejemplo de una clase muy sencilla. Como ves el nombre de la clase es MiClase. Como es lógico, si tratas de ejecutar el ejemplo no obtendrás ningún resultado. Será necesario que un objeto utilice esta clase.
<?php
class MiClase{
public $factor1=7; // esta es pública
private $factor2=8; // variable privada
protected $factor3=3; // variable protegida
function calcula($a=3,$b=5){ // al no indicar visibilidad será public
return $this->factor1-$b^2+$this->factor2*$a-$this->factor3;
}
}
?>
QUE SON LOS OBJETOS
Las clases son solo plantillas y sus métodos no serán ejecutados en tanto no exista un objeto que requiera su aplicación. Dicho en forma coloquial, una clase es como una sartén. En tanto no tengamos algo que freir carece de utilidad alguna. Su razón de ser son los objetos susceptibles de se cocinados por ella. Lo mismo ocurre con las clases cuya auténtica razón de ser es servir para la creación y manejo de sus objetos.
CREACION Y DESTRUCCION DE OBJETOS
Para crear un nuevo objeto (instancia de la clase) que utilice una clase determinada debemos usar la siguiente sintaxis:
$objeto = new clase
donde objeto es una palabra cualquiera con la que identificar el objeto (como si se tratara de una variable), new es una palabra reservada obligatoria y clase es el nombre de una clase que puede estar escrita en el mismo documento o en un fichero externo. Si la clase está escrita en un documento distinto del que contiene el script que crea el objeto habremos de utilizar include o require para incluirla.
¡Cuidado! Fíjate que por el momento no hemos puesto los () requeridos para invocar las funcionesdetrás del nombre de la clase.
Cuando se trata de eliminar un objeto (liberar el área de memoria que contiene toda la información relativa a este) podemos utilizar la siguiente sintaxis:
$objeto = null
o
unset(objeto )
si bien es cierto que se destruyen de forma automática una vez termina la ejecución del script que los crea y utiliza.
UTILIZACION DE LOS OBJETOS
Una vez creado un objeto ya se podrán utilizar (si su visibilidad lo permite) y modificar sus propiedades y también las funciones o métodos de su clase. Los métodos se invocan mediante la siguiente sintaxis:
$objeto->funcion()
o
$objeto->funcion(p,q)
o
$objeto->funcion(p)
dónde $objeto es el objeto creado en la instrucción anterior, el -> es obligatorio, funcion es el nombre de uno de los métodos o funciones definidos en la clase invocada y donde los () son obligatorios y además –como ocurría en las demás funciones PHP– puede contener valores, variables, etcétera separadas por comas.
Las propiedades (siempre que su visibilidad lo permita) son accesibles mediante:
$objeto->propiedad
o
$objeto->propiedad=valor
En el primer caso estaríamos leyendo el valor de esa propiedad y en el segundo le estaríamos asignando el incluido después del signo igual.
EJEMPLO
<?php
/* incluimos el fichero que contiene la clase que pretendemos utilizar */
include('ejemplo299.php');
/* creamos un objeto utilizando el nombre exacto de la clase*/
$MiObjeto1=new MiClase; //no lleva paréntesis
/* leeremos los valores de las propiedades */
print "<br />Valor por defecto de la propiedad factor1: ";
/* solo podremos leer desde aquí la propiedad publica factor1
Las propiedades privadas y protegidas solo son accesibles desde la propia clase
y aquí estamos haciendo desde uno objeto que la instancia */
print $MiObjeto1->factor1;
print "<br />Aplicación del método calcula ";
print "<br />No pasamos argumentos. Por tanto calcula con 'a'=3 y 'b'=5: ";
print $MiObjeto1->calcula();
print "<br />Pasamos 15 como argumento por tanto calcula con 'a'=15 y 'b'=5: ";
print $MiObjeto1->calcula(15);
print "<br />Pasamos 125 y -98 como argumentos por tanto calcula con 'a'=125 y 'b'=98: ";
print $MiObjeto1->calcula(125,-98);
/* solo podemos modificar desde aquí la propiedad factor1. Las otras dos por su carácter
privado y restringido solo podrían ser modificadas desde dentro de la propia clase
o de una clase extendida */
print "<br />Modificamos el valor de la propiedad factor1: ";
$MiObjeto1->factor1=196;
print$MiObjeto1->factor1;
print "<br />Cálculo con los nuevos valores por defecto: ";
print $MiObjeto1->calcula();
print "<br />Cálculo con nuevos valores por defecto pero asignando a 'a' el valor 25: ";
print $MiObjeto1->calcula(25);
print "<br />Cálculo con nuevos valores por defecto con 'a'=15 y 'b'=-8: ";
print$MiObjeto1->calcula(15,-8);
/* creamos un nuevo objeto y comprobamos que la modificación de la propiedad factor1
no afectará al nuevo objeto (la modificación se hizo en el objeto anterior no en la clase) */
$MiObjeto2=new MiClase;
print "<br />Cálculo con valores por defecto del nuevo objeto: ";
print $MiObjeto2->calcula();
print "<br />Cálculo con valores por defecto del objeto anterior: ";
print $MiObjeto1->calcula();
/* destruimos el primero de los objetos aunque no sea necesario hacerlo.
Al finalizar el script se destruiría de forma automática */
$MiObjeto1=null;
?>
BIBLIOGRAFIA
http://www.rinconastur.com/php/php87.php