TechNET: Developer · Mobilmánia · Wapko * EASY www.dobijanie.sk *
MAJACIK HLAVNY IMAGE STRANKY
30. Januára 2003, Štvrtok 
Lekcia 4 - Riadiace štruktúry
 

Štábna kultúra:

Túto kapitolu som sem zaradil schválne, nakoľko si to žiada situácia. Zo všeobecných skúseností je známe, že najme odporúčania týkajúce sa úpravy programov vyvolávajú nechuť a odpor. Pokiaľ však chceme písať väčšie programy, je nutné zaviesť nejaký poriadok a ak už nejaký zaviesť, tak je zbytočné vymýšľať už vymyslené. Takmer za každým odporučením skúsim uviesť aj príklad.

ü      Odsazujte o 2 medzery každý logický úsek programu

 if  ($x == $y)  {
                    echo ‘Hello’;
                  }
                  else {
                     echo ‘Ahoj’;
            }

ü      Nezabúdajte vkladať prázdne riadky, zlepšujú čitateľnosť programu

 ü      Unárne operárory neoddeľujte od operandu medzerou!

   $i++;
               $j +   = --$i;  // zle !

ü      Ľavá zložená zátvorka označujúca blok je vždy v riadku sama. Podobne aj ukončujúca zložená zátvorka. Úvodná zátvorka môže byť spolu s if, else, for, while, switch, return.

 

            function Is_Index()
            { 
                // tu je vhodny priestor na komentare
                echo (“Hello”);
            }

     ü      Každý výraz (priradenie) na samostatný riadok. Výnimku tvoria príkazy s tesnou súvislosťou.

            x  = GetPositionX; y = GetPositionY;

ü      Mená objektov, premenných či funcií píšte zásadne malými písmenami (prípadne prvé veľké – to je moja odchýlka od normy, budem sa ďalej snažiť). Využívajte podtrhovník. Nepoužívajte podobné identifikátory a identifikátory odlíšené len veľkosťou písma (syst, ssyt, Meno,meno).

ü      Mená objektov musia mať význam, napr. meno a nie m1. Ak sa ku programu neskôr vrátite, nemusíte zabiť 30 minút dumaním, čo premenná x1zf4 vlastne znamená. Nehovorím už o prípadných spolupracovníkoch, ktorí majú chuť vraždiť pri lúštení Vášho špagetového kódu.

ü      Tvorte mená racionálne, podľa určitého predpisu, napr:

view_file, print_file, Get_Your_Name()  

ü      využívajte tzv. prefixy napr C – class, O – object, a – atribút, T – typ, R – record F-pole, P-pointer

ü      Bežne používané významové identifikátory

i,j,k      -           indexy, parametre cyklu

c,ch      -           znaky

m,n      -           čítače

f,r         -           reálne čísla

p          -           pointer

s           -           reťazec

ü      Nezabúdajte na komentáre  

1.2       Podmienený výraz

Podmienený výraz je tiež novinkou, ktorá sa v jazyku Pascal nevyskytuje. Patrí medzi ternárne operátory, čo znamená, že má až tri operandy. Podmienený výraz je zároveň jediným ternárnym operátorom, ktorý PHP podporuje. Jeho syntax je nasledujúca:

                                    výraz_podmienka    ?   výraz_1  :  výraz_2

A má význam: if výraz_podmienka then výraz_1 else výraz_2, čiže výsledná hodnota výrazu je buď výraz_1 alebo výraz_2, čo závisí na hodnote (pravdivosti) výrazu výraz_podmienka. Na objasnenie malý príklad:  

Príklad 1
 

<?php
$i=$j=$k=10;
$i=($j==10) ? 1:3; // i bude 10 
$k=($i>$j) ? $i:$j;// k bude maximum z i a j, teda 10
echo "Maximum z $i a $j je $k";
?>

Nezabudnite, že z výrazu sa stane príkaz, ak ho ukončíte bodkočiarkou!

( $i == $j) ? $i++ : $j++ ;


