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ą and oraz 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.

Komentarze: Skocz na dół, na górę

  1. Może i składnia PHP/C++ jest nieczytelna, ale za to zwięzła. Dlatego preferuję stosować komentarze na końcowych klamerkach, co ma także swoje zalety przy wielu zagnieżdżonych, lub kolejno występujący instrukcjach tego samego typu (np. kilka if z rzędu).

    A w szablonach… na pewno się przyda, o ile nie stosuje się Smarty.

    W ostatnim wycinku kodu brakuje chyba „?>” na końcu drugiej linijki.

  2. Dzięki, poprawiłem. :)

    Pamiętać trzeba o jednym: zwięzłość może i przyśpiesza pisanie, ale analizy już nie. Nie wspominając już o szukaniu błędów.

    Na szczęście PHP umożliwia pisanie na oba sposoby i każdy może wybrać to, co lubi najbardziej.

  3. IMO te klamry są najlepszym rozwiązaniem. Całkiem niedawno postanowiłem się poduczyć Pythona i na samym wstępie odrzuciła mnie jego składnia (a dokładnie czułość na spacje/tab-y).

    Przejrzystość kodu zależy przede wszystkim od stylu jakim się programuje.

    Można pisać tak:
    if()
    {
    ...
    }
    lub:
    if() {
    ...
    }

    i do tego dodać wcięcia, które jasno pokazują kod między klamrami i nie ma problemu [-;

  4. Nie rozumiem w tym kontekście przyrównania do składni Pythona. Może tam też istnieje jakaś składnia alternatywna, ale AFAIK to przecież bloki oznaczamy przez samą indentację. Biorąc pod uwagę kontekst wpisu, w którym miejscu jest to czytelniejsze od standardowej składni PHP? Wymusza indentację, ale przecież w dalszym ciągu nie wiadomo, jaki blok kończy zmniejszona indentacja…

    A odnośnie embedowania PHP do HTML-a chyba nie muszę się wypowiadać? Wydaje mi się, że ta kwestia była już wystarczająco dużo razy poruszana…

  5. „Pamiętać trzeba o jednym: zwięzłość może i przyśpiesza pisanie, ale analizy już nie. Nie wspominając już o szukaniu błędów.”
    Amen. Niektórzy wolą oszczędzać po sekundę-dwie pisząc kilka znaków mniej (nie wspominając o edytorach, które potrafią dopełniać tego typu rzeczy automagicznie), a potem analizować kod 20 minut zamiast 5…
    Nie wiedziałam że PHP ma taki bajer (nie używam) – w każdym razie jak dla mnie kapitalny pomysł.

    Inna rzecz że przy tylu poziomach zagnieżdżenia (switch-for-if-while…) to warto jednak pomyśleć o refaktoryzacji takiego kawałka kodu.

  6. PS. Tak obalając wspomniane na początku zalety:
    1. Kompilować faktycznie nie trzeba, jak w każdym języku skryptowym. Jednak czy warto rezygnować z kompilacji, tracąc tak wiele na wydajności?
    2. Przenośność też nie do końca — niby zasadnicza warstwa jest przenośna, ale jest też spora grupka funkcji, pod względem wsparcia których PHP dla Windows jest upośledzone (tutaj zaznaczę, że nie wiem, czy w nowszych wersjach to się nie zmieniło).

  7. Michał Górny: Kontekst wypowiedzi o Pythonie i Rubym mógł być faktycznie nieco mylący. Mi chodziło bardziej o ogólne wrażenie, jakie sprawiają te dwa języki. Akapit przekazywał jedynie tyle, że jest coś, co można zrobić, by PHP nie było tak bardzo do tyłu.

    O ile mi wiadomo, Python nie posiada tego typu alternatyw. Ale ich nie potrzebuje – jego kod jest wystarczająco przejrzysty (i znów mówię tutaj globalnie, nie w kontekście bloków). Ruby też nie ma, ale można to bardzo łatwo obejść, i to na dwa sposoby.

    A co do Twojego PS. – myślę, że bezsensownym zabiegiem jest czepianie się na siłę tego, co jeszcze zostało. Tym bardziej, że nie prowadziłem mądrego wykładu o PHP, a jedynie pisałem o tym, jak niektórym zdarza się określać ten język.

  8. Cachotterie ma rację, zwykle nie ma potrzeby tworzenia takich głębokich zagnieżdżeń. I wtedy wystarczy stosować
    if ()
    {
    <tab>kod…
    }
    i jest ładnie i czytelnie.

  9. Re: PHP: Czytelność kodu i składnia alternatywna

    Dziś na Techblogu, Razorjack poruszył kwestię czytelności kodu. Postanowiłem dodać więc swoje III grosze w tej sprawie.
    Widziałem już wiele sposobów zapisu kodu. Zarówno te złe:

  10. BTW, źle wpisałeś alternatywę dla echo. Powinno być <?=$animal ?> a nie <?php =$animal ?>. Zresztą chyba o to pierwsze ci chodziło, skoro mówisz o short_tags ;)

  11. Wpis fajowy, chciałbym żeby JavaScript takie coś miało. Używając Object Notation i pisząc parę ifów/forów w funkcji w końcu nie wiem gdzie jestem. :]

    D4rky: „pre.” nie zadziała chyba (Textile Lite?), używaj „bc.” :)

  12. Riddle – Textile zwykłe, a bc mi zignoruje wcięcia, o które chodzi. Puściłem trackback, mój komentarz proszę skasować

  13. D4rky: Komentarz usunięty. I poprawiłem kod, dzięki wielkie. Głupi błąd, z przyzwyczajenia napisałem „po swojemu”. ;)

    Włączyłem też Textile dla komentarzy, jakby kogoś to interesowało.

  14. A ja się nie zgodzę z pierwszym argumentem. W produkcyjnym zastosowaniu możliwość statycznej analizy kodu (w czasie kompilacji) jest nieoceniona.

    A co do składni: nie lepiej to rozbić na funkcje zamiast generować spaghetti?

  15. Jasne, że lepiej. To nie był artykuł o tym, jak błędnie kodować wszystko w jednej funkcji, tylko o tym, czemu składnia alternatywna może się okazać cenna. Dałem przykład ekstremalny i nierealny, by jeszcze bardziej wszystko uwydatnić :).

  16. Kod celowo pisany bez wcięć.

    if($a):
    if($b):
    if($c):
    if($d):
    // bum;
    else:
    // tralala
    endif;
    else:
    // tralala
    endif;
    else:
    // tralala
    endif;
    elseif($ziutek):
    // cyk
    endif;

    Czytelne? Nie. Przynajmniej nie dla mnie. Przy paru(nastu) ifach nawet ta superaśna składnia alternatywna zmusza do poświęceniu paru chwil na liczenie, „który endif jest do którego ifa i skąd tu się wziął ten elseif”. No i nowsze edytory nic nie podświetlą, bo to niezgodne ze składnią. A co by było, gdyby były wcięcia? Ale wcięcia można też zastosować w składni normalnej, „i wychodzi na moje”.

    „Zaznacz dowolną klamrę zamykającą blok – co ona zamyka? Szukasz?” – nie, nie szukam, po prostu jadę kursorem trochę do góry i sprawdzam, gdzie na tym samym poziomie wcięć jest rozpoczęcie bloku. Do tego, skoro doskonale znam mój własny projekt (wszak to JA go tworzę), to się w nim nie powinienem gubić, bo znam go jak własną kieszeń... nieprawdaż?

  17. Tak duże nagromadzenie ifów nie występuje w praktyce. A jeśli już, to tworzy się jedną dużą funkcję logiczną, która zajmuje jedną linijkę i w całości dotyczy jednego bloku, a nie czterech.

    Jedziesz kursorem w górę? W takim razie nie robisz nic innego jak po prostu szukasz. A ja patrzę na endfor i dokładnie wiem o tym, który blok zostaje tym słowem zamknięty.

    Jeśli się nie gubisz, kiedy projekt osiąga powyżej 30 tysięcy linijek, to jesteś dobry. Ja jednak od samego początku lubię się wspierać naturalną wieloklasowością i wielowarstwowością projektów. A jeśli projekt wykonuję samemu, to również składnią alternatywną. Bo przyznam, konwencje są szalenie ważne, dlatego jeśli jest on współtworzony przez innego kodera, to użyję składni rekomentowanej przez PEAR. Bo właśnie ta, a nie alternatywna, jest zalecana i „oficjalna”.

  18. „Tak duże nagromadzenie ifów nie występuje w praktyce.” – występuje… ja się z takim nagromadzeniem bardzo wiele razy spotykałem, ba, sam tak kodziłem ;]

    „A ja patrzę na endfor…” – zamień w moim poprzednim przykładzie wszystkie „if” na „for”. I co? Bo wierz mi, takie sytuacje TEŻ występują – albo mogą wystąpić.

    Cóż, jak dotąd jeszcze nic większego nie napisałem (nie żeby miało 30k linijek), więc się nie gubię ;>

  19. echo „$itemn”; – tym mnie dobiłeś :D Widać jaki poziom programisty :)

  20. Komplikowałem przykład najbardziej jak się da. Zagalopowałem się, jak widać, i wydajność też skomplikowałem :P. Poprawiłem. Na pewno czepialskim coś jeszcze w tym nie będzie grało, ale nie będę już tego poprawiał, bo nie o to w tym poście chodzi.

  21. Re: PHP: Czytelność kodu i składnia alternatywna

    Dziś na Techblogu, Razorjack poruszył kwestię czytelności kodu. Postanowiłem dodać więc swoje III grosze w tej sprawie.

  22. a jak ma się to na wydajność ?? A druga rzecz to wg mnie jest przydatne jedynie podczas wklejania kodu PHP w kod HTML a nie w innych sytuacjach. Programowanie z tym może tylko zabić czytelność :) bynajmniej tak miałem w DELPHI:

    IF cos THEN
    begin {rob cos}
    end

    na początku jest oki. czytelne i wogóle, po dwóch dniach zabawy zaczyna wkur…. a po tygodniu spokojnie wyrzucasz delphi do smieci i programujesz w C++ Builder (wtajemniczeni wiedzą dlaczego builder) :) Każdy będzie programował w tym co mu pasuje, mi podchodzi składnia C ale jeśli muszę zrobić coś takiego:

    <ul> <?php foreach ($data as $value) :?> <li><?php echo $value[‘art_id’].” „.$value[‘tytul’]; ?></li> <?php endforeach; ?> </ul>
    No to czytelniejsze jest jednak alternatywna składnia.

  23. Ta składnia, tak jak pisałem, nie jest zgodna ze standardem PEAR, dlatego można co najwyżej użyć do czytelniejszego embedowania kodu PHP do HTML. Ale w dobie systemów szablonowania nie jest to najlepszy pomysł.

    Poza tym… to jeszcze jest ktoś na tej planecie, kto pisze w PHP? ;)

  24. jeszcze jakieś 15 mln osób :P A dlaczego nie PHP, to co wówczas wolne RUBY ?? Python ?? Jak już miałbym się przerzucić z PHP na coś innego to wybrałbym J2EE, w ekstremalnym wypadku .NET (dlaczego ekstremalnym, bo nie lubię za bardzo tej technologii, ale to moje zdanie). PHP w połączeniu z Zend Framework wg mnie naprawdę dobrze wygląda. Choć szczerze przyznam skłaniam się jednak w kierunku JAVA i technologii oplatajacych np. wymienione J2EE.

  25. Ruby wolny? Poczekaj na Ruby 2.0. A póki co – spójrz na test wydajności różnych frameworków. PeHaPowe wypadają zdecydowanie najgorzej. Jeśli tak lubisz Zenda, to zajrzyj jeszcze do dyskusji na temat wydajności ZF. Ja wiem, że 1.03 to co innego niż 1.5, ale poszukaj w necie i zobaczysz, że wydajność jest żałosna – zarówno ZF, jak i Symfony. Rails może wypaść parokrotnie szybciej – Django paredziesiątkrotnie!

    A skoro PHP wypada beznadziejnie w testach wydajności i samo w sobie jest beznadziejne (frameworków też nie ma za fajnym IMO) – nie widzę powodów, by w nim pisać.

  26. Stary, to że nie lubisz Zenda i Symfony, to nie jest argument odnośnie ich „fajności”. PHP jeszcze trochę pociągnie właśnie dzięki takim rozwiązaniom.

  27. Every weekend i used to pay a visit this site, for the reason that i want enjoyment, since this
    this web page conations actually fastidious funny
    information too.

  28. I think the admin of this website is truly working
    hard for his website, for the reason that here every data is quality based information.

  29. I blog frequently and I seriously thank you for your content.
    This article has truly peaked my interest. I'm going to book mark
    your website and keep checking for new information about once per week.
    I subscribed to your Feed too.

  30. This is my first time go to see at here and i am genuinely happy
    to read everthing at single place.

  31. My programmer іs trying too convince me to mօve tο
    .net from PHP. I have always disliked the idea becausee of
    thе costs. But he's tryiong none the leѕs. I've Ƅeen usіng Movable-type on a
    number of websites fоr about a year and am concerned ɑbout switxhing tօ another
    platform. I havе heard excellent things abоut blogengine.net.
    Is there a way Ι ϲan transfer all my wordpress content іnto іt?
    Any kind of helƿ would be greatly appreciated!

  32. Yet, no time before, are there countless experts or products accessible to assist us to
    reduce weight. There a wide range of colon cleansing products currently out there which can be very
    efficient, but also for my money, in choosing which product to
    utilize, I would look to make use of engineered to be made
    up of 100% natural ingredients. Chubby cheeks, dark under
    eye circles and double chins can be the consequence of lack of exercise rather than eating an adequately balanced
    diet.

  33. Test your connection speed, easy and free using TestInternetSpeed.Link.

    It is precise, fast and works fine on Android, iPhone, Tablets,
    and all computers with an updated web browser.

    At the start a ping test is done and the faster server is selected, to make all the internet speed tests.

Dodaj komentarz na temat

Zanim skomentujesz...

W komentarzach działają znaczniki Textile.
Zastrzegam sobie prawo do edycji Twojego komentarza tylko i wyłącznie w celach estetycznych (naprawienie źle wstawionego kodu, itp). Nie zmieniam ich treści, ortografii, interpunkcji. Jeśli odczuwasz potrzebę edycji swojego komentarza, skontaktuj się ze mną, a zdziałamy co trzeba.