En PHP, una clase es la plantilla a partir de la cual se crean objetos. Con la palabra clave class defines la estructura (propiedades y métodos) y con new instancias un objeto concreto. Este artículo cubre todo lo que necesitas para empezar con OOP en PHP: propiedades tipadas, métodos, el constructor y los modificadores de visibilidad.
Declarar una clase básica
<?php
class Producto
{
public string $nombre;
public float $precio;
public int $stock;
public function __construct(string $nombre, float $precio, int $stock)
{
$this->nombre = $nombre;
$this->precio = $precio;
$this->stock = $stock;
}
public function descripcion(): string
{
return "{$this->nombre} {$this->precio} ({$this->stock} uds.)";
}
}
$prod = new Producto('Teclado mecánico', 89.99, 42);
echo $prod->descripcion();
// Teclado mecánico 89.99 (42 uds.)
?>
Visibilidad: public, protected y private
PHP tiene tres modificadores de acceso que controlan desde dónde se puede leer o modificar una propiedad o llamar a un método:
|
Modificador | Accesible desde... |
| Cualquier parte del código |
| La propia clase y sus subclases |
| Solo la clase donde se declara |
<?php
class CuentaBancaria
{
private float $saldo;
public function __construct(float $saldoInicial)
{
$this->saldo = $saldoInicial;
}
public function depositar(float $cantidad): void
{
if ($cantidad <= 0) {
throw new InvalidArgumentException('La cantidad debe ser positiva');
}
$this->saldo += $cantidad;
}
public function retirar(float $cantidad): void
{
if ($cantidad > $this->saldo) {
throw new RuntimeException('Saldo insuficiente');
}
$this->saldo -= $cantidad;
}
public function getSaldo(): float
{
return $this->saldo;
}
}
$cuenta = new CuentaBancaria(1000.0);
$cuenta->depositar(500.0);
$cuenta->retirar(200.0);
echo $cuenta->getSaldo(); // 1300.0
// $cuenta->saldo = 999999; // Fatal error: Cannot access private property
?>
Constructor promotion de PHP 8.0
Desde PHP 8.0, puedes declarar propiedades directamente en la firma del constructor, eliminando la repetición de código:
<?php
// Antes de PHP 8.0
class PuntoAntiguo
{
public float $x;
public float $y;
public function __construct(float $x, float $y)
{
$this->x = $x;
$this->y = $y;
}
}
// Con constructor promotion (PHP 8.0+)
class Punto
{
public function __construct(
public float $x,
public float $y,
) {}
public function distanciaAlOrigen(): float
{
return sqrt($this->x ** 2 + $this->y ** 2);
}
}
$p = new Punto(3.0, 4.0);
echo $p->x; // 3.0
echo $p->distanciaAlOrigen(); // 5.0
?>
Propiedades readonly de PHP 8.1
Las propiedades readonly solo se pueden asignar una vez, en el momento de la inicialización. Son ideales para objetos de valor inmutables:
<?php
class Coordenada
{
public function __construct(
public readonly float $latitud,
public readonly float $longitud,
) {}
}
$madrid = new Coordenada(40.4168, -3.7038);
echo $madrid->latitud; // 40.4168
// $madrid->latitud = 41.0; // Fatal error: Cannot modify readonly property
?>
Métodos y propiedades: convenciones y buenas prácticas
<?php
class Usuario
{
private string $nombre;
private string $email;
private DateTimeImmutable $creadoEn;
public function __construct(string $nombre, string $email)
{
$this->setNombre($nombre);
$this->setEmail($email);
$this->creadoEn = new DateTimeImmutable();
}
public function getNombre(): string { return $this->nombre; }
public function setNombre(string $nombre): void
{
if (trim($nombre) === '') {
throw new InvalidArgumentException('El nombre no puede estar vacío');
}
$this->nombre = trim($nombre);
}
public function getEmail(): string { return $this->email; }
public function setEmail(string $email): void
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException("Email inválido: $email");
}
$this->email = strtolower($email);
}
public function getCreadoEn(): DateTimeImmutable
{
return $this->creadoEn;
}
}
$user = new Usuario(' Ana García ', '[email protected]');
echo $user->getNombre(); // Ana García
echo $user->getEmail(); // [email protected]
?>
La documentación oficial sobre clases y objetos en PHP cubre todos los detalles de la sintaxis OOP, incluida la referencia completa de los modificadores de visibilidad y las propiedades tipadas.
