PHP Orientado A Objetos Con Clases y Objetos
PHP Orientado A Objetos Con Clases y Objetos
PHP Orientado A Objetos Con Clases y Objetos
En este artículo vamos a explorar los fundamentos de la programación orientada a objetos en PHP. Vamos a
comenzar con una introducción a las clases y los objetos, y discutiremos un par de conceptos avanzados como
la herencia y el polimorfismo en la segunda mitad de este artículo.
En la POO existe el concepto de "clase" ("class" en inglés), que se usa para modelar o asignar una entidad del
mundo real a una plantilla de datos (propiedades, o properties) y funcionalidad (métodos, o methods). Un
"objeto" ("object" en inglés) es una instancia de una clase, y puedes crear múltiples instancias de la misma
clase. Por ejemplo, existe una sola clase Person (Persona), pero muchos objetos de tipo persona pueden ser
instancias de esta clase —dan, zainab, hector, etc.
La clase define propiedades. Por ejemplo, para la clase Person podemos tener name (nombre), age (edad) y
phoneNumber (número telefónico). Entonces cada objeto de tipo persona tendrá sus propios valores para esas
propiedades.
También puedes definir métodos en la clase, que te permiten manipular los valores de las propiedades de los
objetos y llevar a cabo operaciones en ellos. Como ejemplo, puedes definir un método save (guardar) que
almacene la información del objeto en una base de datos.
La mejor manera de comprender conceptos nuevos es a través de un ejemplo. Así que echemos un vistazo a la
clase Employee (Empleado) en el siguiente fragmento de código, que representa a la entidad del empleado.
<?php
class Employee{
private $first_name;
private $last_name;
private $age;
$this->age = $age;
}
public function getFirstName(){
return $this->first_name;
}
La instrucción class Employee en la primera línea define a la clase Employee. A continuación declaramos las
propiedades, el constructor y los otros métodos de la clase.
Puedes imaginar a las propiedades de la clase como variables que se usan para almacenar información acerca
del objeto. En el ejemplo anterior, hemos definido tres propiedades —first_name, last_name y age (nombre,
apellido y edad). En la mayoría de los casos, se accede a las propiedades de las clases a través de objetos
instanciados.
Estas propiedades son de tipo private (privado), lo que significa que solamente puede accederse a ellas desde
el interior de la clase. Este es el nivel de acceso más seguro para las propiedades. Vamos a discutir los
diferentes niveles de acceso para las propiedades y métodos de una clase posteriormente en este artículo.
Un constructor es un método de clase especial que se ejecuta automáticamente al instanciar un objeto. Veremos
cómo instanciar objetos en el siguiente par de secciones, pero por ahora solamente tienes que saber que un
constructor se usa para inicializar propiedades de objetos cuando el objeto está siendo creado.
Podemos ver a los métodos de las clases como funciones que llevan a cabo acciones específicas asociadas a los
objetos. En la mayoría de los casos se usan para acceder y manipular las propiedades de los objetos, así como
llevar a cabo operaciones relacionadas.
En el ejemplo anterior hemos definido el método getLastName, que devuelve el apellido asociado al objeto.
Así que esta ha sido una breve introducción a la estructura de las clases en PHP. En la siguiente sección
veremos cómo instanciar objetos de la clase Employee.
Encabezado: PHP Object 3
En el contexto de la clase Employee que acabamos de crear en la sección anterior, veamos cómo instanciar un
objeto de esa clase.
<?php
$objEmployee = new Employee('Bob', 'Smith', 30);
echo $objEmployee->getFirstName(); // print 'Bob'
echo $objEmployee->getLastName(); // prints 'Smith'
echo $objEmployee->getAge(); // prints '30'
?>
Necesitas usar la palabra clave new cuando quieres instanciar un objeto de cualquier clase junto con su nombre
de clase, y obtendrás una nueva instancia de un objeto de dicha clase.
Si una clase ha definido el método __construct y este requiere argumentos, necesitas enviar esos argumentos
cuando creas una instancia de un objeto. En nuestro caso, el constructor de la clase Employee requiere tres
argumentos, y por lo tanto los hemos enviado cuando creamos el objeto $objEmployee. Como discutimos
anteriormente, el método __construct se ejecuta automáticamente cuando el objeto es instanciado.
A continuación hemos invocado a métodos de la clase en el objeto $objEmployee para imprimir la información
que fue inicializada durante la creación del objeto. Desde luego, puedes crear múltiples objetos de la misma
clase, como se muestra en el siguiente fragmento de código.
<?php
$objEmployeeOne = new Employee('Bob', 'Smith', 30);
echo $objEmployeeOne->getFirstName(); // prints 'Bob'
echo $objEmployeeOne->getLastName(); // prints 'Smith'
echo $objEmployeeOne->getAge(); // prints '30'
$objEmployeeTwo = new Employee('John', 'Smith', 34);
echo $objEmployeeTwo->getFirstName(); // prints 'John'
echo $objEmployeeTwo->getLastName(); // prints 'Smith'
echo $objEmployeeTwo->getAge(); // prints '34'
?>
La siguiente imagen es una representación gráfica de la clase Employee y algunas de sus instancias.
Encabezado: PHP Object 4
En pocas palabras, una clase es un modelo que puedes usar para crear objetos estructurados.
Encapsulación
En la sección anterior discutimos cómo instanciar objetos de la clase Employee. Es interesante notar que el
objeto $objEmployee en sí mismo envuelve propiedades y métodos de la clase. En otras palabras, este oculta
esos detalles del resto del programa. En el mundo de la POO, esto se conoce como encapsulación de datos.
La encapsulación es un aspecto importante de la POO que te permite restringir el acceso a ciertas propiedades o
métodos del objeto. Y eso nos lleva a otro tema de discusión: los niveles de acceso.
Niveles de acceso
Cuando defines una propiedad o un método en una clase, puedes declararlo para que tenga uno de estos tres
niveles de acceso —public, private o protected (público, privado o protegido).
Acceso público
Cuando declaras una propiedad o un método como public (público), este puede ser accedido desde cualquier
lugar del exterior de la clase. El valor de una propiedad pública puede ser modificado desde cualquier lugar en
tu código.
<?php
class Person{
public $name;
public function getName(){
return $this->name;
}
}
$person = new Person();
$person->name = 'Bob Smith';
echo $person->getName(); // prints 'Bob Smith'
?>
Encabezado: PHP Object 5
Como puedes ver en el ejemplo anterior, hemos declarado la propiedad name para que sea pública. Por lo tanto,
puedes establecer su valor desde cualquier lugar del exterior de la clase, como lo hemos hecho aquí.
Acceso privado
Cuando declaras una propiedad o un método como private (privado), solamente puede accederse a él desde el
interior de la clase. Esto significa que necesitas definir métodos get y set para recuperar y establecer el valor de
esa propiedad.
<?php
class Person{
private $name;
Si intentas acceder a una propiedad privada desde el exterior de la clase, esta mostrará el error fatal Cannot
access private property Person::$name (No se puede acceder a la propiedad privada Person::$name). Por
lo tanto, necesitas establecer el valor de la propiedad privada usando el método set, como lo hicimos usando el
método setName.
Existen buenas razones por las que quizá quieras establecer una propiedad como privada. Por ejemplo, tal vez
alguna acción deba llevarse a cabo (actualizar una base de datos, por ejemplo, o volver a mostrar una plantilla)
si esa propiedad cambia. En ese caso puedes definir un método set y gestionar cualquier lógica especial cuando
la propiedad haya cambiado.
Acceso protegido
Finalmente, cuando declaras una propiedad o un método como protected (protegido), es posible acceder a él
desde la misma clase que lo haya definido y desde las clases que hereden la clase en cuestión. Vamos a discutir
la herencia en la siguiente sección, así que regresaremos al nivel de acceso protegido un poco más adelante.
Herencia
La herencia es un aspecto importante del paradigma de la programación orientada a objetos, que te permite
heredar propiedades y métodos de otras clases extendiéndolas. La clase que está siendo heredada se conoce
como clase padre, y la clase que hereda se conoce como clase hija. Cuando creas una instancia de un objeto de
la clase hija, esta hereda las propiedades y métodos de la clase padre también.
Encabezado: PHP Object 6
En el ejemplo anterior, la clase Person es la clase padre, y la clase Employee extiende o hereda de la clase
Person, por lo que se conoce como clase hija.
Intentamos revisar un ejemplo del mundo real para comprender cómo funciona.
<?php
class Person{
protected $name;
protected $age;
Lo importante a destacar aquí es que la clase Employee ha usado la palabra clave extends para heredar de la
clase Person. Ahora bien, la clase Employee puede acceder a todas las propiedades y métodos de la clase
Person que estén declarados como públicos o protegidos (no puede acceder a miembros declarados como
privados).
En el ejemplo anterior, el objeto $employee puede acceder a los métodos getName y setName que están
definidos en la clase Person, ya que están declarados como públicos.
Por otro lado, puedes usar el objeto $employee para establecer la propiedad age de la clase Person, como lo
hicimos en el método setAge que está definido en la clase Employee, ya que la propiedad age está declarada
como protegida.
Así que esta fue una breve introducción a la herencia. Te ayuda a reducir la duplicación de código, y por lo
tanto fomenta la reutilización del código.
Polimorfismo
Encabezado: PHP Object 8
El polimorfismo es otro concepto importante en el mundo de la programación orientada a objetos, que se refiere
a la habilidad para procesar objetos de manera diferente en base a sus tipos de datos.
Por ejemplo, en el contexto de la herencia, si la clase hija quiere cambiar el comportamiento del método de la
clase padre, entonces puede sobrescribir ese método. Esto se conoce como sobreescritura de métodos. Echemos
un vistazo rápido a un ejemplo de la vida real para comprender el concepto de la sobreescritura de métodos.
<?php
class Message{
public function formatMessage($message){
return printf("<i>%s</i>", $message);
}
}
Como puedes ver, hemos cambiado el comportamiento del método formatMessage sobreescribiéndolo en la
clase BoldMessage. Lo importante es que un mensaje recibe un formato diferente en base al tipo de objeto, ya
sea que se trate de una instancia de la clase padre o de la clase hija.
(Algunos lenguajes orientados a objetos también tienen un tipo de sobrecarga de métodos que te permite definir
múltiples métodos de clase con el mismo nombre, pero con un número diferente de argumentos. Esto no es
compatible directamente en PHP, pero existen un par de soluciones para lograr una funcionalidad similar).
Conclusión
La programación orientada a objetos es un tema amplio, y apenas hemos tocado la superficie de su complejidad.
Espero que este tutorial te haya ayudado a comenzar con los fundamentos de la POO y que te motive a
continuar y aprender más temas avanzados sobre ella.