Väčšinou sa podmienený výraz nepoužíva, nakoľko klasická konštrukcia if-then-else je čitateľnejšia, ale ako som už viackrát spomenul, neplatí to vždy.

1.3     Operátor čiarka 

Syntax operátora čiarka je jednoduchá – výraz1, výraz2. PHP spracováva najprv výraz1, zapamätá si jeho výsledok a potom spracuje výraz2. Operátor čiarka sa využíva len v riadiacich častiach príkazov for a while alebo u príkazov s tesnou súvislosťou (viď kapitola 4.1). Nezabudnite, že operátor čiarka má najnižšiu prioritu!

$meno = "Janko", $priezvisko ="Hraško" ;  // toto nie je operátor čiarka
$vek = ($vek++ , 0 – $vek);  //je nutné použiť zátvorku

1.4     Vetvenie programu         

Php ponúka dva príkazy, ktoré umožňujú vykonávať určitú časť skriptu podmienene. Slúžia na to príkazy if a switch v rôznych variáciách.

4.4.1 Príkaz if-else

Najjednoduchšia verzia použitia vetviaceho príkazu if je daná nasledujúcou syntaxou:

             if ( výraz ) príkaz ;

 V príklade vydelíme premennú $delenec premennou $deliteľ, ale len v prípade, že premenná $deliteľ sa nerovnä nule, aby nedošlo k deleniu nulou.

 if ( $delitel !=0 ) $podiel = $delenec / $delitel ;

PHP vyhodnocuje nulov[ premenn[ ako FALSE, takže nasledujúci zápis bude ekvivalentný:

if ( $delitel ) $podiel = $delenec / $delitel ;

V prípade viacerých príkazov použijeme zložené zátvorky, ktoré vytvoria tzv. blok alebo zložený príkaz.

if ( $delitel == $delenec )
{
   $vysledok = 1
   echo $vysledok;
}

Podobne môžeme použiť namiesto zložených zátvoriek aj syntax if – endif

if ( $delitel == $delenec )  :
   $vysledok = 1
   echo $vysledok;
endif;

Využíva sa to pri písaní scriptov, v ktorých sa prelína PHP s HTML kódom, čo sa deje skoro stále a často.

4.4.2 Príkaz if-else

Častejšie sa však stretávame so situáciou ak pri splnení posmienky potrebujeme vykonať činnosť A a pri nesplnení činnosť B. Nato slúži výborne príkaz if-else, ktorý má nasledujúcu syntax:

if ( výraz)
        príkaz_A ;
else
        príkaz_B
;           

Namiesto príkazov príkaz_A a príkaz_B môžeme použiť zložený príkaz, či už pomocou zložených zátvoriek alebo pomocou dvojbodky a endif. Nasledujúce konštrukcie majú preto rovnaký význam.

 if ( $delitel == $delenec )
{
   $vysledok = 1
   echo $vysledok;
}
else
{
   $vysledok = $delenec / $delitel;
   echo $vysledok;  
}

a pomocou if-else –endif

if ( $delitel == $delenec ) :
   $vysledok = 1;
   echo $vysledok;
 
else:  // dvojbodka je tu nutná
 
   $vysledok = $delenec / $delitel;
   echo $vysledok    ;
endif;

4.4.3 Príkaz if-elseif-else

Táto konštrukcia opäť rozširuje možnosti príkazu if. Príkaz uvedený za elseif sa vykoná, ak nie je splnená podmienka pre if a zároveň je splnená podmienka za elseif. Časť elseif môžeme použiť aj viackrát. Príkaz else sa vykoná len vtedy, ak nie je splnená žiadna podmienka elseif.

if ($a < $b) 
                echo ‘a je menšie ako b’;
elseif ($a == $b)
                echo ‘a a b sa rovnaju’;
else
                echo ‘a je v]43ie ako b’;

Môžeme používať aj zložené príkazy, či už pomocou zložených zátvoriek alebo dvojbodky a príkazu endif.

4.4.4 Príkaz switch

V prípade, že máme viac podmienkových vetiev, oplatí sa používať príkaz switch. Jeho syntax je nasledovná:

switch ( výraz1 )
{
                case HODNOTA A :
                     príkazA1;
                     príkazA2;
                     ......
                     break;
                case HODNOTA B :
                     príkaz B1;
                     príkaz B2;
                     ...
                     break;
          ...........
                default:
                     príkaz XXX1;
}

Ako to funguje? Najprv sa vyhodnotí výraz1 a potom sú postupne prechádzané hodnoty za case, až kým sa nenájde hodnota, ktorá sa rovná výrazu1. Následne sa vykonávajú príkazy, až kým sa nenarazí na príkaz break alebo koniec príkazu switch. Upozorňujem na to, že sa spracovávajú všetky príkazy (aj za case, pokiaľ sa nenarazí na break). Časť default sa vykoná vtedy, ak ani jedna hodnota sa nerovná výrazu1. Časť default je nepovinná.

switch ($pismeno)
{
  case "A" :
  case "a"  : echo "Pismeno A alebo a";
                     break;
  case "B" :
  case "b" : echo "Pismeno B alebo b";
                    break;
  default: echo "Nebolo to ani A, ani B";
}

Rovnaký význam má aj alternatíva s bodkočiarkou a endswitch.

switch ($pismeno) :
  case "A" :
  case "a"  : echo "Pismeno A alebo a";
                     break;
  case "B" :
  case "b" : echo "Pismeno B alebo b";
                    break;
  default: echo "Nebolo to ani A, ani B";
endswitch;
 
4.5  Cyklus 

Jazyk PHP podporuje používanie troch príkazov pre iteráciu while, for a do-while, ktoré majú podobnú syntax ako príkazy cyklu používané v jazyku PASCAL a C. Než ich vysvetlím, bude vhodné oboznámiť sa s príkazmi break  a continue, ktoré ovlyvňujú prevádzanie všetkých cyklov.

4.5.1 Príkaz break a continue

Tieto príkazy možno použiť pri všetkých typoch cyklov a obidva nejakým spôsobom menia normálny priebeh cyklu

break              ukončuje najvnútornejšiu neuzavretý cyklus – okamžite opúšťa cyklus

continue         skáče na koniec najvnútornejšieho neuzavretého cyklu a tým si vynúti ďalšiu iteráciu vnútorného cyklu – cyklus neopúšťa

Za príkazom break je v PHP nepovinný argument , ktorý udáva koľko cyklov bude ukončených. Využíva sa to v prípade viacerých vnorených cyklov.

4.5.2 Príkaz while

Tento iteračný príkaz testuje podmienky cyklu ešte pred prechodom cyklu, čo znamená že cyklus nemusí prebehnúť ani raz. Príkaz while používame, ak závisí ukončovacia podmienka na nejakom príkaze v tele cyklu. Zadaný cyklus sa teda prevádza len vtedy, ak je splnená podmienka na začiatku, preto sa mu aj hovorí cyklus s podmienkou na začiatku.

while (výraz) príkaz ;

Príkaz môže byť pravdaže nahradený zloženým príkazom, či už s použitím zložených zátvoriek alebo s dvojbodkou a kľúčovým slovom endwhile

$cislo = 0;
while ( $cislo < 10)
{
        echo $cislo ." <BR>" ;
        $cislo++ ;
}
 
$cislo = 0;
while ( $cislo < 10) :
        echo $cislo ." <BR>" ;
        $cislo++ ;
endwhile ;

ü      V prípade, že je príkaz while prázdny, odsadzujte bodkočiarku na nový riadok

            while ($cislo == 0)
                ;

 4.5.3 Príkaz do-while

 Tento príkaz je ekvivalent Paskalovského REPEAT-UNTIL. Podmienka sa tu testuje a6 po prechode cyklom, teda cyklus prebehne najmenej raz a hovorieva sa mu cyklus s podmienkou na konci.

do
{
            príkazy;
} while ( výraz) ;

K príkazu do-while neexistuje alternatívna syntax. Pozor! Medzi Pascalom a PHP je podstatný rozdiel vo vyhodnocovaní záverečnej podmienky. Pascal opúšťa cyklus pri splnení záverečnej podmienky, PHP práve naopak, pri jej nesplnení.         

do
  i++ ;
while ( i<100 );

ü      Pokiaľ do-while obsahuje zložený výraz, je vhodné písať podmienku while za uzatváracou zloženou zátvorkou “}” zloženého príkazu.

4.5.3 Príkaz for

Je príkaz cyklu, ktorý použijeme v prípade, že j epredom známy počet prechodov cyklom. Jeho syntax je nasledovná:

for (výraz1 ; výraz2; výraz3)   príkaz;

výraz1 je vyhodnotený pred začiatkom prevádzania cyklu. Potom je vyhodnotený výraz2. Aj je vrátené TRUE, prevádza sa telo cyklu príkaz. Na konci každého prechody cyklom sa vyhodnotí výraz3, čo sa deje tak dlho, pokiaľ má výraz2 hodnotu TRUE. Obvykle sa výraz1 používa na inicializáciu riadiacej premennej cyklu, výraz2 je podmienka prevádzania cyklu a výraz3 slúži na pravidelnú aktualizáciu riadiacej premennej cyklu. Skúsme vypísať čísla 1 až 100.

for  ($i = 1 ; $i < 10 ; $i++)
{
   echo $i ;
}
 
for  ($i = 1 ; $i < 10 ; $i++) :
   echo $i ;
endfor;

Namiesto jediného príkazu príkaz je možné použiť zložený príkaz v obidvoch povolených verziách buď s zloženými zátvorkami alebo dvojbodkou a endfor.

Takisto je možné používať operáciu čiarka, napríklad pri inicializácii riadiacej premennej cyklu.

for ($i=10 , $j =20; $i+$j <100; $i++, $j++);

4.6 Používanie knižníc

V jazyku PHP slúži na načítanie knižníc príkaz require a include. Knižnice sú vlastne skripty, prípadne časti stránok, ktoré používame vo viacerých skriptoch. Väčšinou obsahujú preddefinované funckie, prípadne hlavičky alebo pätičky stránok.

4.6.1 Príkaz require

Príkaz require slúži na načítanie skriptu. Na čítaný skript sa vykoná a potom PHP interpreter pokračuje ďalej vo vykonávaní pôvodného skriptu. Príkaz require sa však vykoná iba raz, ak by sme ho napríklad chceli použiť v cykle, je nutné použiť príkaz include. Syntax príkazu require  je nasledovná:

require “ meno_suboru “ ;

Pokiaľ u mena súboru neuvedieme cestu, PHP ho hľadá v  adresári určenom podľa direktívy include_path v konfiguračnom súbore php.ini (prípadne php3.ini v starších verziách PHP 3.x).. Nakoľko direktíva include_parh neobsahuje nič, ani bodku označujúcu aktuálny adresár, preto je nutné cestu explicitne určiť

require “./moja_kniznica.php”;

PHP pre Windows automaticky prekóduje lomítko na spätné lomítko

4.6.1 Príkaz include

Syntax príkazu je rovnaká ako u príkazu require:

include “ meno_suboru “ ;

Nezabudnite, že príkaz include je nahradený zloženým príkazom, ktorý PHP interpreter načíta z knižnice (vlastne to bude celý obsah knižnice). Preto je nasledujúca konštrukcia chybná:

for ($i =0 ; $i < 5; $i++)
                include ”/moja_kniznica.php”;

Správna je nasledujúca konštrukcia

for ($i =0 ; $i < 5; $i++)
{
                include “./moja_kniznica.php”;
}

alebo

for ($i =0 ; $i < 5; $i++) :
                include “./moja_kniznica.php”;
endfor;

4.7 Funkcie 

