La definición básica de clases comienza con la palabra clave class, seguido por un nombre de clase, continuado por un par de llaves que encierran las definiciones de las propiedades y métodos pertenecientes a la clase.
El nombre de clase puede ser cualquier etiqueta válida 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 la cantidad de letras, números o guiones bajos que sea. Como una 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 (llamadas "métodos").
Ejemplo #1 Definición simple de una clase
<?php
class SimpleClass
{
// Declaración de la propiedad
public $var = 'a default value';
// Declaración del método
public function displayVar() {
echo $this->var;
}
}
?>
La pseudo-variable $this está disponible cuando un método es invocado dentro del contexto de un objeto. $this es una referencia del objeto que invoca (usualmente el objeto al que el método pertenece, pero posiblemente sea otro objeto, si el método es llamado estáticamente desde el contexto de un objeto secundario).
Ejemplo #2 Algunos ejemplo de la pseudo-variable $this
<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this está definida (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this no está definida.\n";
}
}
}
class B
{
function bar()
{
// Nota: la siguiente línea arrojará un Warning si E_STRICT está habilitada.
A::foo();
}
}
$a = new A();
$a->foo();
// Nota: la siguiente línea arrojará un Warning si E_STRICT está habilitada.
A::foo();
$b = new B();
$b->bar();
// Nota: la siguiente línea arrojará un Warning si E_STRICT está habilitada.
B::bar();
?>
El resultado del ejemplo sería:
$this está definida (A) $this no está definida. $this está definida (B) $this no está definida.
Para crear una instancia de una clase, la palabra clave new debe ser usada. Un objeto siempre se creará 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 un string que contiene el nombre de una clase se usa con new, una nueva instancia de esa clase será creada. Si la clase está en un espacio de nombres, su nombre completo debe ser usado cuando se hace esto.
Ejemplo #3 Creación de una instancia
<?php
$instance = new SimpleClass();
// Esto también se puede hacer con variables:
$className = 'Foo';
$instance = new $className(); // Foo()
?>
En el contexto de una clase, es posible crear un nuevo objeto con new self y new parent.
Cuando se asigna una instancia de una clase ya creada a una nueva variable, ésta última accederá a la misma instancia como al objeto que le fue asignado. Esta conducta es la misma cuando se pasan instancias a una función. Una copia de un objeto ya creado se puede lograr a través de la clonación de la misma.
Ejemplo #4 Asignación de objetos
<?php
$instance = new SimpleClass();
$assigned = $instance;
$reference =& $instance;
$instance->var = '$assigned tendrá este valor';
$instance = null; // $instance y $reference se transforman en null
var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>
El resultado del ejemplo sería:
NULL NULL object(SimpleClass)#1 (1) { ["var"]=> string(30) "$assigned tendrá este valor" }
PHP 5.3.0 introdujo un par de nuevas maneras para crear instancias de un objeto:
Ejemplo #5 Creando nuevos objetos
<?php
class Test
{
static public function getNew()
{
return new static;
}
}
class Child extends Test
{}
$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);
$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);
$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?>
El resultado del ejemplo sería:
bool(true) bool(true) bool(true)
Una clase puede heredar los métodos y propiedades de otra clase al utilizar la palabra clave extends en la declaración de la clase. No es posible extender 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 parent. Sin embargo, si la clase parent definió un método como final, éste no podrá ser sobrescrito. Es posible acceder a los métodos sobrescritos o propiedades estáticas referenciándolos con parent::.
Cuando se sobrescriben métodos, la cantidad y disposición de los parámetros
debería ser la misma o PHP generará un error a nivel de E_STRICT
.
Esto no se aplica a los constructores, que permiten la sobrescritura con diferentes
parámetros.
Ejemplo #6 Herencia simple de clases
<?php
class ExtendClass extends SimpleClass
{
// Redefinición del método parent
function displayVar()
{
echo "Clase extendida\n";
parent::displayVar();
}
}
$extended = new ExtendClass();
$extended->displayVar();
?>
El resultado del ejemplo sería:
Clase extendida un valor por defecto
Desde PHP 5.5, la palabra clave class también se usa para la resolución de nombres de clases. Se puede obtener un string con un nombre completamente cualificado de la clase NombreClase usando NombreClase::class. Esto es particularmete útil con clases con espacios de nombres.
Ejemplo #7 Resolución de nombres de clases
<?php
namespace NS {
class NombreClase {
}
echo NombreClase::class;
}
?>
El resultado del ejemplo sería:
NS\NombreClase