2009. február 11., szerda

print vs. echo, avagy szükség van mindkettőre?

Tegnap eléggé összezavart egy PHP viselkedés, amiből bug report is keletkezett. Mikor reagáltak rá, logikussá vált a viselkedés, viszont még több kérdés merült fel bennem. Ma bent beszélgetem erről Zolival és benne is – remélhetőleg – ugyanazok a kérdések merültek fel, mégpedig: "mi értelme van PHP-ban a print nyelvi elemre?"

A probléma

Debugolás közben sok-sok if-elseif tesztelése közben, hogy egy helyre miért nem megy be, a következőt írtam be:

...
elseif (print($foo) && $foo == 'bar') {
...

Ennek hatására váratlanul megjelent egy "1"-es a kimenetben és az eddig kihagyott elseif ágba bele futott a program. Nem értettem! A végén a következő tesztig jutottam, amit végül reportoltam is:

var_dump(print('') && false); // int(1)

viszont ha a két feltételt megcseréltem, a kimenet bool(false) lett.

Valós működés

Szóval elmagyarázták, hogy igazából ilyenkor olyan, mintha a print után nem is raknánk a zárójeleket, tehát a példám a következővel egyenértékű:

print ('' && false); // ''

Viszont a print()-nek a visszatérési értéke int(1), innen a var_dump(); kimenete. És ekkor felmerült bennem a kérdés, mert igazából semmi nem indokolja a létezését:

  1. nem használható ki, hogy "függvényként" használható;
  2. nem adható neki több argumentum, csak 1;
  3. lassabb, mert a visszatérési értéket is inicializálni kell;
  4. félrevezetheti a fejlesztőket.

Van valaki, aki szerint bármi értelme is van?

Mellesleg ugyanez a helyzet az include/required nyelvi elemekkel is, azoknál sem kellene szerintem a zárójeles szintaktikát elfogadni, mivel ott is fennáll a fenti print()-es probléma!

Zoli amúgy arra tippelt, hogy azért "kellett", mert a C-ben is van, és hát azon alapszik – vagy valami ilyesmi.

1 megjegyzés:

  1. Hali!

    Az include és require egyrészt más szerepet tölt be, másrészt meg visszatérési értéknél hibakezelést lehet megvalósítani.

    ÜDV

    VálaszTörlés