6. PHP – funkcje – definiowanie własnych funkcji oraz zwracanie wartości przez funkcje. Funkcje wbudowane.


Funkcje

Funkcja to zbiór instrukcji, który posiada nazwę, zbiór argumentów (ale nie musi posiadać argumentów) i znajduje się pomiędzy nawiasami {}. Pozwala na wyodrębnienie fragmentu kodu programu w celu uniknięcia powtórzeń i może być wielokrotnie wywoływana w kodzie.

W celu zdefiniowania funkcji należy podać jej nazwę, argumenty i instrukcje:

function przykladowa_nazwa_funkcji ($argument1,$argument2,$argument3.........) 
{
instrukcja1; 
instrukcja2; 
instrukcja3......
}

Funkcje mogą zwracać konkretne wartości lub wyświetlać komunikat.

Aby wywołać funkcję wystarczy podać jej nazwę z nawiasami!

przykladowa_nazwa_funkcji(); // wywołanie funkcji w kodzie

echo i return

echo nie zwraca wartości tylko wyświetla wynik na ekranie;

return zwraca wartość, którą możemy później wykorzystać jako zmienną.

Przykład funkcji bez argumentów:

function wyswietl_tekst() // deklaracja funkcji bez argumentów
{
   echo "Witam serdecznie!";  // instrukcje do wykonania
}

wyswietl_tekst(); //ponieważ wewnątrz funkcji jest echo to dostaniemy napis: Witam serdecznie!

Przykład funkcji z argumentami:

function dodawanie($liczba1, $liczba2) 
{
   $wynik = $liczba1+$liczba2;
   echo $wynik;
}

dodawanie(2,3); //ponieważ wewnątrz funkcji jest echo to dostaniemy napis: 5

Przykład funkcji z return:

function dodawanie($liczba1, $liczba2) 
{ 
$wynik = $liczba1+$liczba2; 
return $wynik; 
} 
echo dodawanie(2,3);  // 5

Zasięg zmiennych

NIE POWINNO SIĘ KORZYSTAĆ ZE ZMIENNYCH GLOBALNYCH! z uwagi na niebezpieczeństwo ataków z zewnątrz lub nieplanowanej zmiany zadeklarowanej wcześniej zmiennej (są one zapamiętywane w tablicy superglobalnej $GLOBALS).

$zmienna_poza_funkcja = 'zmienna gdzieś w kodzie';

function wykorzystuje_zmienna_spoza_funkcji()
{
global $zmienna_poza_funkcja; //musimy dodac słowo "global" do zmiennej z kodu
echo 'To ja, '.$zmienna_poza_funkcja;
}

wykorzystuje_zmienna_spoza_funkcji();

Przykładowe funkcje

Funkcja formatująca przekreślenie

function skresl($text) {
        echo "<s>".$text."</s>";
}
echo "To jest tekst niesformatowany<br />";
skresl("to jest tekst przekreślony.");

Funkcja kantor przeliczająca wartość kupna EUR na PLN wg podanego kursu

function kantor($kurs, $kwota) {
    $wartosc=$kurs*$kwota;
    echo "Kupno ".$wartosc." PLN";
}
kantor($kurs= 4.3051, $kwota=10);
//można zapisać kantor(4.3051, 10);

Funkcja obliczająca silnię

function silnia($n) { 
   if($n==0) echo $silnia=1; 
   if($n==1) echo $silnia=1; 
   if($n>1) 
   { 
      $silnia= 1; 
      for($i=2; $i<=$n; $i++) {$silnia *= $i; } 
      return $silnia; 
   } 
} 
echo silnia(3);

Funkcja, która za pomocą znaków * (gwiazdki) narysuje trójkąt.

function rysuj_trojkat($n) {
   define('X', $n); //liczba musi być nieparzysta
   echo '<pre>';
   for ($w = 1; $w <= X; $w++)
   {
	for ($k = 1; $k <= X + $w; $k++)
	{
		if ($k == X + $w) echo "\n"; else
		if ($k > X - $w && $k < X + $w) echo '*';   
		else echo ' ';
	}
   }
   echo '</pre>';
}
rysuj_trojkat(15);

 

Funkcja, która za pomocą znaków * (gwiazdki) narysuje „koło”.

