Comprensión de la Programación Orientada a Objetos (OOP) en PHP
Aprende los fundamentos de la OOP en PHP: clases, objetos, encapsulación, herencia y polimorfismo con ejemplos prácticos.
La Programación Orientada a Objetos (OOP) es un paradigma de programación construido alrededor del concepto de "objetos", que agrupan datos (propiedades) y comportamiento (métodos) que opera sobre esos datos. En lugar de dispersar variables y funciones relacionadas por todo el script, la OOP te permite agruparlas en unidades autocontenidas que modelan las cosas que maneja tu aplicación — un User, un Order, un Product.
Este capítulo cubre los dos fundamentos de la OOP en PHP — clases y objetos — y luego repasa las tres ideas que usarás con ellos todos los días: encapsulación, herencia y polimorfismo. Al final podrás leer y escribir clases PHP con confianza y sabrás qué característica resuelve cada problema.
¿Qué son las Clases y los Objetos en la OOP de PHP?
Una clase es un plano. Describe qué datos contiene un objeto y qué puede hacer, pero no es una cosa en sí misma — igual que un plano arquitectónico no es una casa. Un objeto es una instancia concreta construida a partir de ese plano, creada con la palabra clave new. Puedes crear muchos objetos a partir de una sola clase, cada uno con sus propios datos.
| Término | Qué es | Ejemplo |
|---|---|---|
| Clase | El plano (definición) | class User { ... } |
| Objeto | Una instancia activa de una clase | $alice = new User(...) |
| Propiedad | Una variable que pertenece a un objeto | $this->email |
| Método | Una función que pertenece a una clase | getEmail() |
Una forma útil de recordarlo: la clase es el cortador de galletas, los objetos son las galletas. Las clases y los objetos son los bloques de construcción de la OOP en PHP.
Definición de Clases en PHP
Las clases en PHP se definen usando la palabra clave class, seguida del nombre de la clase. Las propiedades y métodos de una clase se definen dentro de la definición de la clase, entre llaves ({}). Aquí hay un ejemplo de definición de clase en PHP:
Ejemplo de definición de clase en PHP
class User {
public $username;
public $email;
public function __construct($username, $email) {
$this->username = $username;
$this->email = $email;
}
public function getUsername() {
return $this->username;
}
public function getEmail() {
return $this->email;
}
}En este ejemplo, la clase User tiene dos propiedades, $username y $email, y dos métodos, getUsername() y getEmail(). El método __construct es un método constructor especial en PHP: se ejecuta automáticamente en el momento en que se crea un objeto, lo que lo convierte en el lugar natural para configurar el estado inicial de un objeto. Dentro de cualquier método, $this hace referencia al objeto actual, por lo que $this->username significa "la propiedad username de este objeto". Para aprender más sobre los constructores y el método de limpieza correspondiente, consulta PHP Constructor y PHP Destructor.
Creación de Objetos a partir de Clases
Para crear un objeto a partir de una clase, usa la palabra clave new, seguida del nombre de la clase. Aquí hay un ejemplo de cómo crear un objeto a partir de la clase User:
PHP crea un objeto a partir de una clase usando la palabra clave new
$user = new User("John Doe", "[email protected]");Esto crea un nuevo objeto User y lo almacena en la variable $user. Puedes acceder a las propiedades y métodos del objeto usando el operador flecha (->). Aquí hay un ejemplo de cómo acceder a las propiedades y métodos del objeto $user:
PHP accede a las propiedades y métodos del objeto usando el operador flecha
echo $user->username; // Outputs: "John Doe"
echo $user->email; // Outputs: "[email protected]"
echo $user->getUsername(); // Outputs: "John Doe"
echo $user->getEmail(); // Outputs: "[email protected]"Encapsulación: Control del Acceso a los Datos
En los ejemplos anteriores, cada propiedad se declara public, lo que significa que cualquier código puede leerla o modificarla directamente ($user->email = "..."). Eso es conveniente pero arriesgado — permite que el resto del programa ponga un objeto en un estado inválido. La encapsulación es la práctica de ocultar los detalles internos de un objeto y exponer en su lugar una interfaz controlada.
PHP proporciona tres modificadores de visibilidad para propiedades y métodos:
| Modificador | Accesible desde | Úsalo cuando |
|---|---|---|
public | En cualquier lugar | El miembro forma parte de la interfaz oficial del objeto. |
protected | La clase y sus subclases | Las subclases lo necesitan, pero el código externo no debería acceder. |
private | Solo la misma clase | El miembro es un detalle interno. |
Al hacer una propiedad private y exponer métodos para leerla o modificarla, mantienes la validación en un solo lugar:
<?php
class BankAccount
{
private $balance = 0;
public function deposit($amount)
{
if ($amount <= 0) {
throw new InvalidArgumentException("Deposit must be positive.");
}
$this->balance += $amount;
}
public function getBalance()
{
return $this->balance;
}
}
$account = new BankAccount();
$account->deposit(100);
$account->deposit(50);
echo $account->getBalance(); // Outputs: 150Dado que $balance es private, ningún código externo puede establecerlo en un número negativo directamente — cada cambio debe pasar por deposit(), donde vive la regla. Para una visión más profunda de las tres palabras clave, consulta PHP Access Modifiers.
Herencia en la OOP de PHP
La herencia es una característica de la OOP que permite a las clases heredar propiedades y métodos de clases padre. Esto permite a los desarrolladores crear nuevas clases basadas en clases existentes, sin tener que escribir todo el código de nuevo. En PHP, la herencia se define usando la palabra clave extends. Aquí hay un ejemplo de herencia en PHP:
Ejemplo de herencia en PHP como característica de la OOP que permite a las clases
class Admin extends User {
public $permissions;
public function __construct($username, $email, $permissions) {
parent::__construct($username, $email);
$this->permissions = $permissions;
}
public function getPermissions() {
return $this->permissions;
}
}En este ejemplo, la clase Admin extiende la clase User y hereda sus propiedades y métodos. La clase Admin también tiene su propia propiedad, $permissions, y método, getPermissions(). La palabra clave parent:: se usa para llamar al método __construct de la clase padre, lo que permite a la clase Admin reutilizar la lógica de la clase User en lugar de duplicarla. Una clase solo puede extender un padre en PHP. Para ver el panorama completo, consulta PHP Inheritance.
Polimorfismo en la OOP de PHP
El polimorfismo es una característica de la OOP que permite tratar objetos de diferentes clases como objetos de la misma clase. Esto permite a los desarrolladores escribir código genérico que puede trabajar con objetos de diferentes clases, siempre que tengan los mismos métodos. En PHP, el polimorfismo se logra definiendo métodos comunes en las clases padre e implementándolos en las clases hijo. Aquí hay un ejemplo de polimorfismo en PHP:
Ejemplo de polimorfismo en PHP
<?php
class User
{
public $username;
public $email;
public function __construct($username, $email)
{
$this->username = $username;
$this->email = $email;
}
public function getUsername()
{
return $this->username;
}
public function getEmail()
{
return $this->email;
}
public function showInfo()
{
echo "Username: " . $this->username . "\n";
echo "Email: " . $this->email . "\n";
}
}
class Admin extends User
{
public $permissions;
public function __construct($username, $email, $permissions)
{
parent::__construct($username, $email);
$this->permissions = $permissions;
}
public function getPermissions()
{
return $this->permissions;
}
public function showInfo()
{
parent::showInfo();
echo "Permissions: " . $this->permissions . "\n";
}
}
$user = new User("John Doe", "[email protected]");
$admin = new Admin("Jane Doe", "[email protected]", ["read", "write", "delete"]);
$users = [$user, $admin];
foreach ($users as $user) {
$user->showInfo();
}En este ejemplo, tanto la clase User como la clase Admin tienen un método showInfo(). Cuando se llama al método showInfo() sobre un objeto, se llama a la implementación correcta del método según el tipo de objeto. Esto permite que el bucle foreach trate los objetos $user y $admin como objetos del mismo tipo, aunque sean instancias de clases diferentes.
Conclusión
La Programación Orientada a Objetos (OOP) es un paradigma poderoso ampliamente utilizado en PHP para construir aplicaciones web escalables y mantenibles. Las clases y los objetos son los bloques de construcción; la encapsulación, la herencia y el polimorfismo son las características que te permiten escribir código eficiente y reutilizable. Domina estos conceptos y el resto del modelo de objetos de PHP encajará solo.
Dónde ir a continuación:
- PHP Constructor — inicializa objetos correctamente.
- PHP Access Modifiers —
public,protectedyprivateen profundidad. - PHP Inheritance — extiende y sobreescribe clases.
- PHP Abstract Classes — define planos parciales que las subclases deben completar.
- PHP Interfaces — impone un contrato compartido entre clases no relacionadas.
- PHP Static Methods — métodos que pertenecen a la clase en lugar de a una instancia.