Ak sa v našich skriptoch opakuje určitá sekvencia príkazov, je vhodné túto sekvenciu príkazov nadefinovať ako funkciu. Potom stačí v mieste, kde chceme vykonať sekvenciu príkazov zavolať našu funkciu. Výsledkom je prehľadnejší, kratší a úspornejší kód. V takomto kóde je ľahšie sa orientovať a zároveň sa tu rýchlejšie hľadajú prípadné chyby. Definícia funckie je nasledovná:

function meno_funkcie (parameter1, parameter2,   ...   )
{

   príkazy
;
  
return hodnota ;
}

Pomocou parametrou predávame hodnoty, ktoré chceme spracovať. Príkazom  return funkcia vracia svoj výsledok. Pri jednoduchých funkciách môžeme parametre úplne vynechať, podobne ako návrat hodnoty príkazom return. Príklad jednoduchej funkcie:

function hlavicka ()
{
  echo "<H1> Dynamically generated by PHP </H1><BR>";
}

V našom programe môžeme kedykoľvek zavolať túto funkciu príkazom hlavicka ();

Zátvorky za názvom funkcie je nutné použiť aj v prípade, že funckia nemá žiadne parametre.

Hlavná sila funkcií však spočíva v používaní parametrov. Môžeme tak nadefinovať funkcie, ktoré PHP štandartne neobsahuje. Napríklad výpočet druhej mocniny čísla:

function Mocnina($cislo)
{
    return $cislo * $cislo ;
}
// hlavny program
echo "Druha mocnina cisla 5 je ".Mocnina(5);

V definícii funkcie hovorme, že funkcia Mocnina  má jeden parameter. Výsledok vrátime pomocou príkazu return. Funkcia môže mať pravdaže aj viac parametrov:

function Max ($a, $b)
{
  return $a > $b ? $a : $b ;
}

Pomocou funkcie Max() je možné zistiť, ktoré číslo je väčšie. Jeho parametre môžu byť konštanty Max(5,10), premenné Max($cislo1,$cislo2) alebo výrazy Max(5*5,100-25). Parametrom môžu byť všetky typy dát, ktoré PHP podporuje. Rovnako všetky podporované typy môže PHP aj vracať.

4.7.1 Premenné vo funkciách

V bežnom skripte je premenná s rovnakým názvom tou istou premennou a reprezentuje jednu hodnotu. Ak však používame funkcie, premenné, ktoré sú vo vnútri funkcie nemajú s ostatnými premennými nič spoločné, aj keď majú rovnaké meno. Je to preto, aby funkcia omylom nezmenila hodnotu globálnej premennej

function Vypocet()
{
   $cislo = 10;
}
 
$cislo = 0;
Vypocet();
echo $cislo

Tento skript by vypísal číslo 0. V prípade, že vo funkcii chceme ovlyvniť hodnotu globálnej premennej, je nutné na jej začiatku určiť, ktoré globálne premenné bude funkcia používať. Robí sa to pomocou kľúčového slova global.

function Vypocet()
{
   global $cislo;
   $cislo = 10;
}
 
$cislo = 0;
Vypocet();
echo $cislo;

Okrem príkazu global je možné použiť aj pole $GLOBALS, v ktorom má PHP uložené všetky globálne premenné. K poľu $GLOBALS pristupujeme ako k asociatívnemu poľu pomocou indexu, ktorý tvoí meno premennej bez znaku ‘$’.

function Vypocet()
{
   $GLOBALS["cislo"]= 10;
   $cislo = 10;
}
 
$cislo = 0;
Vypocet();
echo $cislo;

Ak potrebujeme, aby sa premenná pri prvom volaní funkcie inicializovala, je vhodné použiť kľúčové slovo static. Pri ďalších volaniach funkcie sa premenná $index zvyšuje, ale už nie od 0.

function Get_Index()
{
   static $index = 0;
   return $index++;
}

4.7.2 Predávanie parametrov pomocou odkazu