function rysuj_kolo($n) {
    define('R', $n); //liczba musi być nieparzysta
    echo '<pre>';    
    for($y=-R; $y<=R; $y++)
    {
        for($x=-R; $x<=R; $x++)
	{ 
	    if($x**2+$y**2<=(R+0.3)**2) echo '*'; 
	    else echo ' '; 				
	    echo ' ';			
	}   
	echo "<br>"; 
    }
    echo '</pre>';
}
rysuj_kolo(10);

Funkcja rysująca tabelę w HTML składająca się z podanej ilości wierszy i kolumn.

function rysuj_tabelę($wiersze, $kolumny) {
	echo "<table border=\"1\">";    
    for ($w = 1; $w <= $wiersze; $w++)    
	{
		echo "<tr>";
		for($k=1; $k<=$kolumny; $k++ ) {
			echo "<td>kolumna $k</td>";
		}
		echo "</tr>";
	}
    echo "</table>"; 
}	
rysuj_tabelę(4,5);

Funkcja rysująca tabliczkę mnożenia.

function tabliczka_mnozenia($liczba) {
	echo "<p>Tabliczka mnożenia</p><br />";
	echo "<table style=\"border-collapse: collapse\">";
	for($i=1; $i<=$liczba; $i++) 
	{
		echo "<tr>";
		for($j=1; $j<=$liczba; $j++) 
		{
			if (($i==1) || ($j==1)) 
			{
				echo "<td style=\"border: 1px black solid; background-color: black; color: white; text-align: center\">".$i*$j."</td>";
			} 
			else 
			{
				echo "<td style=\"border: 1px black solid; text-align: center\">".$i*$j."</td>";
			}
		}
		echo "</tr>";
	}
        echo "</table>";
}	
tabliczka_mnozenia(15);

Ciąg Fibonacciego PHP

function fibo($n) { 
  if($n<=2) echo($n.' elementem ciagu Fibonacciego jest 1');
  else
  {
	$f1=0; //wartość pierwszego elementu
	$f2=1; //wartość drugiego elementu
	$temp; //zmienna pomocnicza
	for($i=2;$i<=$n;$i++)
	{
		$fn=$f1+$f2;
		$f1=$f2;
		$f2=$fn;
		echo $fn; if($i<$n) echo ' ';
	}
	echo(';<br>'.$n.' elementem ciagu Fibonacciego jest '.$f2);
  } 
} 
fibo(10);

Funkcje wbudowane

Pełną listę funkcji znajdziecie w dokumentacji PHP,  poniżej najczęściej wykorzystywane.

Funkcje daty i czasu – opracowane w temacie PHP – obsługa daty i czasu

Funkcje operacji na ciągach – opracowane w temacie PHP. Łańcuchy znaków i wyrażenia regularne.

Funkcje operacji na katalogach – opracowane w temacie PHP – operacje na strukturze systemu plików

Funkcje operacji na plikach – opracowane w temacie PHP – Operacje na plikach

Funkcje tablicowe – opracowane w temacie PHP – operacje na tablicach

phpinfo()

Wyświetla informacje o konfiguracji serwera.

<?php phpinfo(); ?>

 

Funkcje obsługi zmiennych

Pełną listę funkcji znajdziecie w dokumentacji PHP,  poniżej najczęściej wykorzystywane.

 

empty()

ustala czy zmienna jest pusta.

$zmienna=0;
if (empty($zmienna)) { echo '$var jest równe zero, puste lub w ogóle nie zostało ustalone';}

Następujące wartości są uważane za puste:

  • „” (pusty ciąg)
  • 0 (0 jako integer)
  • 0.0 (0 jako float)
  • „0” (0 jako string)
  • NULL
  • FALSE
  • array() (pusta tablica)

 

gettype()

pobiera typ zmiennej

echo gettype(1);        //wyświetli integer
echo gettype(1.);       //wyświetli double
echo gettype(NULL);     //wyświetli NULL
echo gettype('tekst');  //wyświetli string

 

is_null()

ustala czy zmienna jest ustawiona na NULL

$zmienna=NULL;
echo is_null($zmienna) ? 'jest NULL' : 'nie jest NULL';

 

is_numeric()

sprawdza czy zmienna jest liczbą, lub liczbowym stringiem

echo is_numeric("42");     //wyświetli is numeric
echo is_numeric(1337);     //wyświetli is numeric
echo is_numeric("1e4");    //wyświetli is numeric
echo is_numeric(array());  //wyświetli is NOT numeric
echo is_numeric(9.1);      //wyświetli is numeric

 

isset()

Sprawdza czy zmienna została przesłana i nie jest NULL

$zmienna='';
echo isset($zmienna) ? 'zmienna została przesłana i nie jest NULL' : 'zmienna nie została przesłana lub jest NULL';

 

settype()

ustawia typ zmiennej

$zmienna1 = "5bar"; // string
$zmienna2 = true;   // boolean

settype($zmienna1, "integer"); // $zmienna1 jest teraz 5   (integer)
settype($zmienna2 , "string");  // $zmienna2 jest teraz "1" (string)

 

unset()

usuwa zmienną

$zmienna=5;
echo is_null($zmienna) ? 'jest NULL' : 'nie jest NULL';
unset($zmienna);
echo isset($zmienna) ? 'istnieje' : 'nie istnieje';

Funkcje matematyczne

Pełną listę funkcji znajdziecie w dokumentacji PHP,  poniżej najczęściej wykorzystywane.

 

abs()

Wartość bezwzględna (moduł z liczby)

echo abs(-4.2); // 4.2 (double/float)
echo abs(5);    // 5 (integer)
echo abs(-5);   // 5 (integer)

 

round()

Zaokrągla liczbę zmiennoprzecinkową

echo round(3.4);         // 3
echo round(3.5);         // 4
echo round(3.6);         // 4
echo round(3.6, 0);      // 4
echo round(1.95583, 2);  // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2);    // 5.05
echo round(5.055, 2);    // 5.06

 

ceil()

Zaokrągla ułamki w górę

echo ceil(4.3);       // 5; 
echo ceil(9.999);     // 10; 
echo ceil(-3.14);     // -3

 

floor()

Zaokrągla ułamki w dół

echo floor(4.3);       // 4; 
echo floor(9.999);     // 9; 
echo floor(-3.14);     // -4

 

hypot()

Oblicza długość przeciwprostokątnej trójkąta prostokątnego. hypot() zwraca długość przeciwprostokątnej trójkąta prostokątnego, o długościach przyprostokątnych x i y, lub odległość punktu o współrzędnych (x, y) od początku układu współrzędnych. Jest to równoważne wyrażeniu sqrt(x*x + y*y).

echo hypot(20,21); //29

 

log()

Logarytm naturalny. Jeśli opcjonalny argument podstawa został podany, log() zwraca logpodstawaargument, w przeciwnym przypadku log() zwraca logarytm naturalny z argument.  

echo log(1000000,10); //6

 

pi() lub M_PI

Funkcja pi() wyświetla wartość liczby Pi, tą samą wartość można wywołać używając stałej wbudowanej M_PI.

echo pi(); // 3.1415926535898
echo M_PI; // 3.1415926535898

 

pow()

potęgowanie.

number pow ( number $podstawa , number $wykładnik )
echo 2**3;     //8
echo pow(2,3); //8

 

sqrt()

Pierwiastek kwadratowy.

echo sqrt(9); // 3 
echo sqrt(10); // 3.16227766 ...

 

max() i min()

max() znajduje największą liczbę, a min() najmniejszą.

PHP będzie uznawał nieliczbowe wartości typu string jako 0, jednakże zwracany będzie ciąg znakowy, jeśli zostanie on uznany numerycznie za największą/najmniejszą wartość. Jeśli wiele argumentów zostanie uznanych za wartość 0, to max()/min() zwróci wartość największą/najmniejszą alfanumerycznie, jeśli zostały podane jakiekolwiek ciągi znakowe. W przeciwnym przypadku zwrócona zostanie wartość 0.  

echo max(1, 3, 5, 6, 7);  // 7
echo max(array(2, 4, 5)); // 5
echo max(0, 'hello');     // 0
echo max('hello', 0);     // hello
echo max(-1, 'hello');    // hello

// W przypadku podania wielu tablic, max porównuje je od lewej do prawej, a więc w poniższym przykładzie 2 == 2, ale 4 < 5
print_r($val = max(array(2, 4, 8), array(2, 5, 7))); // wyświetli tablicę array(2, 5, 7)
// Jeśli podane zostaną tablice i nie-tablice, zawsze zwracana jest tablica, jako że zawsze jest uznawana za element największy
print_r($val = max('string', array(2, 5, 7), 42)); // wyświetli tablicę array(2, 5, 7)



echo min(1, 3, 5, 6, 7); // 1 
echo min(array(2, 4, 5)); // 2 
echo min(0, 'hello'); // 0 
echo min('hello', 0); // hello 
echo min(-1, 'hello'); // -1 

// W przypadku podania wielu tablic, max porównuje je od lewej do prawej, a więc w poniższym przykładzie 2 == 2, ale 4 < 5 
print_r($val = min(array(2, 4, 8), array(2, 5, 7))); // wyświetli tablicę array(2, 4, 8) 
// Jeśli podane zostaną tablice i nie-tablice, zawsze zwracana jest tablica, jako że zawsze jest uznawana za element największy 
print_r($val = min('string', array(2, 5, 7), 42)); // wyświetli string

 

deg2rad()

Przelicza stopnie na radiany.

echo deg2rad(45); //0.785398163397

 

rad2deg()

Przelicza radiany na stopnie.

echo rad2deg(0.785398163397); //44.999999999974

 

Funkcje trygonometryczne

sin()

Oblicza sinus kąta. Kąt musi zostać podany w radianach.

echo sin(deg2rad(60)); //  0.866025403 ...
echo sin(60);          // -0.304810621 ...

 

cos()

Oblicza cosinus kąta. Kąt musi zostać podany w radianach.

$stopnie=360;
echo cos(deg2rad($stopnie)); //1

 

tan()

Oblicza tangens kąta. Kąt musi zostać podany w radianach.

$stopnie=60;
echo tan(deg2rad($stopnie)); //1.7320508075689

 

Funkcje związane z losowaniem

rand() i mt_rand()

rand() generuje losową liczbę stałoprzecinkową, mt_rand() generuje lepsza liczbę losową, funkcja ta jest szybsza od rand().

echo rand();      //7771
echo rand();      //22264
echo rand(5, 15); //11

echo mt_rand();      //1604716014
echo mt_rand();      //1478643278
echo mt_rand(5, 15); //6

 

getrandmax() i mt_getrandmax()

Pokazuje największą możliwą do wylosowania przez funkcję rand() lub mt_rand() liczbę. mt_getrandmax() jest szybsza.

echo getrandmax(); //2147483647

echo mt_getrandmax(); //2147483647

 

Konwersja liczb

base_convert()

Konwertuje liczbę pomiędzy różnymi systemami liczbowymi. Może tracić precyzję przy dużych liczbach!

$hexadecimal = 'a37334';
echo base_convert($hexadecimal, 16, 2); //wyświetli 101000110111001100110100

bindec()

Konwertuje liczbę dwójkową na dziesiętną. Podana liczba musi być stringiem, czyli w ”

echo bindec('110011');    //wyświetli 51
echo bindec('000110011'); //wyświetli 51
echo bindec('111');       //wyświetli 7

decbin()

Konwertuje liczbę dziesiętną do dwójkowej.

echo decbin(12);    //wyświetli 1100
echo decbin(26);    //wyświetli 11010

dechex()

Konwertuje liczbę dziesiętną do szesnastkowej.

echo dechex(10);    //wyświetli a
echo dechex(47);    //wyświetli 2f

hexdec()

Konwertuje liczbę szesnastkową do dziesiętnej.

echo hexdec("to"); //wyświetli 0 
echo hexdec("a0"); //wyświetli 160

decoct()

Konwertuje liczbę dziesiętną do ósemkowej.

echo decoct(15);     //wyświetli 17
echo decoct(264);    //wyświetli 410

octdec()

Konwertuje liczbę ósemkowej do dziesiętnej.

echo octdec(17);     //wyświetli 15
echo octdec(410);    //wyświetli 264

 

Funkcja mail

mail()

Wysyłanie poczty elektronicznej.

bool mail ( string $do , string $temat , string $treść [, string $dodatkowe_nagłówki [, string $dodatkowe_parametry ]] )

Dokładny opis funkcji mail() dostępny na stronie dokumentacji PHP

mail('osoba@example.com', 'Temat wiadomości', 'Treść wiadomości');

Zadania:

  1. Napisz funkcję, która przyjmuje 3 argumenty: 2 z nich to liczby, a trzecia to znak operatora arytmetycznego. Funkcja ma wykonać działanie na liczbach w zależności od wprowadzonego znaku np. 1,2,+ wykona dodawanie, 5,6,** wykona potęgowanie itd. Tam gdzie to możliwe wykorzystaj funkcje wbudowane.
  2. Napisz funkcję, która dla 3 losowo wygenerowanych liczb sprawdzi, czy są one pitagorejskie (czyli spełniają warunek: a2+b2=c2). Jeżeli tak to ma wyświetlić „Wylosowane liczby są liczbami pitagorejskimi”, w przeciwnym wypadku odwrotny komunikat.
  3. Napisz funkcję, która wyświetli na ekranie wszystkie trójki pitagorejskie z zakresu podanego przez użytkownika. (np. dla zakresu od 1-10 sprawdzamy trójki: 1 2 3; 2 3 4; 3 4 5; 4 5 6 itd)
  4. Napisz funkcję obliczającą cenę brutto dla podanej ceny netto i stawki vat. Wyświetl: cena netto, wartość vat, cena brutto.
  5. Napisz funkcję showName wyświetlającą imię przekazane do niej jako argument.
  6. Napisz funkcję o nazwie checkNumber, która zwraca prawdę (true), jeżeli przekazany argument jest mniejszy od zera.
  7. Przygotuj funkcję, która jako argument przyjmuje liczbę i zwraca prawdę, jeśli liczba jest podzielna przez 5 i 7.
  8. Przygotuj program, który podaną przez użytkownika kwotę pieniędzy (liczba całkowita) rozmieni na jak najmniejszą ilość monet i banknotów o nominałach 1, 2, 5, 10 złotych
  9. Napisz funkcję rekurencyjną i zwykłą obliczający silnię dowolnej liczby.
  10. Napisz skrypt z użyciem pętli for wyświetlający:
    *
    **
    ***
    ****
    *****
  11. Napisz skrypt z użyciem pętli for wyświetlający:
    *
    **
    ***
    ****
    *****
    ****
    ***
    **
    *

  12. Napisz funkcję obliczającą pole trójkąta równobocznego.
  13. Napisz funkcję iloczyn zwracającą iloczyn dwóch liczb przekazanych jako argumenty.
  14. Napisz funkcję o nazwie czyUjemna, która zwraca prawdę (true), jeżeli przekazany argument jest mniejszy od zera.
  15. Napisz funkcję, która jako argument przyjmuje liczbę i zwraca prawdę, jeśli liczba jest podzielna przez 3 i 5.
  16. Napisz funkcję BMI, obliczającą indeks masy ciała z dwóch wartości: masy i wzrostu przekazanych jako
    argumenty. Do obliczeń użyj następującego wzoru: BMI=masa(kg)/(wzrost(m)*wzrost(m)). Funkcja ma
    wyświetlać trzy komunikaty zależne od indeksu BMI:
    • BMI < 18,5: „Masz niedowagę”
    • 18,5 < BMI < 24,99: „Twoja waga jest prawidłowa”
    • BMI > 25,00: „Masz nadwagę!!!”
  17. Napisz funkcję zwracającą średnią arytmetyczną liczb przekazanych jako tablica do funkcji.
  18. Napisz funkcję pobierającą dwa argumenty: kolor w formie heksadecymalnej oraz napis. Funkcja ma
    umieszczać na stronie napis w kolorze przekazanym jako argument.
  19. Napisać funkcję o nazwie DzielenieTekstow (o 1 parametrze: $wyrazenie_zlozone), która jako parametr przyjmuje zmienną $wyrazenie_zlozone; w parametrze powinien być wczytany do funkcji ciąg znaków (tekst) postaci:
    pojedyncze wyrażenia oddzielone przecinkami:
    (np. „Komputer,Serwer,Router,Klawiatura,Mysz,Karta sieciowa,Monitor,Zasilacz”).
    Funkcja ma za zadanie wypisać każde pojedyncze wyrażenie znajdujące się w zmiennej $wyrazenie_zlozone w osobnej linii.
    Dodatkowo, przy wypisywaniu muszą być spełnione następujące założenia:
    1. Pierwsze i ostatnie pojedyncze wyrażenie mają być wypisane dużymi literami.
    2. Wszystkie pojedyncze wyrażenia (poza pierwszym i ostatnim), zawierające więcej niż 7 znaków należy wypisać małymi literami oraz jako pogrubione.
    Ostatecznie funkcja zwraca ilość pojedynczych wyrażeń, które wystąpiły w zmiennej $wyrazenie_zlozone.