Clases en PHP: propiedades, métodos, constructor y visibilidad

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...

public

Cualquier parte del código

protected

La propia clase y sus subclases

private

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP