← Uz sākumu

Domā, ka zini PHP?

2013. gada 27. maijā, 18 komentāri

Būšu godīgs - uzrāvos. Paprovē izlasīt zemāk redzamo PHP kodu un galvā izdomāt, kāds būs izvadītais rezultāts. No peeking! Ieraksta turpinājumā paprovēšu pa soļiem izskaidrot - kāpēc viss ir stipri savādāk, nekā man šķita.

echo '1'.print(2)+3;

Un rezultāts būs “511”. Kāpēc, prasīsi? Tad, nu, pa solim:

  1. print nav īsti funkcija, kas nozīmē, ka print(2)+3 izrēķinās no sākuma (2)+3 un pēc tam to izdrukās. Tātad, mums ir izdrukāts 5
  2. Iepriekšminētais print tomēr uzvedās arī kā funkcija, mūžīgi mūžos vienmēr atgriežot “1”. Tātad, mēs teorētiski iegūstam '1'.1, kas nav gluži legāls pieraksts PHP (pamēģini), tāpēc uzrakstīsim to šādi: '1'.(1) (legāli).
  3. Gala rezultātā tiek veikta konkatenācija '1'.'1' (otrais arguments ir string, jo notiek noklusētais type cast). Tiek izdrukāts “11”.
  4. Tāpēc arī “511”.

Rezumējums - nelietojiet iekavas ar print un echo. Tas var mulsināt un iedzīt izmisumā pat pieredzējušu PHP programmētāju.

Bet, kāda tad, ellē ratā, ir starpība starp print un echo?

Ar print tu vari izdrukāt vienu parametru. Piemēram, print 1, 2, 3 nestrādās. Otrām kārtām - print atgriež vērtību, ko nedara echo, attiecīgi - to var daļēji izmantot kā funkciju (($some_var) ? print 'true' : print 'false'; būs ok, bet ar echo tā nevar).

Mūžu dzīvo, mūžu mācies.

P.S. Language wars nepieļaušu. Tas nav šī ieraksta mērķis.

Tu atbildi augstāk redzamajam komentāram. Atcelt

Gravatar Storms

2013. gada 28. maijā, plkst. 05:37

Ui! Ar datuma funkcijām iekš PHP arī ir pamatīgas auzas. 3 dažādi formāti un katram savi "prikoli". :) Nākamā tehnogēnā panika būs "2039.gada problēma", jo viena no senajām un plaši pielietotājām funkcijām mktime() izrādās ka nesupportē datumus pēc 2038.gada...

Gravatar VP

2013. gada 28. maijā, plkst. 06:48

Interesants raksts http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/ ar pamatīgu, sastrukturētu argumentu kaudzi.

Gravatar Vilx-

2013. gada 28. maijā, plkst. 11:02

+1 par šito. Štrunts par language-war, bet tur noteikti atradīsies vismaz pāris lietas, kuras nebiji iepriekš zinājis, un kuras liks pārdomāt to, cik tieši korekti strādā Tevis rakstītie softi.

Gravatar at0m

2013. gada 28. maijā, plkst. 09:42

Ar echo tak var echo ($somevar) ? 'true' : 'false'; jeb esu kautko palaidis garām.

Gravatar laacz Autors

2013. gada 28. maijā, plkst. 09:43

Bet nevar <code class="php">true ? echo 'true' : echo 'false'</code>

Gravatar Tower_9

2013. gada 28. maijā, plkst. 09:48

Arī man rezultāts šķita savādāks - mūžu dzīvo mūžu mācies. Šķiet ka echo bija arī veiklāks par print. Es pārsvarā lietoju echo bez iekavām, bet dažreiz tomēr sanāk izmantot print un to kaut kā pierasts lietot ar iekavām...

Gravatar sn

2013. gada 28. maijā, plkst. 10:25

echo un var_dump() pēdējos x gadus lietoju tikai debugiem.

Gravatar daGrevis

2013. gada 28. maijā, plkst. 10:46

Nabadziņi, kuriem ir jāprogrammē PHP. :)

Gravatar Justīne

2013. gada 6. jūnijā, plkst. 20:22

Kurā valodā labāk sākt mācīties programmēt?

Gravatar Vilx-

2013. gada 28. maijā, plkst. 11:00

Aha, PHP šitādu "WTF" ir vairāk nekā sunim blusu. Mans favorīts - "61529519452809720693702583126814" == "61529519452809720000000000000000"

Gravatar mm

2013. gada 29. maijā, plkst. 16:47

pameiģini labāk ko šadu for($i=0;$i<99;$i++) { echo'.$i.'+ print($i); }

Gravatar Karlis

2013. gada 3. jūlijā, plkst. 11:04

Nu šis gan ir jooooppp... Traģiski...

Gravatar Māris Alksnis

2013. gada 28. maijā, plkst. 14:22

Pirmo reizi redzu, ka kāds reāli izmanto vārdu "konkatenācija"! :D

Gravatar Krišs

2013. gada 28. maijā, plkst. 22:51

Bet kā vēl? Simbolu virkņu savienošana?

Gravatar Kirils

2013. gada 29. maijā, plkst. 22:34

damn, es būtu teicis, ka 214 :(