Lo básicoclass
La definición básica de una clase comienza con la palabra
reservada class, seguido de un nombre de clase,
y continuando con un par de llaves que encierran las definiciones
de las propiedades y métodos pertenecientes a dicha clase.
El nombre de clase puede ser cualquier etiqueta válida, siempre que no sea
una palabra reservada de PHP. Un nombre válido
de clase comienza con una letra o un guión bajo, seguido de una cantidad arbitraria de
letras, números o guiones bajos. Como expresión regular, se
expresaría de la siguiente forma:
^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$.
Una clase puede tener sus propias
constantes, variables
(llamadas "propiedades"), y funciones (llamados "métodos").
Definición de una clase sencilla
var;
}
}
?>
]]>
La pseudovariable $this está disponible cuando un
método es invocado dentro del contexto de un
objeto. $this es una referencia al objeto
invocador (usualmente el objeto al cual el método pertenece, aunque
puede que sea otro objeto si el método es llamado
estáticamente desde el contexto
de un objeto secundario).
Algunos ejemplos de la pseudovariable $this
foo();
// Nota: la siguiente línea arrojará una advertencia si E_STRICT está habilitado.
A::foo();
$b = new B();
$b->bar();
// Nota: la siguiente línea arrojará una advertencia si E_STRICT está habilitado.
B::bar();
?>
]]>
&example.outputs;
new
Para crear una instancia de una clase, se debe emplear la palabra reservada
new. Un objeto se creará siempre a menos que el objeto tenga un
constructor que arroje una
excepción en caso de error. Las
clases deberían ser definidas antes de la instanciación (y en algunos casos
esto es un requerimiento).
Si se emplea un string que contenga el nombre de una clase con
new, se creará una nueva instancia de esa clase. Si
la clase estuviera en un espacio de nombres, se debe utilizar su nombre completo
al realizar esto.
Creación de una instancia
]]>
En el contexto de una clase, es posible crear un nuevo objeto con
new self y new parent.
Cuando se asigna una instancia ya creada de una clase a una nueva variable, ésta última
accederá a la misma instancia que el objeto que le fue asignado. Esta
conducta es la misma que cuando se pasan instancias a una función. Se puede
realizar una copia de un objeto ya creado a través de la
clonación del mismo.
Asignación de objetos
var = '$asignada tendrá este valor';
$instancia = null; // $instancia y $referencia son null
var_dump($instancia);
var_dump($referencia);
var_dump($asignada);
?>
]]>
&example.outputs;
string(27) "$asignada tendrá este valor"
}
]]>
PHP 5.3.0 introdujo un par de formas nuevas para crear instancias de un
objeto:
Creación de nuevos objetos
]]>
&example.outputs;
Properties and methods
Las propiedades y métodos de una clase viven en «espacios de nombres» diferentes, por tanto, es
posible tener una propiedad y un método con el mismo nombre. Al hacer referencia tanto
a una propideada como a un método se utiliza la misma notación, y si se accederá a la
propiedad o se llamará al método, solamente depende del contexto,
es decir, si el empleo es el acceso a una variable o la llamada a una función.
Acceso a propiedad contra llamada a método
bar, PHP_EOL, $obj->bar(), PHP_EOL;
]]>
&example.outputs;
Esto significa que llamar a una función
anónima que ha sido asignada a una propiedad no es posible
directamte. En su lugar, la propiedad ha de ser asignada primero a una variable, por
ejemplo.
Llamar a una función anónima almacenada en una propiedad
bar = function() {
return 42;
};
}
}
$obj = new Foo();
$func = $obj->bar;
echo $func(), PHP_EOL;
]]>
&example.outputs;
extends
Una clase puede heredar los métodos y propiedades de otra clase
empleando la palabra reservada extends en la declaración
de la clase. No es posible la extensión de múltiples clases; una clase
sólo puede heredar de una clase base.
Los métodos y propiedades heredados pueden ser sobrescritos
con la redeclaración de éstos utilizando el mismo nombre que en
la clase madre. Sin embargo, si la clase madre definió un método
como final, éste no
podrá ser sobrescrito. Es posible acceder a los métodos
sobrescritos o a las propiedades estáticas haciendo referencia a ellos
con parent::.
Cuando se sobrescriben métodos, la firma de los parámetros debería ser la misma o
PHP generará un error de nivel E_STRICT. Esto no se
aplica a los constructores, los cuales permiten la sobrescritura con diferentes
parámetros.
Herencia de clases sencilla
mostrarVar();
?>
]]>
&example.outputs;
::class
Desde PHP 5.5, también se emplea la palabra reservada class para la resolución
de nombres de clases. Se puede obtener un string con el nombre completamente cualificado
de la clase NombreClase utilizando
NombreClase::class. Esto es particularmete útil con
clases en espacios de nombres.
Resolución de nombres de clases
]]>
&example.outputs;
La resolución de nombres de clases con ::class es una transformación
durante la compilación. Esto significa que, en el instante de crear el string del nombre
de la clase, aún no se ha realizado ninguna autocarga. Como consecuencia, los nombres de clases
se expanden incluso si la clase no existe. No se emite ningún error en tal
caso.