Programación Orientada a Objetos (POO) Introducción La programación orientada a objetos es una técnica de programación en la cual expresamos el código en términos relacionados a como vemos las cosas en la vida cotidiana. Esta técnica se basa en 3 conceptos: Objetos, Atributos y Métodos. Donde los objetos son vistos como un todo y dentro de ese todo van incluidos atributos (propiedades), que son las características de los objetos, estas son lo que hacen que un objeto sea único. Mientras que los métodos (funciones) son las actividades que realiza dicho objeto. Un ejemplo para explicar dichos conceptos sería pensar en un carro como un objeto, el carro tiene diferentes características como color, modelo, marca, transmisión entre muchas más. Estas características que comparten todos los carros y los hacen diferentes a una camioneta o una motocicleta son los atributos del carro. Las acciones que hacen los carros como lo son dar marcha, reversa, encender las luces entre otras se consideran los métodos del carro. La programación orientada a objetos se basa en 5 principios que son: Herencia: Reutilizar partes de código Polimorfismo: La facilidad de cambiar la forma de un objeto Abstracción: Generalizar un objeto para posteriormente darle múltiples aplicaciones. Encapsulamiento: Aislar partes de código. Sobrecarga: Reutilizar métodos de otros objetos. En este curso de programación web solo se estudiará la herencia, encapsulamiento y sobrecarga porque estos son más sencillos y a partir de ellos salen los otros dos conceptos (polimorfismo y abstracción).
Sintaxis Básica Lo principal en la programación orientada a objetos es la creación de las clases, dentro de las clases es donde se escriben las instrucciones, propiedades y métodos que tendrá el objeto. La manera correcta de crear una clase en php es utilizar la palabra reservada class y enseguida colocar el nombre de la clase, después se abren y cierran llaves, estas son las que indican el inicio y fin de la misma. Ahora pasamos a declaración de propiedades, para estas se ocupa de un modificador de acceso, más adelante se explicará, que por el momento siempre será la palabra reservada public, después se escribe el nombre de la variable recordando que todas las variables en php inician con el símbolo de pesos $. Por último se puede o no inicializar la propiedad. Para declarar un método en php se hace lo siguiente. Es muy parecido a como se declaran funciones en php, la diferencia es que en este caso se requiere de un modificador de acceso. Al igual que en las propiedades por ahora será public. Hay que recordar que lo anterior se debe hacer dentro de los tags de php como se muestra en el siguiente ejemplo. Dentro de las propiedades, existen algunas que no requieren que su valor cambie durante la ejecución estas propiedades son conocidas como constantes. Para definir una constante hay que considerar las siguientes indicaciones: Inician con la palabra reservada const Las constantes no inician con el símbolo $ El nombre de las constantes, por convención, se escribe con letras mayúsculas y guiones bajos como espacios. El valor de una constante no puede ser: expresión matemática, variable o una llamada a una función.
En la programación orientada a objetos existe una variable llamada this, ésta sirve para invocar un método o propiedad dentro del mismo objeto. Por ejemplo: La flecha (->) es utilizada para acceder a algún elemento del objeto al cual se está invocando, en el ejemplo anterior el objeto de referencia es $this. También existe otro operador llamado de Resolución de Ámbito que se representa con doble dos puntos (::). Este operador permite acceder a propiedades estáticas y constantes además de que permite sobreescribir propiedades y métodos de otras clases. Para hacer hacer referencia a los elementos desde adentro de una clase se utilizan las siguientes palabras claves: self, static, parent. Donde self y static sirven para hacer referencia a las variables estáticas y las constantes que puedan ver. Por su parte parent permite el acceso a los elementos (atributos y métodos) disponibles de la superclase.
Constructores Un constructor es un método que es utilizado para inicializar las propiedades de un objeto al momento de ser creado. Las ventajas principales del uso de un método constructor son la siguientes: Se ejecuta automáticamente cuando se crea el objeto. No puede ser invocado de manera manual. En php hay dos maneras diferentes de declarar un constructor. 1) Consiste en colocar al principio la palabra reservada function y después dos guiones bajos ( ) seguidos de la palabra construct, después, como en todo método los paréntesis que pueden o no tener argumentos y las llaves que contendrán el cuerpo del método. 2) Crear un método con exactamente el mismo nombre que la clase. Esto se hace escribiendo primero el modificador public, después la palabra reservada function y enseguida el mismo nombre de la clase. Los dos ejemplos anteriores se reflejan en la siguiente imagen:
Instancia La instancia es el mecanismo mediante el cual se pueden crear objetos a partir de las clases. Para crear el objeto se utiliza la palabra reservada new. Hay dos maneras de crear objetos, la primera invoca el constructor de la clase y la segunda se lleva a cabo con una variable tipo string. En la siguiente imagen se pueden ver los ejemplos de cómo crear instancias. Herencia La herencia es un principio de la programación orientada a objetos que permite reutilizar código entre clases. Con esto una clase, superclase, es capaz de compartir sus métodos y atributos a otra clase, subclase. Esta clase hija puede ver e incluso modificar los elementos proporcionados por su padre. Para poder hacer uso de la herencia se requiere de la palabra reservada extends, esta se escribe en la declaración de la subclase. En el siguiente ejemplo se muestra un ejemplo de la sintaxis correcta. Como se mencionó anteriormente en la sección de constructores, estos son el primer método que se ejecuta al crear un objeto, sin embargo, cuando se trata de la herencia aparece una situación muy especial. Hay que construir primero al padre antes que al hijo, por ejemplo un perro antes es un animal y después sus características lo hacen más particular y diferente al resto de los animales. Para solucionar esta problemática, lo que se hace es en la primera línea del constructor de la subclase, se invoca al constructor de la superclase. En código esto se representa así:
Como se ve en el ejemplo, la manera correcta de hacer referencia a algún elemento de la superclase (en este caso el constructor) es mediante la palabra parent seguido del operador de Resolución de Ámbito, doble dos puntos (::).
Encapsulamiento El encapsulamiento consiste en ocultar ciertas propiedades y métodos dentro de los objetos para que estos no puedan ser vistos ni modificados por otros elementos no deseados. En la POO hay distintos niveles de encapsulamiento que son: private: En este nivel las propiedades sólo pueden ser vistas por la misma clase que las contiene. protected: Aquí los atributos pueden ser vistos por la misma clase, por sus clases hijas y sus clases padres. public: con este nivel los elementos pueden ser vistos por cualquiera. En caso de que no se indique explícitamente, php toma asigna el nivel public. El siguiente es un ejemplo de la sintaxis para declarar propiedades y métodos en los 3 niveles de encapsulamiento. Un ejemplo más real del uso del encapsulamiento es la implementación de los métodos getters y setters, estos son los que permiten la manipulación de variables privadas desde afuera de su clase dueña. Los métodos setters son los que permiten asignar un valor a las variables privadas, su principal característica es que estos siempre van a necesitar un argumento que será el valor asignado a la variable.
Los nombres de estos métodos, por convención, son de la siguiente manera: setnombredevariable Los getters son los que muestran el valor de dichas variables. Su sintaxis es similar a los métodos setter en cuanto al nombre del método, la diferencia es que estos métodos regresan un valor y no necesitan argumentos como se puede ver a continuación.
Sobrecarga Es la capacidad de poder nombrar métodos iguales pero haciendo que tengan diferente funcionalidad. Para lograrlo todos los métodos deben tener una lista diferente de argumentos. Para ver las ventajas de esta propiedad, pensemos en que en alguna parte de un programa hay un método que realiza sumas. La dificultad se presenta porque en algunas ocasiones se tienen que sumar solo 2 números, pero en otras se requiere sumar hasta 4 números. Aquí es donde implementamos un método sobrecargado como se ve en la siguiente imagen.
Clonación de Objetos Un clon es una copia idéntica de un objeto original. Esto quiere decir que al momento de hacer un clon se transfieren las propiedades, métodos y datos que tenga el objeto original. Esta es la principal diferencia a la copia de objetos, ya que esta solo toma la dirección que tiene asignado el objeto original en la memoria mas no sus elementos. En php la clonación se hace por medio de la palabra reservada clone que ejecuta el método clone(). Este método puede ser sobreescrito para modificar algunas propiedades que tendría el objeto clonado o tambien puede negar la posibilidad de crear un clon de ese objeto con el método die();. En caso de no tener sobreescrito este método la copia será idéntica del original. Ejemplo: Resultado:
Se puede ver como el objeto original se clonó y también modifico el valor de la edad.