PHP: Czytelność kodu i składnia alternatywna

Posted by Jacek Galanciak on

Gdyby poszukać krótkiego opisu zalet języka PHP, bez wątpienia znaleźlibyśmy, że:

  • nie trzeba kompilować – po prostu zmień kod i kliknij na Odśwież
  • kod jest przenośny – uruchomisz go na każdym systemie i wszędzie zadziała
  • przejrzysta składnia, w wielu miejscach podobna do starego, dobrego C

Trudno się nie zgodzić z dwoma pierwszymi argumentami. Rozważając jednak głębiej trzeci punkt, można zacząć mieć wątpliwości, czy aby nie jest tak, że jedynie słowa „podobna” i „starego” oddają rzeczywistość

Język C był niejednokrotnie krytykowany z wielu powodów – składnia i jej czytelność to jedne z nich. PHP, dziedzicząc z niego pewne elementy, przejmuje również niedogodności. Przede wszystkim: czytelność. Kulejącą.

Spójrzmy tylko na poniższy kod [który oczywiście pozbawiony jest sensu]:

function fcuk_the_legibility($s, $arr_data, $a, $b, $c) {
    switch ($c) {
        case 1:
            for ($i = 0; $i <= 10; $i++) {
                if ( ($a % 2) && ($a != $b) ) {
                    while (!temp) {
                        if ($c) {
                            foreach ($arr_data as $item) {
                                echo $item . "\n";
                            }
                            $temp = 1;
                        } else {
                            $temp = 1;
                        }
                    }
                } else {
                    echo "Nie dopasowało się.\n";
                    continue;
                }
            }
            break;
        default:
            break;
    }
}

Zaznacz dowolną klamrę zamykającą blok – co ona zamyka? Szukasz? No właśnie… Nowoczesne edytory kodu znacznie ułatwiają sprawę, ale ich zadaniem nie jest poprawianie czytelności, a jedynie usprawnienie nawigacji i kontroli nad kodem.

Niektórzy programiści poczuli potrzebę opisu domknięć bloków. Użyli do tego komentarzy:

function my_func($a) {
    if ($a) {
    } // END: if($a)
} // END: function my_func($a)

Ładnie. Pierwotny problem się rozwiązuje. Ale kod nadal pozostaje nieludzki, porównując go z takimi językami jak Ruby czy Python.

Nie każdy o tym wie, ale w PHP istnieje tzw. składnia alternatywna.

function alternative($s, $arr_data, $a, $b, $c) {
    switch ($c):
        case 1:
            for ($i = 0; $i <= 10; $i++):
                if ( ($a % 2) and ($a != $b) ):
                    while (!temp):
                        if ($c):
                            foreach ($arr_data as $item):
                                echo $item . "\n";
                            endforeach;
                                            $temp = 1;
                        else:
                            $temp = 1;
                        endif;
                    endwhile;
                else:
                    echo "Nie dopasowało się.\n";
                    continue;
                endif;
            endfor;
            echo "Done!n";
            break;
        default:
            break;
    endswitch;
}

Jak pisać za pomocą takiej składni?

  • bloki rozpoczynamy dwukropkiem
  • blok while kończymy za pomocą endwhile, for-endfor, if-elseif-else-endif, switch-endswith, foreach-endforeach
  • operatory logiczne && i || zastępujemy odpowiednio za pomocą andoraz or
  • warto dodać o operatorze alternatywy wykluczającej xor, przydatnym, choć dość rzadko używanym – ten posiada tylko słowny odpowiednik w PHP
  • należy pamiętać, że and ma niższy priorytet niż && (co się tyczy również operatora or) – patrz php.net

Ciekawą sprawą jest alternatywna wersja instrukcji echo:

Mam w domu <?=$animal ?> i brata.

Trzeba tylko pamiętać o włączeniu dyrektywy short_open_tag. Osobiście nie używam takiej formy, ale jeśli ktoś ma ochotę…

Szczególnie ludzie embedujący kod PHP do HTMLa poczują wygodę stosowania składni alternatywnej (niektórzy twórcy szablonów Wordpressa nałogowo z tego korzystają):

<ul>
<?php foreach ($links_arr as $element): ?>
    <li><?php echo $element ?></li>
<?php endforeach; ?>
</ul>

Przeciwnicy składni alternatywnej zarzucają jej brak zwięzłości, wydłużenie czasu pisania kodu, niezgodność z konwencją narzuconą przez PEAR i wynajdywanie czegoś, co jest absolutnie niepotrzebne (i powołują się na plotki w dokumentacji PHP, na czego temat wywiązała się ciekawa dyskusja). Cóż, ich wybór. Ja cenię sobie czytelność kodu, bo to podstawa przy pracy nad nawet średnimi projektami, dlatego będę jej używał. Do czego również i Was zachęcam.