Menu

Clases y objetos en PHP: propiedades, métodos y $this

Una clase de PHP es un plano que se declara con class Name { }, y new Name() crea un objeto a partir de ella. Aprende las propiedades, los métodos, $this, public/private/protected, las propiedades tipadas y readonly, __toString y por qué asignar un objeto no lo copia.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Una clase de PHP se declara con class Name { ... } y contiene propiedades (variables) y métodos (funciones). new Name() crea un objeto a partir de ella, y -> lee una propiedad o llama a un método: $user->name, $user->greet().

La clase es el plano y el objeto es una cosa construida a partir de él. Puedes crear tantos objetos de una clase como necesites, y cada uno tiene sus propios valores en las propiedades.

Propiedades y métodos

Una propiedad se declara con una palabra clave de visibilidad, un tipo opcional y un valor por defecto opcional. Un método es una función dentro de la clase. Dentro de un método, $this es el objeto sobre el que se llamó el método, así que $this->balance lee el saldo de ese objeto.

Cada objeto conserva su propio $balance: ingresar en $a no toca $b. Asignar las propiedades una a una después de new acaba siendo pesado; un constructor recibe en su lugar los valores iniciales como argumentos.

public, private y protected

La visibilidad controla quién puede tocar una propiedad o llamar a un método:

Palabra claveAccesible desde
publiccualquier sitio
protectedla propia clase y las clases que la extienden
privatesolo la clase que la declara

Hacer una propiedad private y exponer métodos es como una clase protege sus propias reglas. Aquí el saldo solo puede cambiar mediante deposit() y withdraw(), que rechazan las cantidades incorrectas:

Leer la propiedad privada desde fuera de la clase no es un warning, es un Error:

Propiedades tipadas y valores sin inicializar

Una propiedad tipada sin valor por defecto empieza sin inicializar, que es distinto de null. Leerla antes de asignarle algo lanza un Error. Dale un valor por defecto, asígnala en el constructor o hazla nullable con ?Type y = null.

Los tipos se aplican al asignar. En el modo por defecto (no estricto), $p->stock = '7' convierte la cadena numérica en 7, mientras que $p->stock = 'many' lanza un TypeError.

Propiedades readonly

Una propiedad readonly (PHP 8.1) se puede escribir una vez, desde dentro de la clase, y nunca más. Es la forma habitual de construir objetos de valor como cantidades de dinero o IDs. PHP 8.2 añadió readonly class, que hace readonly todas las propiedades.

Una propiedad readonly debe tener un tipo y no puede tener valor por defecto. Si necesitas una copia cambiada, crea un objeto nuevo (new Order('B-2002')) en lugar de editar el antiguo.

Imprimir un objeto con __toString

echo $object solo funciona cuando la clase define __toString(). El método devuelve la cadena que PHP debe usar siempre que el objeto se trate como texto: en echo, en una concatenación, en "{$object}".

Sin __toString, echo $object lanza un Error ("Object of class Money could not be converted to string"). Para depurar, print_r() y var_dump() funcionan con cualquier objeto y también muestran las propiedades privadas; consulta var_dump y print_r.

Asignar un objeto no lo copia

Este es el error que pilla a la mayoría de quienes vienen de los arrays. Asignar un array lo copia. Asignar un objeto copia solo el manejador: las dos variables apuntan entonces al mismo objeto.

clone hace una copia superficial: si una propiedad contiene otro objeto, las dos copias siguen compartiendo ese objeto interior. === solo es verdadero para el mismo objeto, mientras que == compara los valores de las propiedades de dos objetos de la misma clase. Pasar un objeto a una función funciona igual que la asignación, así que una función puede cambiar el objeto que recibe.

Preguntas frecuentes

¿Cómo creo un objeto a partir de una clase en PHP?

Usa new con el nombre de la clase: $user = new User();. Si la clase tiene constructor, pasa sus argumentos entre los paréntesis, como en new User('Ada'). Después llamas a los métodos y lees las propiedades con el operador flecha: $user->name, $user->greet().

¿Qué significa $this en PHP?

$this es el objeto sobre el que se llamó el método actual. Dentro de $ada->greet(), $this es $ada, así que $this->name lee el nombre de Ada. Solo existe dentro de los métodos no estáticos.

¿Cuál es la diferencia entre public, private y protected en PHP?

Los miembros public se pueden usar desde cualquier sitio, los private solo desde dentro de la clase que los declara, y los protected desde esa clase y sus clases hijas. Leer una propiedad privada desde fuera lanza un Error: Cannot access private property.

¿Los objetos se pasan por referencia en PHP?

Una variable guarda un manejador del objeto, no el objeto en sí. $b = $a; copia el manejador, así que las dos variables apuntan al mismo objeto y un cambio hecho a través de $b se ve en $a. Usa $b = clone $a; para obtener una copia independiente.

¿Qué es una propiedad readonly en PHP?

Una propiedad declarada public readonly string $id; (PHP 8.1+) se puede asignar una vez, desde dentro de la clase, y nunca cambiar después. Escribir en ella una segunda vez lanza un Error: Cannot modify readonly property.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR