Inicio > Cursos > PHP > Clases y Objetos
PHPPOO y PHP ModernoLección 9 de 15

Clases y Objetos

PHP tiene POO completa desde la versión 5, pero PHP 7 y 8 la modernizaron enormemente. Las clases se definen con class, los objetos con new, y el acceso a propiedades y métodos usa -> (en lugar del . de Java o C#). Los modificadores de acceso (public, protected, private) funcionan igual que en Java.

PHP 8 introdujo Constructor Property Promotion: en lugar de declarar las propiedades y luego asignarlas en el constructor, pones el modificador directamente en el parámetro del constructor.

PHP 8.1 introdujo readonly properties: propiedades que solo se pueden asignar una vez (en el constructor) y luego son inmutables. PHP 8.2 añadió readonly classes: todas las propiedades de la clase son readonly automáticamente. Los tipos en las propiedades hacen el código más seguro: private string $nombre garantiza que nombre siempre será un string.

Las interfaces y traits son fundamentales en PHP moderno: los traits permiten reutilizar código entre clases sin herencia, resolviendo la limitación de la herencia simple.

<?php
// Clase tradicional
class PersonaTradicional {
    public string $nombre;
    protected int $edad;
    private string $email;
    
    public function __construct(string $nombre, int $edad, string $email) {
        $this->nombre = $nombre;
        $this->edad = $edad;
        $this->email = $email;
    }
}

// Constructor property promotion (PHP 8) - equivalente pero más corto
class Persona {
    public function __construct(
        public readonly string $nombre,
        protected int $edad,
        private string $email
    ) {}
    
    public function esMayor(): bool {
        return $this->edad >= 18;
    }
    
    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");
        }
        $this->email = $email;
    }
    
    public function __toString(): string {
        return "Persona({$this->nombre}, {$this->edad})";
    }
}

$p = new Persona("Ana", 25, "ana@mail.com");
echo $p->nombre;          // Ana
echo $p->getEmail();       // ana@mail.com
echo $p;                   // Persona(Ana, 25)
echo $p->esMayor();        // 1 (true)

// Métodos estáticos
class Calculadora {
    public static function sumar(float $a, float $b): float {
        return $a + $b;
    }
    public static function PI(): float { return M_PI; }
}
echo Calculadora::sumar(3, 4); // 7
Consejo🚀 Constructor property promotion (PHP 8) reduce el código a un tercio. En lugar de declarar, inyectar en constructor y asignar, lo haces todo en la firma del constructor.
← array_map, array_filter y array_reduceHerencia, Interfaces y Traits →

Practica esta lección

Resuelve los ejercicios del curso de PHP en la app, gratis y con corrección automática.

Empezar a practicar