Kako funkcioniraju funkcije u php-u. Pozivanje funkcija putem varijabli

dakle, na čemu je funkcija (funkcija).PHP?

funkcija (funkcija) ovo je mini-program koji izvodi neke korisne radnje i daje gotov rezultat.
Pogledajmo šemu:

Pokušajmo napisati mini program koristeći gotov predložak funkcije.
Spreman predložak funkcije:

Recimo da treba da napišemo funkciju koja može izračunati zbir brojeva 5 i 2. Gledamo šablon i pišemo:

Hajde da razbijemo kod.
funkcija suma() je funkcija pod nazivom suma;
echo 5+2; - u tijelu funkcije naznačili smo da se brojevi 5 i 2 moraju sabrati (5 + 2) ;
summa(); - pozovite funkciju. Pozvati funkciju znači izvršiti je. Odnosno, zadatak 5 + 2 mora biti završen i dati rezultat 7 .

Pokušajmo sada razmotriti funkcije u fazama.

Koraci za kreiranje funkcije u PHP-u

StageI. Kreiranje funkcije
Zapamtite gotov predložak funkcije:

Ovako se kreira funkcija u PHP-u.
Napišimo tekst u tijelo funkcije " Drago mi je da vas vidim na blog stranici».
Samo ne zaboravite: tekst pišemo kroz .

"; } ?>

Sada moramo pozvati funkciju "site()".

StageII. Pozivanje gotove funkcije uključenoPHP
Funkcija je kreirana i sada bi se trebala izvršiti. Za izvršenje i izlaz funkcije, dovoljno je navesti “function name (); »

web stranica();

To će izgledati ovako:

PHP funkcije - stranica "; ) site(); ?>

Možete to uraditi i ovako:

PHP funkcije - stranica "; ) ?> Puno teksta....Gomila teksta....

Unesite adresu u pretraživač:

rezultat:

PHP funkcije sa argumentima

Svi primjeri sa funkcijama iznad su bili bez argumenata. Šta je argument, objasniću vam u kodu:

Tako sam kreirao funkciju pod nazivom "site". U parametrima (gdje su zagrade) napisao sam dvije varijable $a i $b odvojene zarezima.

Funkcijska stranica ($a, $b)

$a i $b su dva argumenta.
echo "$a + $b = "; - evo donio sam tekst na monitor. Rezultat: 5 + 5 =
eho $a + $b; - ovdje sam rekao funkciji da promjenljive $a i $b treba sabrati.
lokacija(15, 5); - zove se funkcija. Pažnja: u zagradama sam naznačio dva argumenta (15, 5) koje varijabla $a i $b čekaju. Varijabla $a će primiti prvi argument - 15 , $b - drugi 5 .

Za one koji ne razumiju gdje se argument zamjenjuje i kojim redoslijedom, evo šeme:

Dakle, evo gotovog koda:



Sačuvajte kao "function.php" u folderu "test-1" lokalnog servera (pogledajte lekciju 1).

Unesite adresu u pretraživač:

https://localhost/test-1/function.php

rezultat:

Dozvolite mi da malo zakompliciram funkciju i učinim je zanimljivijom. Argumentu ću dodati adresu bloga i napisati naziv veze.

Funkcija pod nazivom “site” će primiti argument https://site/ u varijabli $link, a varijabla $title će primiti tekst veze - “ Blog sajt - kreiranje sajta!»

Gotov kod:



Sačuvajte kao "function.php" u folderu "test-1" lokalnog servera (pogledajte lekciju 1).

Unesite adresu u pretraživač.

Da biste pisali PHP programe koji su više od samo nekoliko stranica koda, a u isto vrijeme zgodno organizirani, morate savladati koncept funkcije. Funkcije će vam uštedjeti nevolje ponavljanja istih dijelova koda iznova i iznova u vašim programima. Da biste dobili funkciju, morate dodijeliti naziv dijelu koda, koji se zove ime funkcije. Nakon toga, ovaj fragment se može izvršiti upućivanjem na njega pod ovim imenom.

Osnovna sintaksa za korištenje (ili pozivanje) funkcije prikazana je u nastavku:

Ime_funkcije(izraz_1, izraz_2, ...,izraz_n)

Ova struktura uključuje ime funkcije praćeno zagradama, zarezima razdvojenim popisom ulaznih izraza (koji se nazivaju stvarni parametri funkcije). Funkcije se mogu pozivati ​​sa nula ili više stvarnih parametara, ovisno o njihovim definicijama.

Kada PHP interpreter otkrije poziv funkcije, svaki izraz dat kao stvarni parametar se prvo evaluira, a zatim se rezultirajuće vrijednosti koriste kao ulaz za tu funkciju. Nakon što funkcija završi s izvršavanjem, povratna vrijednost (ako postoji) postaje rezultat cijelog izraza s pozivom funkcije.

PHP ima stotine ugrađenih funkcija. Svi dole navedeni primjeri su valjani pozivi PHP-ovim ugrađenim funkcijama:

Pozivanje ugrađenih PHP funkcija kvadrat(9); // Pozivanje funkcije kvadratnog korijena, što // rezultira vrijednošću 3 rand(10, 10 + 10); // Vraća nasumični broj od 10 do 20 strlen("U ovom nizu ima 24 znaka"); // Vraća vrijednost 24 pi(); // Vraća približnu vrijednost broja "pi"

Svaki poziv funkcije je PHP izraz, tako da (kao i kod svakog drugog izraza) postoje samo dva razloga zbog kojih biste mogli da uključite poziv funkcije u svoj kod: da biste dobili povratnu vrednost ili da biste kreirali sporedni efekat.

Povratna vrijednost funkcije je vrijednost samog izraza s pozivom funkcije. Rezultirajuća vrijednost se može koristiti za izvođenje potpuno istih radnji za koje se koriste rezultati evaluacije bilo kojeg drugog izraza. Na primjer, takva vrijednost se može dodijeliti varijabli:

PHP kod $my_pi = pi();

Druga opcija je da se rezultat može ugniježditi u složenijim izrazima, kao u sljedećem primjeru:

PHP kod $približno = sqrt($približno) * sqrt($približno);

Funkcije se također mogu koristiti za stvaranje svih vrsta nuspojava, uključujući pisanje podataka u datoteke, manipulaciju bazama podataka i prikazivanje informacija u prozoru pretraživača. Savršeno je prihvatljivo koristiti povratne vrijednosti i istovremeno stvarati nuspojave, na primjer, vrlo je uobičajeno da funkcija koja stvara nuspojavu vrati vrijednost koja pokazuje da li je funkcija bila uspješna.

Rezultat izvršavanja funkcije može biti bilo kojeg tipa, tako da se nizovi naširoko koriste kao način za vraćanje više vrijednosti iz funkcije odjednom.

Definiranje vlastitih funkcija

PHP jezik vam omogućava da radite bez korisnički definisanih funkcija. Pomoću ovog jezika možete kreirati zanimljive i korisne web stranice koristeći osnovne jezičke konstrukcije i veliki skup ugrađenih funkcija. Ali ako ustanovite da datoteke koda postaju sve duže i teže za čitanje, a održavanje sve teže, onda to može biti znak da trebate početi omotati dio koda u obliku funkcija.

