Programación Orientada a Objetos (IV)

En este artículo vamos a seguir profundizando en la programación orientada a objetos, conociendo un aspecto fundamental.

Hablaremos de propiedades y métodos de clase. Son elementos que pertenecen a una clase y que tienen el mismo valor (en el caso de las propiedades) o el mismo comportamiento (en el caso de los métodos), para todos los objetos de la clase.

Puede parecer banal, pero nos ayuda enormemente a tener un código limpio, organizado y mantenible. Cuando trabajes con clases complejas en proyectos de gran envergadura, te será de gran utilidad.

PROPIEDADES DE CLASE

Vamos a aprender que si declaramos una propiedad con la palabra reservada static su valor es el mismo para todos los objetos de la clase. Por ejemplo. Sabemos que la mayoría de los televisores (por no decir todos) que se venden en un centro comercial o tienda de electrónica son de color negro. Es una tendencia en la que parecen haberse puesto de acuerdo todos los fabricantes. Por lo tanto, si yo compro dos televisores (por ejemplo, uno para el salón y otro para el dormitorio) podrán diferir en el tamaño, o el tipo de pantalla, pero seguro que los dos tendrán la carcasa negra. Por lo tanto, no es necesario que cada objeto televisor tenga una propiedad específica para el color de la carcasa. Puedo crear esa propiedad como inherente a la clase (en lugar de inherente a cada objeto individual), y me valdrá para todos los televisores que compre.

Sin embargo, las modas cambian. Es posible que mañana, o el año que viene, a los fabricantes les dé por hacer sus carcasas azules. Entonces me encontraré conque todos los objetos de tipo televisor tendrán la carcasa azul.

Vamos a ver como implementamos esto en nuestra clase CrearTelevisorClass.php:

Observa la línea 13. En ella declaramos la propiedad $color como static, y le dejamos un valor preasignado.

En el constructor (líneas de la 22 a la 26) vemos que asignamos las variables que son de instancia, es decir, aquellas que tendrán un valor para cada uno de los objetos de la clase. La variable que es de clase, es decir, que tendrá el mismo valor para todos y cada uno de los objetos, no se asigna en el constructor (puedes hacerlo, si lo deseas; el lenguaje te lo permite, pero ni es necesario, ni es buena práctica de programación).

En los métodos setter y getter relativos a la variable de clase (líneas de la 29 a la 36 y de la 47 a la 52) vemos que la forma de referenciarla cambia. En lugar de referirnos a ella como una propiedad de un objeto, con la notación $objeto->propiedad, nos referimos como una propiedad de clase, con la notación Clase::$propiedad. De otra forma no funcionaría.

Ahora veamos el archivo index.php. En este ejemplo vamos a crear dos objetos de la clase, en lugar de uno.

Lo que vemos en la pantalla del navegador es lo siguiente:

object(CrearTelevisorClass)#1 (2) {
  ["pulgadas":"CrearTelevisorClass":private]=>
  string(2) "60"
  ["pantalla":"CrearTelevisorClass":private]=>
  string(4) "OLED"
}
object(CrearTelevisorClass)#2 (2) {
  ["pulgadas":"CrearTelevisorClass":private]=>
  string(2) "42"
  ["pantalla":"CrearTelevisorClass":private]=>
  string(3) "LCD"
}
Mi tele del salón es de color negro.
Mi tele del dormitorio es de color negro.
Mi tele del salón ahora es de color azul.
Mi tele del dormitorio ahora es, también, de color azul.

Observa que los dos objetos tienen sólo dos propiedades (las que son inherentes a cada uno de ellos). Fíjate, también, en que los dos objetos tienen la propiedad de clase $color con el mismo valor y, cuando la modificamos usando el método setter de uno de los objetos se modifica en los dos. Leyendo los comentarios del código no tienes por qué tener mayor problema para entender como funciona esto.

MÉTODOS DE CLASE

El ejemplo anterior cumple su cometido de enseñarnos cómo funcionan las propiedades de clase. Sin embargo, hay algo que no acaba de oler bien del todo. Me estoy refiriendo al hecho de que para modificar o recuperar el valor de una propiedad de clase estamos usando, en index.php, métodos de instancia (el getter y el setter que afectan a la propiedad $color, en las líneas de la 26 a la 30). No tiene sentido que, para trabajar exclusivamente con propiedades de clase usemos métodos de instancia. De hecho, no sólo no tiene sentido, sino que, desde el punto de vista de las buenas prácticas de programación, es una atrocidad.

Afortunadamente, los métodos también pueden ser creados como de clase, usando, también aquí, la palabra reservada static. Observa esta versión de CrearTelevisorClass.php:

Observa, en las líneas resaltadas, como declaramos los métodos que actúan sobre variables de clase. Ahora mira el index.php, para ver cómo utilizamos métodos estáticos.

Presta especial atención a las líneas resaltadas (de la 26 a la 30). El resultado en la pantalla del navegador es el mismo que en el caso anterior. Sin embargo, ahora el código es más claro, limpio e intuitivo y, desde luego, tiene mucho más sentido. Al igual que en el caso de las propiedades de clase, la notación también cambia, referenciando la clase, en lugar de un objeto específico.

CONCLUYENDO

En este artículo hemos aprendido cuando se deben usar variables de clase o de instancia, y como emplear las propiedades de instancia mediante métodos de instancia, y las propiedades de clase mediante métodos de clase. Como siempre, tienes los códigos de este ejemplo para descargar en este enlace. En el próximo artículo hablaremos de sobrescritura y sobrecarga de métodos. Es un tema que quería haber desarrollado aquí pero, me parece, por ahora ya te he calentado bastante la cabeza. Nos vemos en el próximo artículo de esta serie.

   

Deja un comentario