PHP pro pokročilé – funkce pro práci s funkcemi

19. února 2004

Tímto článkem bych rád začal sérii, která by se měla zabývat pokročilejšími technikami v PHP. Postupně probereme funkce pro práci s třídami, objekty, ukážeme si použití COM a Windows API, a také si rozebereme některé méně známé knihovny. V tomto článku vám předvedu několik tipů pro práci s funkcemi.

Funkce v proměnných

Předně si ukážeme použití „funkce v proměnných“. Uvedeme si raději ihned příklad (efekt je stejný, jako když napíšeme Napis($string);):

<?
function Napis($text) {
 echo $text;
}
$string=“HELLO WORLD“; // nadefinujeme si pokusný řetězec
$nase_funkce=“Napis“; // vytvoříme si funkci v proměnné
$nase_funkce($string); // proměnná se zde chová jako funkce; vypíše se text v uvozovkách.
?>

K čemu nám ale takové konstrukce jsou? Představme si, že máme více podobných funkcí, příkladem jsou známé funkce pro zobrazení obrázku ImageJPEG(), ImagePNG nebo ImageGIF(). S tím úzce souvisí i poslání hlavičky Header, která prohlížeči sdělí typ přenášených dat. Nyní chceme co nejjednodušším způsobem skriptu říci, který typ souboru chceme vytvořit. Není nic jednoduššího než využít naší konstrukce:

<?
function Obrazek($typ) {
  // připravíme si jméno funkce
  $fce_VytvorImage=“Image“.$typ;
  // zkontrolujeme existenci funkce (viz. dále)
  if (function_exists($fce_VytvorImage)) {
   // vytvoříme si pokusný obrázek o rozměrech 200×200
   $imagestream = ImageCreateTrueColor(200,200);
   // odešleme hlavičku
   Header(„Content-Type: image/“.$typ);
   // nakonec odešleme samotný obrázek.
   $fce_VytvorImage($imagestream);
  }
}
Obrazek(„PNG“); // zavoláme si funkci, která odešle obrázek požadovaného typu
?>

Rozhodně to vypadá lépe, než pomocí kontrukce „if-then-else“ testovat, zda uživatel zadal PNG, GIF nebo jiný typ obrázku. Navíc je tato konstrukce mnohem univerzálnější v případě, kdy se do PHP budou integrovat nové grafické formáty. Pak bude stačit změnit jenom parametr funkce „Obrazek“ a funkce nám ihned odešle obrázek nového typu.

U tohoto příkladu vidíte použití první funkce pro práci s funkcemi function_exists(), která testuje existenci zadané funkce. Na vstupu je jméno testované funkce a na výstupu hodnota „TRUE“, pokud funkce existuje, jinak „FALSE“. Když se zadá parametr, například „EXE“, vrátí „FALSE“, protože funkce ImageEXE neexistuje.

Tvorba funkcí za běhu skriptu

PHP umožňuje „poskládat“ si vlastní funkci za běhu skriptu a tu v témže skriptu ještě spustit. Těmto funkcím se říká anonymní lambda-style funkce a můžeme je vytvářet pomocí funkce create_function(). Funkce má dva argumenty – prvním jsou argumenty naší budoucí funkce a druhý je kód této funkce. Uvedeme si jednoduchý příklad:

 // vytvoříme funkci soucet($a,$b)
$soucet = create_function(‚$a,$b‘, ‚return $a+$b;‘);
 // napíše se 30
echo $soucet(10,20);

První řádek je stejný jako obyčejný zápis funkce.

function soucet($a,$b) {
  return $a+$b;
}

V dalším příkladu si vytvoříme funkci, která setřídí všechny prvky pole. Zde se nám bude hodit funkce usort(), která třídí prvky pole pomocí námi definované funkce. Na vstupu je pole a funkce a na výstupu setříděné pole. Naše funkce musí vracet některou z číselných hodnot x<0 (první proměnná je menší než druhá), x=0 (proměnné jsou stejné) nebo x>0 (první proměnná je větší než druhá).

 // vytvoříme si pokusné pole se čtyřmi prvky
$pole = array („aa“,“aaaa“,“a“,“aaa“);
usort($pole, create_function(‚$a,$b‘,’return strlen($b) – strlen($a);‘));

Funkce usort() předá definované funkci vždy dva prvky pole, a podle toho, jaké číslo naše funkce vrátí, setřídí pole.

Další speciální funkce

Zde si uvedeme další funkce, které se mohou hodit ve funkcích, v nichž předem neznáme počet argumentů. Ještě upozorním, že následující funkce mohou být použity pouze uvnitř našich funkcí, jinak dojde k chybě.

  • func_get_arg() – vrátí n-tou položku ze seznamu argumentů (začíná se od 0)
  • func_get_args() – vrátí pole obsahující seznam argumentů funkce
  • func_num_args() – vrátí počet argumentů předaných funkci

Vytvoříme si zjednodušenou funkci Array(), která bude kontrolovat, zda jsme zadali pouze čísla, a pokud ano, vytvoří pole z nich, jinak vypíše chybu.

<?
Function NasArray() {
  $PocetArg=func_num_args(); // zjistíme si kolik bylo zadáno argumentů
  for ($n=0; $n<$PocetArg; $n++) { // projdeme všechny argumenty
   if (is_numeric(func_get_arg($n))) { // otestujeme argument, zda se jedná o číslo
    $Pole[$n] = func_get_arg($n); // přidáme argument do pole
   } else {
    die („ARGUMENT S INDEXEM „.$n.“ – „.func_get_arg($n).“ NENÍ ČÍSLO!“); // když se nejedná o číslo, napíšeme chybu a skript ukončíme
   }
  }
  return $Pole;
}
$pole1 = NasArray(„1″,“2″,“3″,“4″,“5“); // vytvoříme pole; vše je v pořádku
$pole2 = NasArray(„1″,“2″,“3″,“slovo“); // vyskytne se nám chyba
?>

A to je pro tentokrát vše.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek Java a 3D grafika - primitiva
Další článek sachy.sk
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *