Wednesday, September 8, 2010

Pöördumine failide poole ja echo

Kui persoon leiab end PHP-d kirjutamas, siis on kaks käsku, mida ta kohe kasutama hakkab: echo ja include.
Esmalt tuleks meeles pidada, et ei echo ega include ole funktsioonid. Kui keegi räägib echo funktsioonist, siis see on sisuliselt väär. include korral võib siiski teda kasutadad ka kui funktsiooni, sest kui include õnnestus, antakse tagasi väärtus true, vastasel juhul false.

echo

Selle tegevuse juures tahaks vaid mainida ühte asja: jutumärkide kasutamisel parsitakse väljastatav lause, ülakomade korral mitte.

<?php

      $muutuja = 'üks asi';
      echo "Mina olen $muutuja";    //  Tulemus: Mina olen üks asi
      echo 'Mina olen $muutuja';    //  Tulemus: Mina olen $muutuja
      echo 'Mina olen '.$muutuja;   //  Tulemus: Mina olen üks asi
?> 

Esimene ja kolmas variant annavad sisuliselt identse tulemuse, kuid kuna kolmanda variandi korral tulemust ei parsita, siis on väljund veidike ka kiirem. Missioonikriitilstes ja suuremahulistes ning hulgaliselt üheaegsete pöördumistega lehtede korral on see väikegi ajavõit tihti väga oluline.

include

Minu isiklik seisukoht on, et mitte-PHP failide kuvamiseks nende väljakutsumine include abil on ressursi raiskamine. Sest include on mõeldud PHP skriptifailide lisamiseks, teostades nende sisu parsimiseks ja vastavalt siis ka funktsionaalsuse lisamiseks.
Seega, kes kasutab include võtmesõna HTML failide sisselugemiseks raiskab liialt ressurssi. include asemel võib kasutada järgmisi korrektseid võimalusi:

  • file - funktsioon, mis loeb faili massiivi, iga rida on eraldi massiivi element (algab 0 elemendist)
  • readfile - funktsioon, mida võikski kasutada include asemel; loeb faili sisu ja väljastab selle brauserisse
  • file_get_contents - loeb faili sisu ühte muutujasse (ehk siis kogu tekst on ühes string-tüüpi muutujas)
Nüüd, kus me oleme likvideerinud mõttetu ressursiraiskamise, vaatame include erinevaid variante.
Põhiline, kui me loeme mingit PHP rakendust sisse ja tegu pole spagett-include'ga, siis seal on sees funktsioonide ja/või klasside definitsioonid. Kuna aga neid definitsioone tohib olla vaid üks, siis peab kontrollima, et include toimiks vaid üks kord. Võib kirjutada konrolli või kasutada võtmesõna include_once. Sellisel juhul loetakse fail vaid korra ilma, et peaks rohkem kontrollima. Minu mäletamist viisi algsetes PHP versioonides seda võimalust ei olnud, kuid ma võin ka eksida ja see võis mu enda rumalus olla, et ma seda ei teadnud.
Standardis on olemas ka võtmesõnad require ja require_once, kuid kuna need annavad Fatal error-it, kui faile ei ole, siis ma neid ei kasuta. Faili olemasolu peaks ikka enne include-t olema. Siin üks väike funktsioon, mida ma ise include tegemisel kasutan:

function Inc($file, $once = 1, $nolog = 0, $required = 0)
{


    if (!@file_exists($file))
    {
         if (defined('LOCALPATH'))
         $file = RELPATH . 'o/' . LOCALPATH . $file;
         if (!file_exists($file))
              return;
    }


    if (!is_file($file))
       return;


    if ($once)
    {
       if ($required)
            require_once $file;
       else
       return include_once $file;
    }
    else
    {
        if ($required)
            require $file;
        else
            return include $file;
    }
}
fopen

Funktsioon fopen võimaldab täielikku kontrolli failide üle, lugeda, kirjutada ja lisada. Siin tuleks ehk ainult rõhutada seda, et faili avamine võib ebaõnnestuda ja siis tuleb ka vastavalt käituda. Ehk siis:

<?php


    $file = fopen('myfile', 'r');


   if (!$file) echo 'Faili ei saanud avada';
   else
   {
//       tee failiga midagi
        fclose($file);
  }
  ?>

ja peaks ka faili sulgema. Siin on muidugi selline asi, et PHP sulgeb ise skripti lõppedes avatud failid, kuid kui teil läheb vahepeal sama faili vaja, siis sulgemata failiga võib see ebaõnnestuda.

Tuesday, September 7, 2010

Sissejuhatus

Selle blogi ülesandeks on jagada kogemusi, mis on tekkinud enam kui 10 aasta jooksul, mil ma olen PHP-ga kokku puutunud. Esimeseks PHP variandiks oli 3.0.6 ja andmebaasina kasutasin Oraclet (!). Hiljem on PHP versioonid muutunud, andmebaasina olen ikka kasutanud MySQL-i, mis ka muutunud 3-st versioonist 5-ks, sisuliselt on aga tegu ikka sellesama PHP ja MySQL-iga. Seega võiks blogi nimeks olla pigem "PHP & MySQL koolitus", kuid jätan esialgu nime selliseks nagu on.

Koolitus ei ole mõeldud päris algajale, vaid pigem nendele, kelle on juba olemas esmane kogemus ning tahavad teada, kuidas paremini edasi minna.

Lisaks: kõik allolev ja ülalolev ja muidu selles blogis on rangelt minu isiklik arvamus läbi minu subjektiivse pilgu ning kindlasti ei kandideeri ma absoluutse tõe kuulutajaks. Niiet kui kellelgi on ültemist, siis see pole absoluutselt keelatud, kuid ma jätan endale õiguse kas nõustuda või mitte nõustuda vaideljaga.
Samas tahaks rõhutada, et ma pole töötanud PHP programmeerijana, pigem on see olnud mulle hobi, mis ei muuda olematuks kogemusi selle keele osas.

Ajalugu

Kes tahab täpsemalt uurida PHP ajalugu, siis võib alustada siit. Minu jaoks on selle arengus olnud olulised järgmised etapid:
  • PHP-ga tutuvmine, MySQL-iga tutuvmine
  • LAMP- Apache, MySQL-i ja PHP kokkukompileerimine ühtseks tervikuks
  • PHP versioon 4.1 - superglobalite ($_GET, $_POST jt) tulek, $GLOBALS ärakadumine (loodan, et kirjutasin selle nüüd õigesti, pole ammu kasutand :)).
  • MySQL 4.1 - TIMESTAMP formaadi muutus
  • PHP 5.0 - objektimudel muutus, lisaks objekti edasiandmine mäluviibana, mitte eraldi objektina

Miks on PHP populaarne?

Eks sellele ole ka piisavalt proovitud leida (vastuseid võib leida näiteks siit ). Enda jaoks olen selle lahti mõtestanud järgmiselt:
  • C-laadne lähenemine keele ehituses (enamus skriptikeeli kasutab sellist lähenemist)
  • tasuta
  • lihtne paigaldada
  • lihtne alustada
  • tulemus on kohe näha
  • piisavalt suur programmeerijate kogukond
  • suur toetus hostingumasinates
  • võimalus laiendada ja liidestada väga erinevate süsteemidega (ise olen oma töö tõttu pidanud liidestama SAP majandustarkvaraga ja see oli täiesti võimalik)

Nõrkused

Keeleliselt on kõige suuremaks puuduseks muutujate tüpiseerimise ebamäärasus. Muutujad luuakse siis, kui neile osundatakse. Muutujad võivad muuta oma tüüpi ka programmi töö käigus, mis raskendab koodist arusaamist. Loomulikult on võimalik seda minimeerida, kasutades alati muutujaid ühe tüübi piires ning neid alati õige tüübiga algväärtustades.
Teiseks suureks nõrkuseks on aga populaarsusega seotud aspektid. Kuna ta on lihtne, kergesti installeeritav ja kiirelt kasutuselevõetav, on ka päris palju programmeerijaid, kes suudavad genereerida väga halba koodi. Just selliste "programmeerijate" tõttu on PHP maine kohati madal. Samuti on viidatud jõudlusele, kuid kui vaadata ilmas ringi, siis Facebook on kirjutatud PHP-s, Eesti suurimad portaalid (Delfi, Postimees jt) kasutavad PHP-d, rääkimata Rate.ee-st. Seega pole asi mitte sisse-ehitatud viletsast perfomance-st kuivõrd halvast koodist.

Järgmises peatükis vaataks üle erinevad võimalused failide, eelkõige siis PHP failide, poole pöördumisel.