Esta lección está en elaboración.
PHP Coding Standards Fixer (PHP CS Fixer) es una herramienta de los creadores del framework PHP Symfony que permite corregir automáticamente el código fuente PHP de acuerdo con reglas seleccionables de forma individual.
PHP CS Fixer tiene definidas también conjuntos de reglas predefinidas que corresponden a guías de estilo, como las del PHP-FIG, que ahorran tener que incluir numerosas reglas de forma individual.
Estas son las reglas de PHP CS Fixer vinculadas a la recomendación PER Coding Style del PHP-FIG y que están incluidas en la configuración recomendada de VSCode para seguir estos apuntes.
Esta son las reglas de PHP CS Fixer no vinculadas a la recomendación PER Coding Style del PHP-FIG y que están incluidas en la configuración recomendada de VSCode para seguir estos apuntes.
Esta regla convierte algunas construcciones if ... elseif ... (con uno o varios elseif ...) en una serie de construcciones if ....
En general, cualquier construcción if ... elseif ... (con uno o varios elseif ...) se puede sustituir por una serie de construcciones if ..., como muestra el ejemplo siguiente. Pero se suele preferir la construcción con elseif ... porque en la casi totalidad de ejecuciones del programa, esta versión requerirá menos comprobaciones. El motivo es que en la versión con construcciones if ... se comprueban siempre todas las condiciones (aunque solo se cumplirá una), mientras que en la versión con construcciones elseif ..., se comprueban las condiciones hasta que una de ellas se cumple (el resto ya no se ejecutan).
<?php
$moneda = rand(0, 1);
if ($moneda == 0) {
print "<p>Ha salido cara.</p>\n";
} elseif ($moneda == 1) {
print "<p>Ha salido cruz.</p>\n";
}
<?php
$moneda = rand(0, 1);
if ($moneda == 0) {
print "<p>Ha salido cara.</p>\n";
}
if ($moneda == 1) {
print "<p>Ha salido cruz.</p>\n";
}
En este tipo de situaciones la regla no_superfluous_elseif no se aplica y PHP CS Fixer no convierte los elseif ... en if ....
Nota: El ejemplo anterior es un caso muy sencillo en el que los casos son mutuamente excluyentes, por lo que al separar la construcción if ... elseif ... en construcciones if ... no hace falta modificar las condiciones. En casos menos sencillos, en el que unos casos se solapan con otros, sería necesario además modificar las condiciones para garantizar que sólo se cumpliera una de las condiciones.
Pero hay otras situaciones en las que las versiones con elseif ... ejecutan el mismo número de comparaciones que las versiones con if ...), como en el ejemplo siguiente, muy parecido al anterior, pero con construcciones exit (ocurriría algo similar si cada opción acabara en una redirección). El motivo es que en ambas versiones, cuando se cumple una condición el programa se interrumpe.
<?php
$moneda = rand(0, 1);
if ($moneda == 0) {
print "<p>Ha salido cara.</p>\n";
exit;
} elseif ($moneda == 1) {
print "<p>Ha salido cruz.</p>\n";
}
<?php
$moneda = rand(0, 1);
if ($moneda == 0) {
print "<p>Ha salido cara.</p>\n";
exit;
}
if ($moneda == 1) {
print "<p>Ha salido cruz.</p>\n";
}
En este tipo de situaciones la regla no_superfluous_elseif hace que PHP CS Fixer convierta los elseif ... en if .... La conversión es además sencilla, porque en este tipo de situaciones no es necesario modificar las condiciones, como si podía ser necesario en el ejemplo anterior.
Esta regla elimina el apartado else ... de algunas construcciones if ... else ... (con o sin elseif ...).
Si en el bloque if ... (y los bloques elseif ...) se interrumpe el programa (o se realiza una redirección), las instrucciones del bloque else ... no necesitan estar en un bloque else ..., puesto que en ningún caso llegarán a ejecutarse si se cumple alguna de las condiciones anteriores. El ejemplo siguiente ilustra esta situación.
<?php
$moneda = rand(0, 1);
if ($moneda == 0) {
print "<p>Ha salido cara.</p>\n";
exit;
} else {
print "<p>Ha salido cruz.</p>\n";
}
<?php
$moneda = rand(0, 1);
if ($moneda == 0) {
print "<p>Ha salido cara.</p>\n";
exit;
}
print "<p>Ha salido cruz.</p>\n";
En este tipo de situaciones la regla no_useless_else hace que PHP CS Fixer elimine la construcción else ... manteniendo el contenido del bloque else ....