V predchádzajúcich príkladoch sme používali predávanie parametrov pomocou hodnoty. PHP však podporuje aj predávanie parametrov pomocou odkazu. Funkcia, ktorá používa predávanie parametra pomocou odkazu má rovnaký syntax ako ostatné funkcie, len pred parametrom je znak ampersand ‘&’. Objasní to príklad:

function Odkaz(&$a,$b)
{
  $a=0;
  $b=1
}
 
$m=100;
$n=200;
Odkaz($m,$n);
echo $m,$n;

 4.7.2 Parametre

Často sa stáva, že niektoré parametre sú nepovinné alebo impicitne definované. Na vysvetlenie použijem ríklad s mocninou. Povodná verzia rátala len druhú mocninu. Nový príklad bude mať štandartnú hodnotu parametra 2, ak pri volaní funkcie parameter nepoužijeme.

function Mocnina($cislo, $exponent=2)
{
  $pom=$cislo
  for ($i=1; $i < $exponent; $i++) $pom *= $zaklad;  
  return $pom ;
}
// hlavny program
echo "Druha mocnina cisla 5 je ".Mocnina(5);
echo "tretia mocnina cisla 5 je ".Mocnina(5,3);

Ako štandardné hodnoty parametrov je možné v PHP použiť iba skalárne typy: integer, double, string. Nie je možné používať polia ani objekty.

4.7.2 Rekurzia

V rekurzii ide vlatne o to, že v tele funkcie sa použije volanie tej istej funkcie. Rekurziou je možné skrátiť niektoré výpočtové algoritmy. Nebezpečenstvo však číha v možnosti pretečenia zásobníka, pri tzv. „utopení“ rekurzie. Klasická rekurzia je výpočet faktoriálu“

function Faktorial($Fakt)
{
   return $Fakt == 0 ? 1 : $Fakt * Faktorial($Fakt – 1);
}

4.8 Eval, Die 

Príkaz eval má nasledujúcu syntax:

eval (reťazec); 

Obsah reťazca bude vykonaný akoby to bol príkaz PHP.

 eval ("echo \$text");

Príkazom Die () je možné kedykoľvek ukončiť vykonávanie skriptu. Podobne je možné použiť aj príkaz exit. Tento príkaz však je nutné používať opatrne, nakoľko pri kombinovanom používaní s HTML tagmi náš sript pri násilnom ukončení vygeneruje nekorektnú HTML stránku bez ukončovacích príkazov </BODY> a </HTML>. Preto je vhodnejšie volať funkciu Register_Shutdown_function().

4.9 Regulárne výrazy

Pomocou regulárnych výrazov je možné definovať masku, ktorá slúži na zisťovanie obsahu textových reťazcov. V PHP sú definované funkcie, ktoré slúžia na analýzu, kontrolu a separáciu textových reťazcov na základe regulárnych výrazov.

Pojednanie o regulárnych výrazoch bude uverejnené neskôr, nakoľko ide o dosť rozsiahlu a zložitú problematiku.








N Á V R A T

Copyright 2003 MGX


 
Dnes má meniny
Ema
nic.sk - domeny + hosting
PHP Club

Klub
 Registrácia
 Informácie
Special
 XML I diel
 
XML II diel
 
XML III diel
 
XML IV diel
 
XML V diel
 
XML VI diel
 
XML VII diel
 
XML VIII diel
 
XML IX diel
 
Anketa č. 21
Považujem sa za...
(Odpovedalo už 1579 ľudí)

PHP guru (157)
 10%
Perfektného programátora v PHP( 117)
 7%
Strednú triedu (373)
 24%
Začiatočníka (743)
 47%
Čo je PHP ? (189)
 12%

Klikni na zvolenú odpoveď!
Výsledky minulých ankiet.
 
Diskusia

PRÍSPEVKY
 Podľa tém
 Podľa dáta
 Podľa klikov
 Iba dnešné

UTILITY
 Registrácia
 Zmena hesla
 Zmena profilu

Dobré linky:
PC News
Developer
  (c) 2003 www.php.sk