Spanish (Español) translation by Ana Paulina Figueroa (you can also view the original English article)
A medida que continuamos nuestra discusión sobre la programación orientada a objetos dentro del contexto de WordPress, es hora de que comencemos a hablar sobre las características reales de la programación orientada a objetos.
Si bien ya hemos cubierto las clases, necesitábamos explorar algunas construcciones fundamentales de la programación antes de volver a algunos de los conceptos esenciales del enfoque orientado a objetos.
En este artículo vamos a comenzar a hablar sobre las funciones y los atributos: dos aspectos fundamentales de la programación orientada a objetos. Pero primero, asegúrate de estar al día con los artículos anteriores:
- Una introducción
- Clases
- Tipos
- Estructuras de control: sentencias condicionales
- Estructuras de control: bucles
Uno de los puntos que me gustaría reiterar sobre esta serie es que estamos trabajando para examinar la programación orientada a objetos dentro del contexto de WordPress comenzando por los aspectos absolutamente fundamentales de la programación.
Estamos haciendo esto para asegurarnos de que aquellos que sean principiantes en la programación tengan todo lo que necesitan, no solo para comenzar a programar, sino también para aprender el paradigma y eventualmente para trabajar en la construcción de un complemento de WordPress.
Dicho eso, reanudemos nuestra discusión hablando sobre las funciones y los atributos.
Funciones
Refiriéndome a aquellos que están familiarizados con la programación por procedimientos, sin duda estás familiarizado con las funciones: después de todo, así es como haces tu trabajo, ¿cierto?
Pero para aquellos que apenas están adentrándose en la programación, hay dos aspectos que debes entender acerca de las funciones:
- Existen tanto en la programación por procedimientos, en la programación con funciones y en la programación orientada a objetos.
- Pueden ser vistas como una manera de vincular todas las construcciones anteriores para completar una unidad de trabajo más compleja.
En cuanto al segundo punto, es cierto que mucho de lo que discutimos anteriormente, es decir, las variables, sentencias condicionales, bucles, etcétera, son responsables de completar un trabajo unitario también; sin embargo, todos estos trabajan en conjunto para lograr algo ligeramente más grande que ellos mismos.
Dependiendo del lenguaje, también es probable que escuches que se denominan métodos o rutinas. Independientemente de la terminología usada, el punto es que las funciones usan construcciones fundamentales para completar una acción.
Las funciones también pueden trabajar de tres maneras:
- Las funciones pueden realizar el trabajo recibiendo información y operando sobre ella.
- Las funciones pueden realizar el trabajo devolviendo información de vuelta al código que las invocó.
- Las funciones pueden llevar a cabo una unidad de trabajo sin recibir información ni devolver información al código que las invocó. En pocas palabras, pueden realizar una acción silenciosamente.
Vamos a analizar cada uno de estos escenarios con más detalle en un momento, y en un artículo futuro veremos cómo funcionan dentro de una clase. Por ahora, echemos un vistazo a la manera en la que las funciones trabajan dentro de PHP y varios matices sobre cada una de ellas.
Funciones simples
Recuerda de la sección anterior que hay ocasiones en las que podemos definir funciones que no aceptan ninguna entrada ni devuelven ninguna información.
En este caso, estos tipos de funciones generalmente realizarán algún tipo de operación (como actualizar una opción en la base de datos) y serán invocadas por otra función después de que una operación determinada haya sido completada.
Entonces, por ejemplo, digamos que tenemos una función que queremos usar para actualizar la base de datos subyacente de WordPress. Para esto se requiere que sepamos varias cosas:
update_option
- Una clave que usaremos para almacenar la información
- El valor a almacenar y que será recuperado con la clave
En nuestro caso, supongamos que queremos actualizar un valor en la base de datos identificado por la clave blog_last_updated
. Después, usaremos la función time()
de PHP para almacenar la hora en la que se haga la llamada a la función.
Dicho eso, definamos nuestra función:
1 |
<?php
|
2 |
function set_blog_updated() { |
3 |
update_option( 'blog_last_updated', time() ); |
4 |
}
|
En base a la descripción que proporcionamos anteriormente, puedes ver que el cuerpo de la función usa la función update_option
de la API de WordPress con la clave y el valor especificado que describimos.
A su vez, esta puede ser invocada por otro fragmento de código simplemente llamando a set_blog_updated();
.
Argumentos
Las funciones que no aceptan argumentos solo pueden ser útiles hasta cierto nivel. En algún punto, necesitas poder enviar información a una función para que esta pueda realizar algún tipo de cálculo, operación o evaluación de la información.
De acuerdo a nuestro ejemplo anterior, digamos que aún queremos actualizar la base de datos con una marca de tiempo, pero solo si se le envía una clave determinada a la función; de lo contrario, no haremos nada.
1 |
<?php
|
2 |
function set_blog_updated( $key ) { |
3 |
|
4 |
if ( 'blog_last_updated' === strtolower( $key ) ) { |
5 |
update_option( $key, time() ); |
6 |
}
|
7 |
|
8 |
}
|
Observa que la firma de la función (es decir, el nombre de la función y los datos entre paréntesis) ha sido actualizada para aceptar una variable a la que se hace referencia con $key
.
A continuación, la función usa una sentencia condicional para verificar que el valor de la variable sea igual al de la clave que estuvimos viendo en la primera versión de la función. En aras de hacer una comparación fácil, la sentencia cambia a minúsculas el valor de $key
usando la función strtolower
de PHP.
Esto significa que podemos invocar a la función de la siguiente manera y aún así lograr que haga la actualización:
set_blog_updated( 'BLOG_LAST_UPDATED' );
set_blog_updated( 'Blog_Last_Updated' );
set_blog_updated( 'blog_last_updated' );
Todas las llamadas a la función mostradas arriba realizarán la siguiente operación; sin embargo, si enviáramos cualquier otra cosa en la función, la sentencia condicional la evaluaría como false
y no ejecutaría la función de actualización.
Por ejemplo, invocar set_blog_updated( 'not_now' );
no funcionaría.
Devoluciones
Ahora, supongamos que queremos que la función con la que estamos trabajando devuelva un valor. Específicamente, digamos que queríamos devolver un valor dependiendo de si la función de actualización se ejecutó o no correctamente.
Para hacer esto, podemos aprovechar la sentencia return
de una función, así como el valor devuelto por la función update_option. De acuerdo al codex de WordPress, update_option
devolverá lo siguiente:
True si el valor de la opción ha cambiado, false si no o si la actualización falló.
Con ese fin, podemos ajustar nuestra función para que trabaje de esta forma:
1 |
<?php
|
2 |
function set_blog_last_updated( $key ) { |
3 |
|
4 |
$was_updated = false; |
5 |
|
6 |
if ( 'blog_last_updated' === strtolower( $key ) ) { |
7 |
$was_updated = update_option( $key, time() ); |
8 |
}
|
9 |
|
10 |
return $was_updated; |
11 |
|
12 |
}
|
Ahora tenemos una función que acepta un argumento, devuelve un valor y también aprovecha una sentencia condicional, no solo para actualizar el valor, sino también para asegurarse de que el valor haya sido actualizado con éxito.
Dada la función anterior, podemos invocarla como lo hemos hecho en los ejemplos anteriores, pero ahora podemos almacenar su resultado en una variable que nos permitirá mejorar aún más el código en nuestro programa.
Por ejemplo, podemos continuar invocando a la función indicando set_blog_last_updated( 'blog_last_updated' );
, pero ahora también podemos almacenar el resultado de la función en una variable.
Para lograr esto, todo lo que tenemos que hacer es escribir una línea de código que lleve a cabo lo siguiente: $blog_was_updated = set_blog_last_updated( 'blog_last_updated');
. En este caso, el valor de la variable $blog_was_updated
se establecerá en true
si la condición se ejecutó y la llamada a la actualización tuvo éxito, pero será false
si la condición no se ejecutó o si lo hizo pero update_function
falló.
Argumentos de longitud variable
Hay otro aspecto de las funciones que está más allá del alcance de este artículo en particular, y se trata de los argumentos de longitud variable. En resumen, hay una forma de lograr que una función pueda aceptar una cantidad de argumentos que no podemos anticipar al escribir el código.
Si te interesa leer con anticipación, entonces puedes consultar el artículo en el manual de PHP; sin embargo, trataremos de cubrir esto más adelante en la serie.
Atributos
En este punto, vamos a cambiar de marcha y hablaremos de algo que está puramente relacionado con la programación orientada a objetos, y se trata de los atributos de una clase.
Recuerda de nuestra discusión sobre clases que vimos una clase de ejemplo para un Blog_Post
. Como referencia, el código se veía así:
1 |
class Blog_Post { |
2 |
|
3 |
private $author; |
4 |
|
5 |
private $publish_date; |
6 |
|
7 |
private $is_published; |
8 |
|
9 |
public function publish() { |
10 |
// Publish the article here
|
11 |
}
|
12 |
|
13 |
public function delete() { |
14 |
// Delete the article here
|
15 |
}
|
16 |
|
17 |
}
|
En este punto de la serie, deberías poder identificar fácilmente la definición de la clase, la definición de la función y los atributos.
Específicamente, los atributos son las tres variables que existen en la parte superior del archivo, arriba de las funciones. Como se indicó en el artículo sobre clases, los atributos pueden ser vistos como los adjetivos que describen a la clase.
En el ejemplo anterior, tenemos una clase que representa la entrada de un blog, y una entrada de blog puede ser descrita por su autor, su fecha de edición y si ha sido publicada o no.
Estos valores particulares no son más que variables, como hemos visto anteriormente en la serie, y pueden almacenar cualquier tipo de valor, ya sea un tipo de dato primitivo como una cadena, un entero o un booleano, o pueden hacer referencia a un tipo de dato más complejo, como un arreglo u otro objeto.
El punto de los atributos es que existen a nivel de clase. Esto significa que las variables pueden ser usadas en cualquiera de las funciones definidas en la clase: no tienen que ser enviadas como argumentos de la función, y pueden ser actualizadas para reflejar el estado del objeto en cualquier momento durante su tiempo de ejecución.
Ahora, en términos de cómo se establecen sus valores, esto se hace dentro del contexto de un tipo especial de función llamada constructor. En resumen, un constructor es una función reservada específicamente para inicializar una clase y, en muchos casos, es usada para inicializar valores.
En PHP, un constructor es una función llamada __construct
, que es una palabra reservada en el lenguaje. Entonces, dados los atributos anteriores y nuestro manual sobre funciones, así es como podríamos inicializar nuestros atributos:
1 |
class Blog_Post { |
2 |
|
3 |
private $author; |
4 |
|
5 |
private $publish_date; |
6 |
|
7 |
private $is_published; |
8 |
|
9 |
public function __construct() { |
10 |
|
11 |
$this->author = ''; |
12 |
$this->publish_date = null; |
13 |
$this->is_published = false; |
14 |
|
15 |
} |
16 |
|
17 |
public function publish() { |
18 |
// Publish the article here |
19 |
} |
20 |
|
21 |
public function delete() { |
22 |
// Delete the article here |
23 |
} |
24 |
|
25 |
} |
Uno de los detalles más importantes que podemos aprender del código anterior es que la referencia a los atributos se hace de manera ligeramente diferente en comparación con las variables normales. Específicamente, observa que se hace referencia a ellos usando la palabra clave $this
. Esta es la diferencia entre los atributos y las variables normales dentro de la definición de una clase.
En segundo lugar, observa que los valores de las variables están siendo establecidos en valores iniciales. En su estado actual, cada entrada de un blog que sea creada no tendrá un autor especificado, no tendrá una fecha de edición y no tendrá un estado de publicación.
A medida que avancemos en la discusión de la programación orientada a objetos, vamos a hablar sobre cómo se establecen los valores de las variables, cómo pueden ser usadas a lo largo de la clase, cómo se modifican sus valores, cómo se recuperan, y así sucesivamente.
Public, private ¿y qué más?
Dirigiéndome al lector astuto, es probable que hayas notado las palabras clave usadas a lo largo del código, por ejemplo public
y private
. También hay otra palabra clave que se usa dentro de la programación orientada a objetos, y se trata de protected
.
Hablaremos sobre cada una de ellas a detalle en el siguiente artículo.
Próximamente
Como acabamos de mencionar, hay una serie de palabras clave que se usan para hacer referencia a los atributos y las funciones, todo lo cual tiene que ver con lo que se conoce como ámbito. En el siguiente artículo comenzaremos a explorar el ámbito de las variables y las funciones, lo que es una idea central en la programación orientada a objetos.
Entonces, ya que hemos cubierto todos los elementos fundamentales de la programación en PHP, ahora nos prepararemos para avanzar más hacia la programación orientada a objetos, después de lo cual avanzaremos para aplicar los conceptos y las técnicas en el desarrollo de WordPress.