Du trumpi PHP patarimai

Nors su PHP dirbu jau kelis metus, bet vis atsiranda, kažkokių stebūklingų būdų kaip atlikti vieną ar kitą veiksmą. Pradėsiu vienu, neseniai atrastu patarimu, kaip skaičių paversti neigiamu, paprastai darydavau taip:

//..
$negative_var = $var * -1;
//..

Pasirodo, taip darydavau ne vien aš, bet ir visi mano kolegos, o vieną kartą atvertęs PHP dokumentaciją atradau trumpesnį būdą šitam veiksmui atlikti:

//..
$negative_var = -$var;
//..

Kitas patarimas susijęs su trumpaisiais sąlygos sakiniais, tarkim priklausomai nuo kintamojojo reikšmės norime išvesti eilutę arba nieko nedaryti, tai darydavom taip:

//..
echo $var ? '$var is true' : '';
//..

Pasirodo yra kitas būdas tai atlikti:

//..
$var and print('$var is true');
//..

Noriu pastebėti, kad ‘echo’ po ‘and’ nebeveiks, be to jeigu naudojate > PHP 5.3.x versiją galite naudoti dar patogesnį sutrumpinimą:

//..
echo !$var ?: '$var is true';
//..

Tiek šiam kartui patarimų, jei turit kokių nors pastabų, ar dar kažkokių įdomesnių metodų PHP kalboje, pasidalinkite komentaruose :)

Leave a comment ?

10 Comments.

  1. Patiko tas variantas su and print, bet, kad pas mane yra iprotis naudotis echo, todel zinau, kad nenaudosiu jo.

    O del velesnes php 5.3 versijos tai yar saunu, tik idomu ar taip pat galima padaryti:
    <?php
    echo $var ? 'true';
    ?>

  2. Valentinas

    šiaip į tokius dalykus reikėtų žiūrėti atsargiai. Nesuprask neteisingai – juos reikia žinoti, bet naudoti reikia tik ten kur reikia o ne dėl to kad "moku krūčiau parašyti".

    Pavyzdžiui "$var and print('$var is true');" naudoti nereikėtų. Pirmas dalykas yra tai kad perskaityti ką tai reiškia yra žymiai sunkiau, nes if(a) {b} yra viskas aišku, tuo tarpu a and b yra neaišku ką tu čia nori padaryti.
    Antra priežastis kodėl nereikia taip rašyti, dėl to kad tai greičiausiai surys daugiau resursų. nes if(a) {b()} bus vykdoma maždaug taip:
    1. paimama a reikšmė
    2. a castinama į boolean
    3. jei a yra true tai kviečia funkciją b

    kai tuo tarpu a and b() bus vykdoma maždaug taip:
    1. paimama a reikšmė
    2. castinama į boolean
    3. jei true, tada kviečiama b()
    4. paimamas b() gražintas rezultatas ir castinamas į boolean
    5. jei b() rezultatas true tada NOOP

    Rezultatas tas pats – resursų naudoja skirtingai.
    Čia tas pats galioja ir teranary operatoriui ir daugybai vs -$var. Jei renkiesi vieną variantą turi žinoti dėl ko taip darai, o ne tik dėl to kad kiečiau atrodo. apie šitą -$var nieko negaliu pasakyti kol kas,bet siunčiuosi WAMP, padarysiu greičio testą ir tada jau galėsiu kalbėti :) Tik vienas dalykas, greičiausiai reikėtų rašyti 0-$var. Rezultatas bus lygiai tas pats, tik skaityti lengviau.

    • Valentinas

      Realiai abu variantai tiek -$var tiek $var * (-1) veikia taip pat, tai čia lieka tik viena priežastis naudoti vieną arba kitą: kodo aiškumas (readability). Kadangi $var* (-1) yra daugiau paplitęs ir (gal) aiškesnis, tai manau apsimoka šitą naudoti.

      o to paskutinio: "echo !$var ?: '$var is true';" tai nežinau :) )) Čia neaišku net nuo kurio galo pradėti skaityti :D Žodžiu kompui tai dzin ar terenary operatorius ar normalus if, nes reliai tai persiverčia į lygiai tą patį kodą. skirtumą pajaus tik žmonės, tai manau kad geriau rašyti įskaitomą ir lengvai suprantamą kodą :)

      Disclosure: šiandien man galvą skaudą, tai kyla noras trollinti, rašyti ilgus komentarus, piktintis viskuo, ir vaidinti labai teisų, bet galvas visi turime, tai atsirinksit jau kas naudinga čia iš tų mano komentarų o kas nelabai :) )

    • irmantasplius

      Dėkui už puikų komentarą, apie resursų panaudojimą visai nepagalvojau :) dažna programuotojų klaida. Įrašu tiesiog norėjau supažindinti apie esamas galimybes PHP kalboje.

    • Valentinas

      Su "and" arba "or" (dažnai būna pavyzdys su mysql_connect or die()) tai čia ne galimybės o tiesiog veikimo mechanizmai. and operatorius tikrina antrą operandą tik tada kai pirmas yra true, o or tikrina antrą tik tada kai pirmas yra false. Šitą reikia žinoti dėl to kad galėtum efektyiai naudoti tokius dalykus kaip if(isset(a) && a) vietoj if(isset(a)){if(a){}}. Nes nežinau kaip kitiems, bet manau čia dažna klaida, nes aš visada galvojau apie or ir and kaip apie kokią sudėtį, kad jis paima abu operandus ir juos kažkaip lygina – iš tikro tai visai kitaip veikia.

      Šitas dar yra labai svarbu žinoti dėl to, kad jei darai if(operacija_a() && operacija_b()) ir pavyzdžiui žinai kad operacija_b() naudoja 1000 kartų mažiau resursų nei operacija_a(), ir operacija_b() gražins false 90% atvejų, nu tai logiška yra juos sukeisti vietomis. atrido bus tas pats: if(operacija_b() && operacija_a()), bet rezultate kodas 90% atvejų bus 1000 kartų greitesnis. Žodžiu :)

  3. Zmoniu isradingumas stulbina kartais. Kas raso tokius:

    $negative_var = $var * -1;

    Dirbu PHP turbut jau bus kokie 7-8 metai bet dar tokio bajerio neesu mates. Papildomas tavo variantui:

    $negative_var = -$var;
    $negative_var = abs($varr);

    Tavo atveju sutaupomi 4 simboliai :)

    • irmantasplius

      Nesupratau ką norėjai parodyti naudodamas abs() funkciją? Kiek aš žinau, taip ir PHP dokumentacija rodo, jog abs() gražina absoliutinę reikšmę, kuri niekados nebus neigiamas skaičius.

    • Valentinas

      abs() tai modulis, prie ko čia negative?
      o $negative_var = $var * -1; tai visai normalus parašymas, per matieką visada taip rašydavau kai ten kokias nors trupmenas ar lygtis reikėdavo spręsti, nematau nieko blogo ir kode taip rašyti :)

  4. Net ir aš.. Neprogramuojanti informatikė tai žinau.. shame on you

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>