Funkcija je način stiliziranja dijela koda i davanja mu imena tako da se dio kasnije može koristiti sa samo jednom linijom koda. Funkcije su najkorisnije kada kod koji sadrže treba da se koristi na više od jednog mesta, ali takođe mogu pomoći u situacijama jednokratne upotrebe, jer kod sa funkcijama postaje mnogo lakši za čitanje.

Definicije funkcija imaju sljedeći oblik:

Funkcija ime-funkcije ($argument-1, $argument-2, ..) (naredba-1; izjava-2; ...)

To znači da se definicije funkcije sastoje od sljedeća četiri dijela:

    Ključna riječ funkcija.

    Ime koje treba dati funkciji.

    Lista parametara funkcije - imena varijabli sa prefiksom za dolar, odvojena zarezima (parametri mogu biti izostavljeni).

    Tijelo funkcije- skup operatora zatvorenih vitičastim zagradama.

Kao i imena varijabli, imena funkcija moraju biti sastavljena od slova, brojeva i donjih crta i ne smiju početi brojem. Ali za razliku od imena varijabli, slova u nazivima funkcija se konvertuju u mala slova prije nego što se funkcije interno pohranjuju od strane PHP interpretatora, tako da su slova u nazivima funkcija neosjetljiva na velika i mala slova.

Slijedi sažetak radnji koje se događaju kada se pozove korisnički definirana funkcija:

    PHP interpreter traži funkciju po imenu (ako funkcija još nije definirana, javlja se greška).

    PHP interpreter zamjenjuje vrijednosti parametara poziva (ili stvarnih parametara) za varijable u listi parametara definicije (ili formalnih parametara).

    Naredbe iz tijela funkcije se izvršavaju. Ako je bilo koja od izvršenih izjava povratna izjava, funkcija se zaustavlja i vraća traženu vrijednost. U suprotnom, funkcija se završava nakon što je posljednji izraz izvršen bez vraćanja bilo kakve vrijednosti.

Primjer definicije funkcije

Kao primjer, pretpostavimo da imate kod koji vam omogućava da odlučite u kojoj veličini boce ćete kupiti bezalkoholno piće. (Pretpostavimo da će se potreba za korištenjem ovog koda pojaviti u bliskoj budućnosti, kada će kupci u supermarketu moći naširoko koristiti svoje prijenosne bežične web pretraživače za pristup našoj prikladnoj web stranici koja vam omogućava da odaberete najbolje cijene.):

PHP kod $litara_1 = 1.0; $price_1 = 1,59; $litara_2 = 1,5; $price_2 = 2,09; $po_litru_1 = $cijena_1 / $litara_1; $po_litru_2 = $cijena_2 / $litara_2; ako ($per_liter_1< $per_liter_2) print("Первая сделка лучше!

")

Budući da se ovakva vrsta poređenja konstantno provodi u kodu razvijene web stranice, potrebno je urediti dio operatora ovog koda koji obezbjeđuju usporedbu kao funkciju za višekratnu upotrebu. Jedan način rješavanja ovog problema dat je u sljedećem fragmentu, koji je modificirana verzija prethodnog poređenja:

PHP kod // Funkcija definicije funkcije better_deal ($amount_1, $amount_2, $price_1, $price_2) ( $per_amount_1 = $price_1 / $amount_1; $per_amount_2 = $price_2 / $amount_2; // Vrati neku vrijednost iz funkcije koja vraća ($ per_amount_1< $per_amount_2); } $liters_1 = 1.0; $price_1 = 1.59; $liters_2 = 1.5; $price_2 = 2.09; // Вызов функции в условном операторе if (better_deal($liters_1, $liters_2, $price_1, $price_2)) print("Первая сделка лучше!
"); else print ("Druga trgovina je bolja!
")

Bolje_deal funkcija sažima tri reda prethodnog koda koji izvode aritmetičke operacije i operacije poređenja. Ova funkcija uzima četiri broja kao stvarne parametre i vraća logički izraz. Kao i kod bilo koje logičke vrijednosti, rezultirajuća vrijednost može biti ugniježđena u dijelu if izraza koji izvodi poređenje.

Iako modificirana verzija, koja koristi funkciju, ima više koda od originalne verzije, ova verzija ima dvije prednosti: prvo, funkcija se može koristiti više puta (što će smanjiti ukupnu količinu koda), a drugo, ako je potrebno, promijeniti algoritam proračuna, biće dovoljno da se promene na samo jednom mestu.

Druga opcija je uključiti izlazne izjave direktno u funkciju (kao što je prikazano ispod) ako se poređenja cijena koriste isključivo za prikaz informacija o tome koja je opcija kupovine isplativija:

PHP kod // Funkcija definicije funkcije better_deal ($amount_1, $amount_2, $price_1, $price_2) ( $per_amount_1 = $price_1 / $amount_1; $per_amount_2 = $price_2 / $amount_2; // Nema povratne vrijednosti iz funkcije, // ali neke radnje se izvode ako ($per_amount_1< $per_amount_2) print("Первая сделка лучше!
"); else print ("Druga trgovina je bolja!
"); ) // Pozivanje funkcije better_deal(1.0, 1.5, 1.59, 2.09);

Prva funkcija koristi naredbu return za vraćanje booleovog rezultata koji se kasnije koristi u testu if izraza. U drugoj funkciji nema naredbe return, jer se ova funkcija koristi za dobijanje nuspojave, a to je prikazivanje teksta u pretraživaču korisnika. Nakon izvršenja posljednje naredbe date funkcije, PHP interpreter jednostavno prelazi na izvršavanje sljedećeg izraza koji slijedi nakon poziva funkcije.

Korištenje manje parametara

Što se događa kada se funkcija pozove s manje stvarnih parametara od broja parametara navedenih u definiciji? Čitalac vjerovatno više neće biti iznenađen što PHP interpretator rješava ovu situaciju bez izazivanja padova, ali može izdati poruku upozorenja ovisno o postavkama sistema za aktivaciju za prijavu grešaka.

Ako je broj stvarnih prosledjenih parametara manji od broja formalnih parametara, onda PHP interpreter tretira prazne formalne parametre kao da su nedodeljene varijable. Ali sa normalnim postavkama za omogućavanje izveštavanja o greškama u PHP5, takođe će biti prikazana poruka upozorenja u prozoru pretraživača.

Podrazumevano, sistem izveštavanja o greškama u PHP5 je konfigurisan da prikazuje informacije o greškama bilo koje vrste, osim obaveštenja. faza otklanjanja grešaka, koji su najmanje ozbiljni uslovi greške koje je otkrio ovaj sistem. Razlog zašto se poruke upozorenja prikazuju za premalo parametara proslijeđenih funkciji je zato što se smatra da ova situacija zahtijeva upozorenja tokom otklanjanja grešaka (upozorenja u ovoj kategoriji imaju drugu najveću ozbiljnost).

Ako zaista želite koristiti pozive funkcija koji ponekad pružaju premalo stvarnih parametara, ali ne dopuštaju poruke upozorenja, možete koristiti jednu od sljedećih opcija za suzbijanje poruka upozorenja:

    Privremeno promijenite ozbiljnost grešaka koje pokreću poruke o grešci u skripti pomoću sljedeće izjave:

    PHP kod error_reporting(E_ALL - (E_NOTICE + E_WARNING));

    Korištenje takve izjave sprječava ispisivanje poruka upozorenja o otklanjanju grešaka i vremena izvođenja od trenutka kada se izjava pojavi u skripti do sljedećeg error_reporting() izraza, ako postoji. (Treba napomenuti da je ova opcija opasna, jer se poruke upozorenja mogu generirati ne samo u vezi sa situacijom koja vas zanima, već i pod utjecajem mnogih drugih problema.)

    Spriječite greške koje se javljaju prilikom izvršavanja bilo kojeg pojedinačnog izraza korištenjem operacije kontrole poruke o grešci. Znak ove operacije može se staviti ispred bilo kojeg izraza kako bi se potisnule poruke o grešci koje se javljaju samo kada se taj izraz izvrši. Na primjer, ako je poruka upozorenja generirana tokom poziva funkcije my_function(), ona se ne generira kada se pozove @my_function(). Treba napomenuti da je i ova opcija opasna, jer su sve vrste poruka o greškama potisnute, osim grešaka u tumačenju.

    PHP kod ... // Pozivanje funkcije sa 2 parametra umjesto 4 @better_deal(1.0, 1.5);

Funkcije i opseg varijabli

O opsegu varijabli i opisu lokalnih, globalnih, superglobalnih i statičkih varijabli govorili smo ranije u članku "Varijable i konstante". Dozvolite mi da vas podsjetim da je svaka varijabla deklarirana unutar funkcije lokalna, može se učiniti globalnom korištenjem ključne riječi global. Statičke varijable se koriste unutar funkcije i zadržavaju svoju vrijednost između poziva toj funkciji. Superglobali, predstavljeni kao nizovi, dostupni su svuda.

Opseg funkcije

Naravno, pravila za opseg imena varijabli su prilično jednostavna, a pravila za opseg imena funkcija su još jednostavnija. PHP5 ima samo jedno pravilo: funkcija mora biti definirana jednom (i samo jednom) u skripti u kojoj se koristi. Opseg naziva funkcije se implicitno smatra globalnim, tako da je funkcija definirana u skripti dostupna bilo gdje u toj skripti. Ali da bi se olakšalo proučavanje koda, često se preporučuje definiranje funkcija prije nego što se pozovu u kodu.

U PHP3, funkcije su se mogle koristiti tek nakon što su definirane. To znači da je najsigurniji pristup razvoju u ovom izdanju bio definiranje svih funkcija na samom početku svakog pojedinog scenarija, prije nego što se bilo koja od tih funkcija koristi (ili uključi definicije svih funkcija).

A počevši od PHP5, skripte se zapravo prethodno kompajliraju prije nego što se pozovu na izvršenje, a jedna od posljedica prekompilacije je da se tokom ove operacije sve definicije funkcija pronađu prije nego što se kod zapravo pozove za izvršenje. To znači da se definicije funkcija i kod mogu pojaviti bilo kojim redoslijedom u skripti, sve dok su sve funkcije definirane jednom (i samo jednom). To znači da će se sljedeći kod ispravno izvršiti:

PHP kod // Pozovite funkciju sum() prije nego što je definirana echo sum(15, 26); funkcija sum($a, $b) (vraćanje $a + $b; )

rekurzija

Neki kompajlirani jezici, kao što su C i C++, nameću prilično komplikovana ograničenja redosleda koda o tome kako definicije funkcija treba da budu specificirane. Poenta je da da bi dobio informaciju o tome kako kompajlirati funkciju, prevodilac mora znati sve funkcije koje se pozivaju u datoj funkciji, što znači da pozvane funkcije moraju biti prvo definirane. Pa što ako dvije funkcije pozivaju jedna drugu, ili jedna funkcija poziva samu sebe?

Problemi poput ovih često su doveli dizajnere jezika C do ideje da deklaracije funkcija (ili prototipovi) treba da budu odvojene od definicija (ili implementacija) funkcija. Ova ideja je da se trebaju obezbijediti odvojene deklaracije kako bi se kompajleru unaprijed pružile informacije o tome koje vrste stvarnih parametara i povratnih vrijednosti funkcija se planiraju koristiti u programu. Takve deklaracije sadrže dovoljno informacija da kompajler može obraditi stvarne definicije bilo kojim redoslijedom.

U PHP-u ovaj problem nestaje, pa stoga nema potrebe da se posebno definiraju prototipovi funkcija. Sve dok je svaka funkcija koja se poziva je definirana u trenutnoj datoteci koda ili uključena jednom (i samo jednom) tokom trenutnog izvršavanja skripte, PHP interpreter nema nikakvih problema u vezi s razlučivanjem imena prilikom pozivanja funkcija, bez obzira kojim redoslijedom, uključeni su pozivi funkcija i definicije funkcija.

To znači da je od verzije PHP4 moguće definirati bez ikakvih problema rekurzivne funkcije(funkcije koje same sebe nazivaju). Na primjer, kao što je prikazano u nastavku, možete definirati rekurzivnu funkciju i odmah je pozvati:

PHP kod funkcija odbrojavanje ($count) ( if ($count > 0) ( echo "Broj $count
"; // Rekurzija countdown(--$count); ) ) countdown(10);

Kao rezultat, sljedeći izlaz se prikazuje u prozoru preglednika:

Primjer korištenja rekurzije u PHP-u

Kao i kod svake rekurzivne funkcije, morate osigurati da funkcija ima osnovnu stazu (nerekurzivnu granu) pored rekurzivne staze i osigurati da se ova osnovna staza na kraju prijeđe. Ako izvršenje funkcije ne prati osnovnu putanju, onda situacija postaje slična upotrebi while petlje, u kojoj test uvijek rezultira istinitom vrijednošću, tako da će se stvoriti beskonačna petlja poziva funkcija.

U slučaju gore navedene funkcije, poznato je da će izvršenje na kraju slijediti osnovnu putanju, jer svaki put kada se funkcija pozove u rekurzivnoj putanji, vrijednost odbrojavanja (odbrojavanje - otuda i ime same funkcije) se smanjuje i na kraju bi trebala postati nula. Naravno, ovo pretpostavlja da ulazni parametar funkcije mora biti pozitivan cijeli broj, a ne negativan cijeli broj ili broj s pomičnim zarezom dvostruke preciznosti. Treba napomenuti da uslovni test "veće od nule" dat u definiciji funkcije služi kao garancija protiv beskonačne rekurzije čak iu ovim slučajevima, dok test uslova "nije jednako nuli" to ne pruža.

Slično, bez ikakvih problema rade međusobno rekurzivne funkcije(funkcije koje se međusobno pozivaju sekvencijalno). Na primjer, sljedeći poziv funkcije sa navedenom definicijom:

PHP kod funkcija countdown_first($count) ( if ($count > 0) ( echo "Pozovi countdown_first: $count
"; // Povratak na drugu funkciju countdown_second(--$count); ) ) funkcija countdown_second($count) ( if ($count > 0) ( echo "Pozovi countdown_second: $count
"; // Povratak na drugu funkciju countdown_first(--$count); ) ) countdown_first(5);

rezultira sljedećim izlazom u prozoru pretraživača:


Međusobno rekurzivne funkcije

Varijabilni broj parametara

Programi često moraju imati niz stvarnih parametara koji se razlikuju ovisno o situaciji u kojoj se funkcija poziva. Tri moguća načina za rješavanje ovog problema u PHP-u su navedena u nastavku:

  • Definirajte funkciju sa zadanim parametrima. Svi parametri koji nedostaju u pozivu funkcije bit će postavljeni na zadanu vrijednost, tako da neće biti poruke upozorenja o nedostatku potrebnih parametara.

    Koristite parametar niza za pohranjivanje vrijednosti. Pozivni kod je odgovoran za popunjavanje niza, a tijelo funkcije mora osigurati ispravno izdvajanje parametara iz niza.

    Koristite funkcije s promjenjivim brojem parametara (func_num_args(), func_get_arg() i func_get_args()).

Sljedeći odjeljci razmatraju svaku od ovih opcija zasebno.

Zadane opcije

Za definiranje funkcije sa zadanim parametrima, dovoljno je zamijeniti naziv formalnog parametra izrazom s operatorom dodjele. Ako je u stvarnom pozivu dato manje parametara nego što ima formalnih parametara u definiciji funkcije, onda PHP interpreter zamjenjuje formalne parametre stvarnim parametrima sve dok se lista stvarnih parametara ne iscrpi, a zatim koristi zadane operatore dodjele da zamijeni ostatak formalnih parametara.

Na primjer, u sljedećoj funkciji, svi parametri su definirani sa zadanim vrijednostima:

PHP kod function tour_guide($city = "Moskva", $desc = "velika metropola", $how_many = "14 miliona") ( print(" $city

"); ) tour_guide(); tour_guide("Komarovo"); tour_guide("Komarovo", "malo selo"); tour_guide("Komarovo", "malo selo", "40");

Prozor pretraživača generiše izlaz sličan sledećem:


Promjenljiv broj parametara pri pozivanju funkcije

Glavno ograničenje metode zasnovane na korišćenju zadanih parametara je da je slaganje između stvarnih parametara i formalnih parametara određeno redosledom oba. Koordinacija se vrši po principu "prvi dođe, prvi uslužen" (na osnovu principa sekvencijalnog reda).

Korištenje nizova za zamjenu više parametara

Ako niste zadovoljni nedostatkom fleksibilnosti u načinu na koji koristite više parametara, tada možete potpuno eliminirati potrebu za usklađivanjem stvarnih i formalnih parametara, uzimajući u obzir njihove pozicije. Da biste to učinili, možete koristiti niz kao sredstvo komunikacije između pozivnog koda i funkcije.

Primjer kako se koristi ovaj metod je dat u sljedećem isječku koda; također koristi nekoliko drugih praktičnih konstrukcija, kao što su ternarni operator i asocijativni niz (ako već niste upoznati s nizovima, preporučujem da za sada preskočite ovaj primjer):

PHP kod funkcija tour_brochure($arr) ( $city = isset($arr["city"]) ? $arr["city"] : "Moskva"; $desc = isset($arr["desc"]) ? $arr[ "desc"] : "velika metropola"; $how_many = isset($arr["how_many"]) ? $arr["how_many"] : "14 miliona"; print(" $city ovo je $desc gdje $how_many osoba boravi.

"); ) // Prazan niz tour_brochure(array()); // Niz sa vrijednostima $tour = array("city" => "Komarovo", "desc" => "malo selo", "kako_many" = > 40 );tour_brochure($tour);

Ova funkcija provjerava da li jedan ulazni parametar, predstavljen kao niz, ima tri različite vrijednosti povezane s određenim redovima. Koristeći trostruki uslovni operator (?:), lokalnim varijablama se dodjeljuje ili dolazna vrijednost (ako je pohranjena u nizu) ili zadani fragmenti teksta. U ovom primjeru, funkcija tour_brochure se prvo poziva s praznim nizom (što odgovara situaciji u kojoj nema stvarnih parametara), a zatim s nizom koji pohranjuje tri vrijednosti asocijativnih elemenata niza.

Korištenje više opcija

Počevši od verzije 4, PHP pruža nekoliko funkcija koje se mogu koristiti u tijelu korisnički definiranih funkcija za dohvat podataka o količini i vrijednosti parametara. Ove karakteristike su opisane u nastavku:

func_num_args() funkcija

Ne uzima nikakve parametre i vraća podatke o broju parametara proslijeđenih funkciji iz koje je pozvan.

func_get_arg() funkcija

Uzima cjelobrojni parametar n i vraća n-ti parametar funkciji iz koje je pozvan. Numerisanje parametara počinje od nule.

func_get_args() funkcija

Ne uzima nikakve parametre i vraća niz koji sadrži sve parametre funkcije iz koje je pozvana, indeksi ovog niza počinju od nule.

Sve tri ove funkcije generiraju poruku upozorenja kada se pozovu izvan tijela funkcije, a func_get_arg() emituje poruku upozorenja kada se pozove s indeksom većim od indeksa posljednjeg proslijeđenog parametra.

Kada koristite ove funkcije za kreiranje korisnički definirane funkcije koja dekodira primljene parametre, možete iskoristiti činjenicu da u PHP interpreteru ne smatraju se pogrešnim takvi pozivi funkcija u kojima broj stvarnih parametara premašuje broj formalnih parametara u definiciji. Dovoljno je lako definirati funkciju kao da ne uzima nikakve parametre, a zatim koristiti navedene funkcije za presretanje svih parametara koji su stvarno proslijeđeni.

Kao primjer, razmotrite funkciju kojoj možete proslijediti bilo koji broj brojeva i koja izračunava njihov zbir:

PHP kod funkcija Sum() ( $sum = 0; za ($i = 0; $i< func_num_args(); $i++) { $sum += func_get_arg($i); } return $sum; } echo "5 + 120 + 8 = ".Sum(5, 120, 8); echo "
10 - 18 + 104 + 2 = ".Zbroj(10, -18, 104, 2);

Funkcija Sum() koristi func_get_arg() za dohvaćanje pojedinačnih parametara i ograničava petlju koristeći rezultate funkcije func_num_args() tako da se ne pokušava dohvatiti više parametara nego što je stvarno proslijeđeno.

Pozovite po vrijednosti

Prema zadanim postavkama, korisnički definirane funkcije u PHP-u rade na bazi poziva po vrijednost. To znači da kada se parametri proslijede pozivu funkcije, PHP interpreter kreira kopiju vrijednosti tih parametara koje će se proslijediti funkciji. Stoga, bilo koje radnje izvršene u funkciji ne dopuštaju promjenu vrijednosti stvarnih parametara prisutnih u pozivu funkcije.

Ovakva organizacija rada ima svojih prednosti i mana. S jedne strane, služi kao garancija nepromjenjivosti ovih parametara ako je funkcija namijenjena samo da sa njom primi povratnu vrijednost, ali može postati izvor zabune i poteškoća ako je zapravo potrebno koristiti funkciju za promijenite vrijednosti parametara koji su mu proslijeđeni.

Jedna od najvažnijih razlika između PHP5 i ranijih verzija je ta što on efektivno uvijek prosljeđuje instance objekta referencom, iako se svi parametri različitog tipa prosljeđuju po vrijednosti. To je zato što u PHP5 objektne varijable pohranjuju ručke u objekte, a ne same objekte, tako da se u načinu prosljeđivanja po vrijednosti zapravo kopiraju sami ručke, a ne osnovni objekti (detaljnija rasprava o ovom pitanju će biti data u odeljak o objektno orijentisanom programiranju u PHP-u).

Ispod je primjer vrlo jednostavne funkcije koja povećava broj koji joj je proslijeđen u parametru za 10:

PHP kod \$broj= $broj
"; funkcija add10($a) ( $a += 10; echo "Pozovi funkciju add10() ... , rezultat: $a
\$broj

Kao što možete vidjeti na slici ispod, poziv funkcije nije utjecao na vrijednost same varijable $number i ona je ostala jednaka 20:


Prosljeđivanje parametara funkcije po vrijednosti

Pozovite po referenci

PHP pruža dva različita načina na koje zapravo možete napraviti promjene u parametrima ovih funkcija u funkcijama: metodu koja koristi definiciju funkcije i metodu zasnovanu na pozivu funkcije.

Ako želite definirati funkciju koja direktno utječe na proslijeđeni parametar, samo stavite znak ampersand ispred formalnog parametra u definiciji funkcije, kao što je prikazano u nastavku:

PHP kod $broj = 20; echo "U početku \$broj= $broj
"; funkcija add10( &$a) ( $a += 10; echo "Pozovi funkciju add10() ... , rezultat: $a
"; vrati $a; ) add10($broj); echo "Vrijednost \$broj nakon poziva funkcije add10(): $number";

Sada, nakon što izvršite potpuno isti poziv funkcije, varijabla $number se mijenja u 30:


Prosljeđivanje parametara funkcije referencom

Stvar je u tome što se u ovom slučaju formalni parametar $a odnosi na varijablu $number, pa njegova modifikacija u funkciji dovodi do promjene varijable $number.

Od PHP4, reference varijabli mogu se koristiti i izvan poziva funkcija. Uopšteno govoreći, dodeljivanje reference varijabli promenljivoj (npr. &$varname) dovodi do toga da imena dve varijable postanu pseudonimi jedna drugoj, a ne odvojene varijable sa istom vrednošću. Razmotrimo primjer:

PHP kod $name_1 = "Aleksandar"; $name_2 = "Igor"; // Prosljeđivanje varijable po vrijednosti $alias_1 = $name_1; // Prenošenje varijable po referenci $alias_2 = &$name_2; // Promena varijable $alias_1 ne menja $name_1 $alias_1 = "Dmitry"; echo "\$alias_1 = $alias_1, \$name_1 = $name_1

"; // Promjena varijable $alias_2 dovodi do promjene u $name_2 // jer su međusobno povezani preko veze $alias_2 = "Petar"; echo "\$alias_2 = $alias_2, \$name_2 = $name_2

";

što rezultira sljedećim izlazom u prozoru pretraživača:


Prenošenje varijable referencom

Varijable kao funkcije

Jedan još suptilniji trik koji se može koristiti u PHP-u je korištenje varijabli na poziciji korisnički definiranih imena funkcija. To znači da umjesto unosa doslovnog naziva funkcije u kod, možete unijeti varijablu sa znakom dolara. U ovom slučaju, koja funkcija se zapravo poziva u vrijeme izvođenja ovisi o sadržaju niza koji je dodijeljen toj varijabli.

U određenom smislu, ovo omogućava da se funkcije koriste kao podaci. Ova tehnika bi trebala biti poznata vještim C programerima, pa čak i početnicima u nekom obliku Lisp-a (kao što je Scheme ili Common Lisp). Konkretno, sljedeća dva poziva funkcije potpuno su ekvivalentna:

PHP kod funkcija sum($a, $b) (vrat $a + $b; ) eho sum(10, 15)."
"; // Proslijediti funkciju varijablu i nazvati je $var = "sum"; echo $var(12, 14);

Budući da se imena funkcija mogu tretirati jednostavno kao stringovi, oni se također mogu koristiti kao parametri funkcije ili vraćeni kao rezultati funkcije.

Petlje Linijska obrada 1 2 3 4 5 6 7 8 9 10

itd. Morate implementirati vlastitu funkciju omotača kako bi gore navedene konstrukcije radile s promjenjivim funkcijama.

Beispiel #1 Rad sa funkcijama kroz varijable

functionfoo()(
echo "U foo()
\n" ;
}

funkcijska traka ($arg = "" )
{
echo "U bar(); argument je bio "$args ".
\n" ;
}

// funkcija omotača za eho
funkcija echoit($string)
{
echo $string ;
}

$func = "foo" ;
func(); // Poziva funkciju foo()

$func = "bar" ;
$func("test"); // Poziva funkciju bar().

$func = "eho" ;
$func("test"); // Poziva funkciju echoit().
?>

Takođe možete pozvati metode na objektu koristeći PHP-ove promjenljive funkcije.

Beispiel #2 Pristup metodama klase sa varijablama

klasa Foo
{
funkcija varijabla()
{
$name = "Bar" ;
$this -> $name(); // Pozovite metodu Bar().
}

Funkcijska traka()
{
echo "Ovo je Bar" ;
}
}

$foo = novi Foo();
$funcname = "Varijabla" ;
$foo -> $funcname(); // Pogledajte $foo->Variable()

?>

Prilikom pozivanja statičkih metoda, poziv funkcije je "jači" od operatora pristupa statičkom svojstvu:

Beispiel #3 Primjer poziva metode varijable sa statičkim svojstvom

klasa Foo
{
statička $varijabla = "statičko svojstvo";
statička funkcija Variable()
{
echo "poziv varijabilne metode";
}
}

echo Foo :: $varijable ; // Ovo će dati "statičko svojstvo". Promjenjiva $ će se riješiti u ispravan opseg.
$varijable = "promenljiva" ;
foo :: $varijable(); // Ovo će pozvati $foo->Variable() čitanjem $varijable iz ovog opsega.

?>

Od PHP 5.4.0 možete zvati pozvati-funkcija smještena u varijablu.

Primjer #4 Pozivne funkcije

klasa Foo
{
statička funkcijska traka()
{
echo "bar\n" ;
}
functionbase()
{
echo "base\n" ;
}
}

$func = array("Foo" , "bar");
func(); // ispisuje "bar"
$func = niz (novi Foo, "baz");
func(); // izlaz "baz"
$func = "Foo::bar" ;
func(); // ispisuje "bar" u PHP-u 7.0.0 i novijim; u prethodnim verzijama to će rezultirati fatalnom greškom
?>

vidi takođe je_poziv(), call_user_func(), promjenljive varijable i function_exists().

Lista promjena

prije 8 godina

$wget
$ grep -l "\$\.\.\." php-chunked-xhtml/function.*.html

Lista funkcija koje prihvataju promenljive argumente.
array_diff_assoc()
array_diff_key()
array_diff_uassoc()
niz()
array_intersect_ukey()
array_map()
array_merge()
array_merge_recursive()
array_multisort()
array_push()
array_replace()
array_replace_recursive()
array_unshift()
call_user_func()
call_user_method()
kompakt ()
dba_open()
dba_popen()
echo()
forward_static_call()
fprintf()
fscanf()
httprequestpool_construct()
ibase_execute()
ibase_set_event_handler()
ibase_wait_event()
isset()
lista()
maxdb_stmt_bind_param()
maxdb_stmt_bind_result()
mb_convert_variables()
newt_checkbox_tree_add_item()
newt_grid_h_close_stacked()
newt_grid_h_stacked()
newt_grid_v_close_stacked()
newt_grid_v_stacked()
newt_win_choice()
newt_win_entries()
newt_win_menu()
newt_win_message()
newt_win_ternary()
paket ()
printf()
register_shutdown_function()
register_tick_function()
session_register()
setlocal()
sprintf()
sscanf()
unset()
var_dump()
w32api_deftype()
w32api_init_dtype()
w32api_invoke_function()
wddx_add_vars()
wddx_serialize_vars()
?>

prije 3 godine

Mala, ali korisna napomena. Ako pokušavate pozvati statičku funkciju iz drugog imenskog prostora, morate koristiti potpuno kvalificirani imenski prostor, čak i ako imaju isti nazivni prostor najviše razine. Na primjer, ako trebate pozvati sljedeću klasu:

imenski prostor Projekt \ TestClass ;
razredni test (
statička funkcija funcToCall()(
povratak "test" ;
}
}
?>
Morate ga nazvati kao:
imenski prostor Projekt \ OtherTestClass ;
klasa OtherTest(
$func = "\Project\TestClass::funcToCall";
func();
}
}
?>
i ne:
klasa OtherTest(
statička funkcija callOtherFunc()(
$func = "TestClass::funcToCall" ;
func();
}
}
?>

prije 9 mjeseci

Dok dokumentacija sugeriše da je upotreba konstante slična upotrebi varijable, postoji izuzetak u vezi sa funkcijama varijabli. Ne možete koristiti konstantu kao ime funkcije za pozivanje varijabilne funkcije.

const DEBUGME="func";
func($s) ( echo $s. "\n"; )

DEBUGME("abc"); // rezultira sintaksičkom greškom

$call = DEBUGME;
$call("abc"); // radi posao

Ali možete koristiti konstantu kao argument funkciji. Evo jednostavnog rješenja kada trebate pozvati varijabilnu konstantnu funkciju:

funkcija dinamička ($šta, $sa)
{
$šta($sa);
}
dinamički (DEBUGME, "abc");

Ovo mi ima smisla da sakrijem API-je i/ili duge (komplikovane) statičke pozive.
Enjoy!

prije 13 godina

Ako želite pozvati statičku funkciju (PHP5) u varijabilnoj metodi:

Napravite niz od dva unosa gdje je 0. unos ime klase koja se poziva („self“ i „parent“ rade također), a 1. unos je naziv funkcije. U osnovi, varijabla "povratnog poziva" je ili niz (ime funkcije) ili niz (0 => "ime klase", 1 => "ime funkcije").

Zatim, da biste pozvali tu funkciju, možete koristiti ili call_user_func() ili call_user_func_array(). primjeri:

klasa A (

Zaštićeno $a ;
zaštićeno $c ;

Funkcija __construct()(
$this -> a = array("self" , "a");
$this -> c = array("self" , "c");
}

Statička funkcija a ($name, & $value) (
echo $name , " => " , $value ++, "\n" ;
}

Funkcija b ($name, & $value) (
call_user_func_array ($this -> a, array($name, & $value));
}

Statička funkcija c ($str ) (
echo $str , "\n" ;
}

Funkcija d () (
call_user_func_array ($this -> c , func_get_args ());
}

Funkcija e () (
call_user_func ($this -> c, func_get_arg (0));
}

klasa B produžava A (

Funkcija __construct()(
$this -> a = array("parent" , "a" );
$this -> c = array("self" , "c");
}

statička funkcija c()(
print_r(func_get_args());
}

Funkcija d () (
call_user_func_array ($this -> c , func_get_args ());
}

Funkcija e () (
call_user_func ($this -> c , func_get_args ());
}

$a =& novi A ;
$b =& novi B ;
$i = 0;

A :: a("indeks", $i);
$a -> b("indeks", $i);

$a -> c("string");
$a -> d("string");
$a -> e("string");

#etc.
?>

Napomena: aktivira se adaptivna verzija sajta, koja se automatski prilagođava maloj veličini vašeg pretraživača i sakriva neke detalje sajta radi lakšeg čitanja. Sretno gledanje!

Pozdrav dragi čitaoci bloga Site on! Saznali smo da postoji funkcija u PHP-u, naučili smo kako da kreiramo sopstvene funkcije, da im prenesemo argumente i pozovemo ih na izvršenje. Nastavljajući temu funkcija u PHP-u, potrebno je naglasiti sljedeće:

  • Unutar funkcije možete koristiti bilo koji PHP kod (petlje, uslove, bilo koje operacije), uključujući i druge funkcije (ugrađene i vlastite);
  • Ime funkcije mora početi latiničnim slovom ili donjom crtom, nakon čega slijedi bilo koji broj latiničnih slova, brojeva ili podvlaka;
  • Sve funkcije imaju globalni opseg, što znači da se bilo koja funkcija može pozvati bilo gdje, čak i ako je ta funkcija definirana unutar druge;
  • PHP ne podržava preopterećenje funkcija i ne postoji način da se zaobiđe (promeni, doda) ili izbriše kreirana funkcija;
  • Funkcije ne moraju biti definirane prije nego što se koriste. Odnosno, ako prvo pozovete funkciju, a tek onda - opišete je ispod u kodu, to neće utjecati na performanse i neće uzrokovati greške.

Uslovne funkcije

Možemo kreirati (definirati, opisati) funkciju, ovisno o uvjetu. Na primjer:

//pozovite funkciju sayHi, može se pozvati bilo gdje /*funkcija sayGoodbye se ne može pozvati ovdje, jer još nismo provjerili uvjet i nismo ušli u if konstrukciju*/ if($apply)( funkcija sayGoodbye()( echo "Zbogom svima!
"; } } /*Sada možemo nazvati sayGoodbye*/
"; }

rezultat:

I pogledajte ovaj primjer:

/*a ovo se dešava ako pozovete sayGoodbye ovdje*/ reci zbogom(); if($apply)( funkcija sayGoodbye()( echo "Zbogom svima!
"; ) ) funkcija sayHi()( echo "Pozdrav svima!
"; }

rezultat:

Zapravo, koliko radim, ovo nisam nigdje vidio, ali treba imati na umu sve mogućnosti jezika.

ugniježđene funkcije

Ugniježđena funkcija je funkcija deklarirana unutar druge funkcije. primjer:

/*Ovdje ne možete pozvati sayGoodbye, jer će se pojaviti tek nakon pozivanja funkcije sayHi*/ pozdravi(); /*pozovi funkciju sayHi, može se pozvati bilo gdje*/ /*Sada možemo nazvati sayGoodbye*/ reci zbogom(); funkcija sayHi()( echo "Zdravo svima!
"; funkcija sayGoodbye()( echo "Zbogom svima!
"; } }

Opet, pri prvom obilasku, PHP interpreter zapaža u sebi da je pronašao opis funkcije sayHi, ali ne ulazi u njeno tijelo, vidi samo ime, a pošto interpreter ne ulazi unutar sayHi tijela, nema pojma šta definišemo unutar još jedne funkcije - sayGoodbye.

Tada kod počinje da se izvršava, mi zovemo sayHi, PHP interpreter mora ući u tijelo sayHi funkcije da bi ga izvršio, i tamo slučajno pronađe opis druge funkcije - sayGoodbye, nakon čega možete pozvati sayGoodbye bilo gdje, kao mnogo puta koliko god želite.

Ali vrijedi obratiti pažnju na vrlo suptilnu tačku u gornjoj situaciji: funkcija sayHi postaje jednokratna, jer ako je ponovo pozovemo, PHP će ponovo naići na definiciju sayGoodbye funkcije, a u PHP-u se to ne može učiniti - ne možete redefinirati funkcije. O tome i kako se nositi s tim pisao sam u prethodnom članku.

U PHP-u se gore opisane tehnike koriste vrlo rijetko, češće se mogu vidjeti, na primjer, u JavaScript-u.

Varijabilni opseg

PHP ima tačno dva opsega: globalno i lokalni. Opsezi su različito organizirani u svakom programskom jeziku. Na primjer, u C++, čak i petlje imaju svoj vlastiti (lokalni) opseg. U PHP-u, inače, ovo je globalni opseg. Ali danas govorimo o funkcijama.

Funkcije u PHP-u imaju svoj, interni opseg (lokalni), to jest, sve varijable unutar funkcije su vidljive samo unutar same funkcije.

Dakle, još jednom: sve što je izvan funkcija je globalni opseg, sve što je unutar funkcija je lokalni opseg. primjer:

Dragi stručnjaci, pažnja, pitanje! Šta će izaći posljednja instrukcija echo $name; ?

Kao što ste sami vidjeli, imali smo 2 varijable $name, jedan unutar funkcije (lokalni opseg), drugi samo u kodu (globalni opseg), posljednja dodjela varijabli $name Bilo je $name = "Rud Sergey"; Ali pošto je bio unutar funkcije, ostao je tamo. U globalnom obimu, posljednji zadatak je bio $name = "Andrej";šta zapravo vidimo kao rezultat.

Odnosno, dvije identične varijable, ali u različitim opsezima se ni na koji način ne sijeku i ne utiču jedna na drugu.

Dozvolite mi da ilustrujem opsege na slici:

Tokom prvog obilaska, interpretator prelistava globalni opseg, pamti koje su varijable i funkcije, ali ne izvršava kod.

Pristup globalnim varijablama iz lokalnog opsega

Ali šta ako još uvijek trebamo pristupiti istoj varijabli $name iz globalnog opsega iz funkcije, a ne samo da joj pristupimo, već da je promijenimo? Za to postoje 3 glavne opcije. Prvi je upotreba ključne riječi globalno:

"; globalno $name; /*od sada mislimo na globalnu varijablu $name*/$name = "Rud Sergey"; ) $name = "Andrej"; reciHi($name); echo $name; // ?

rezultat:

Ali ova metoda ima minus, jer smo se okrenuli globalnoj varijabli $name izgubili smo (prebrisali) lokalnu varijablu $name.

Drugi način je koristiti PHP superglobalni niz. U ovaj niz, sam PHP automatski stavlja svaku varijablu koju smo kreirali u globalni opseg. primjer:

$name = "Andrej"; //Isto kao$GLOBALS["name"] = "Andrej";

posljedično:

"; $GLOBALS["name"] = "Rud Sergey"; ) $name = "Andrej"; sayHi($name); echo $name; // ?

Rezultat je isti kao kod upotrebe ključne riječi globalno:

Samo ovaj put nismo prepisali lokalnu varijablu, tj. varijablu $name unutar funkcije ostaje ista i jednaka je "Andrija", ali ne "Rud Sergey".

Prenošenje argumenata referencom

Treći način je prijenos adrese ( linkovi) varijabla, a ne njena vrijednost. Reference u PHP-u nisu baš uspješne, za razliku od drugih programskih jezika. Međutim, reći ću vam jedini ispravan način za prosljeđivanje argumenta referencom na funkciju, koja je normalno podržana u PHP-u 5.3 i novijim. Postoje i drugi načini rada sa vezama, ali oni su radili u PHP-u 5.2 i niže, kao rezultat toga, sami PHP programeri su odlučili da ih napuste, tako da nećemo govoriti o njima.

Dakle, PRAVI način za prosljeđivanje argumenta po referenci u PHP-u 5.3 i novijim je sljedeći:

Funkcija sayHi(& $name)(

Dodali smo ikonicu ampersanda (&) u samom opisu funkcije - ova ikona znači da ne prihvatamo vrijednost varijable, već referencu (adresu) na ovu vrijednost u memoriji. Reference u PHP-u vam omogućavaju da kreirate dve varijable koje upućuju na istu vrednost. To znači da kada se jedna od ovih varijabli promijeni, obje se mijenjaju, jer se odnose na istu vrijednost u memoriji.

I kao rezultat imamo:

//prihvatamo ne vrijednost, već referencu na vrijednost echo "Bok, ".$name."!
"; $name = "Rud Sergey"; ) $name = "Andrej"; sayHi($name); echo $name; // ?

rezultat:

Statičke varijable

Zamislite sljedeću situaciju: trebamo izbrojati koliko puta smo se ukupno pozdravili. Evo šta pokušavamo da uradimo:

"; $c++; // povećaj brojač za 1


rezultat:

Varijabilna $c ne pamti svoju vrijednost, svaki put se stvara iznova. Moramo biti sigurni da je naša lokalna varijabla $c zapamtili svoju vrijednost nakon što je funkcija izvršena, za to koriste ključnu riječ statički:

// brojač, statičan echo "Bok, ".$name."!
"; $c++; // povećaj brojač za 1 echo "Total hello" . $c . "jednom.


"; ) sayHi("Rud Sergey"); sayHi("Andrey"); sayHi("Dmitry");

rezultat:

Povratne vrijednosti

Funkcije imaju tako zgodnu stvar kao što je vraćanje vrijednosti. To je kada funkcija, umjesto da prikaže nešto na ekranu, sve stavlja u varijablu i daje nam tu varijablu. I već odlučujemo šta ćemo s tim. Na primjer, uzmite ovu funkciju, ona kvadrira broj:

rezultat:

Napravimo tako da umjesto prikazivanja na ekranu vraća rezultat izvršenja. Za ovo se koristi ključna riječ return:

rezultat:

Sada ovo možemo koristiti na različite načine:

//ispisuje rezultat eho"
"; $num = getSquare(5); echo $num;

rezultat:

Skrećem vam pažnju na činjenicu da je ključna riječ povratak ne vraća samo vrijednost, već potpuno prekida funkciju, odnosno sav kod koji je ispod ključne riječi povratak nikada ne biti ispunjen. Drugim riječima, povratak za funkcije također funkcionira kao break za cikluse:

echo "PHP me nikada neće stići:(";) echo getSquare(5); //ispisuje rezultat eho"
"; $num = getSquare(5); // dodijelio rezultat varijabli echo $num; // prikazuje varijablu na ekranu

rezultat:

To je povratak je također izlaz iz funkcije. Može se koristiti bez povratne vrijednosti, samo radi izlaza.

rekurzivna funkcija

Rekurzivna funkcija je funkcija koja sama sebe poziva. Rekurzija se ne koristi često i smatra se resursno intenzivnom (sporom) operacijom. Ali dešava se da je upotreba rekurzije najočitija i najjednostavnija opcija. primjer:

"; if($broj< 20){ // tako da rekurzija ne postane beskonačna countPlease(++$broj); // countPlease funkcija je sama pozvala) countPlease(1);

rezultat:

Ako znate kako to učiniti bez rekurzije, onda je bolje da to učinite.

Jako kucanje u PHP-u (kvalifikacija tipa)

PHP je poduzeo male korake ka snažnom kucanju tako da možemo unaprijed odrediti koji tip funkcija treba da ima (ovo se zove tip hint):

rezultat:

Fatalna greška koja se može uhvatiti: Argument 1 proslijeđen countPlease() mora biti niz, dat cijeli broj, pozvan u /home/index.php na redu 7 i definiran u /home/index.php na redu 3

Greška nam govori da funkcija očekuje da će primiti niz, ali umjesto toga prosljeđujemo joj broj. Nažalost, za sada možemo samo odrediti tip za (array), a od PHP 5.4 dodata je i takva opcija kao pozvati:

pozvati provjerava može li se proslijeđena vrijednost pozvati kao funkcija. Poziv može biti ili ime funkcije dato varijablom stringa, ili objekt i ime metode koju treba pozvati. Ali o objektima i metodama ćemo govoriti kasnije (ovo je dio objektno orijentiranog programiranja), a vi ste već upoznati sa funkcijama. Ne mogu vam pokazati rezultat rada, pošto trenutno imam PHP 5.3, ali bi to bilo:

Pozvana funkcija getEcho

Korištenje argumenata promjenjive dužine

I na kraju, još jedna vrlo rijetko korištena nijansa. Zamislite situaciju, mi prosljeđujemo argumente funkciji, iako ih nismo opisali u funkciji, na primjer:

rezultat:

Kao što vidite, nema grešaka, ali se ni naši preneseni argumenti nigdje ne koriste. Ali to ne znači da su nestali - i dalje su proslijeđeni funkciji i možemo ih koristiti, za to postoje ugrađene PHP funkcije:

func_num_args()- Vraća broj argumenata proslijeđenih funkciji
func_get_arg(redni broj)- Vraća element sa liste argumenata
func_get_args()- Vraća niz koji sadrži argumente funkcije

"; echo func_get_arg(0) ; ) $age = 22; getEcho("Rud Sergey", $age);

rezultat:

Zaključak

Današnji članak je posljednji na temu funkcija u PHP-u. Sada možete biti sigurni u potpunost svog znanja o ovoj temi i možete sigurno koristiti funkcije za svoje potrebe.

Ako neko ima želju da se dočepa, ali nema ideje kako to učiniti, najbolji način bi bio da napiše gotove (ugrađene) PHP funkcije, na primjer, možete napisati svoju count() funkciju ili bilo koju ostalo.

Hvala svima na pažnji i vidimo se uskoro! Ako nešto nije jasno, slobodno postavite pitanja u komentarima!

Konačno smo došli do teme kreiranje funkcija u PHP-u. Ova tema je izuzetno važna i, možda, kreiraju se funkcije u PHP-uČesto. I, naravno, morate ih kreirati. Podsjećam da je funkcija blok koda, koji je određeni šablon, čije djelovanje ovisi o ulaznim parametrima. Sada idemo na kreiranje i korištenje funkcija u PHP-u.

Napišimo primjer elementarne funkcije koja jednostavno ispisuje " Zdravo svijete":

funkcija printHello() (
eho "Hello World";
}
printHello();
?>

U ovom primjeru kreirali smo funkciju pod nazivom " printHello" bez parametara (u zagradama nema ništa), onda smo kod funkcije napisali u vitičastim zagradama. To jest, u ovom slučaju, izlazimo niz. Pozivamo ga izvan funkcije. Kao što vidite, sve je vrlo jednostavno Ali cijena ove funkcije je nula, makar samo zato što uvijek radi na isti način.Naravno, to je ponekad potrebno, pa ne biste trebali misliti da je takav primjer funkcije općenito besmislen.Međutim, češće od ne, funkcija i dalje zahtijeva parametar, i hajde da kreiramo funkciju sa vama, kojoj ćemo proslediti niz, a zatim ispisati ovaj red:

funkcija printHello($str) (
echo $str;
}
printHello("Zdravo svijet!!!");
?>

Ovdje smo kreirali funkciju, ali s parametrom. I onda prikazujemo vrijednost ovog parametra kroz echo. Van funkcije printHello() zovemo ga i prenosimo niz " Zdravo svijete!!! Kao što vidite, ovdje je sve jednostavno.

I poslednja stvar koju želim da kažem je o podrazumevanim parametrima koji dozvoljavaju kreirati funkcije s promjenjivim brojem parametara. Predlažem da riješim sljedeći problem: kreirati funkciju koja će uzeti niz kao prvi parametar, a Booleovu varijablu kao drugi parametar ( tačno ili false), čija će zadana vrijednost biti false:

funkcija printArray ($arr, $bool = false) (
$str = "";
za ($i = 0; $i< count($arr); $i++)
$str .= "Element $i = $arr[$i]
";
if ($bool) vrati $str;
echo $str;
}
$a = niz(15, 12, 13, 14);
printArray($a);
$str = printArray($a, istina);
echo $str;
?>

Ovdje je značenje sljedeće: zadatak funkcije je da formira string iz niza, odnosno jednostavno pretvori niz u string tip. U ovom primjeru, najzanimljiviji je parametar bool, koji ima zadanu vrijednost. Ako ona false(kao po defaultu, tj. ako nije navedena druga vrijednost), tada se red odmah ispisuje u pretraživaču, a ako se prođe tačno(kao u drugom pozivu funkcije), tada se vraća niz ( return $str) funkcija. Evo jednostavnog primjera za kreiranje funkcija sa zadanim parametrima.