Lo básico class 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 <varname>$this</varname> 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.