PHP: Parametri i argumenti funkcije. Implementacija mehanizma za razlikovanje prava pristupa administratorskom dijelu Prosljeđivanje argumenata korisničkim funkcijama

💖 Sviđa li vam se? Podijelite vezu sa svojim prijateljima

Prosljeđivanje argumenata korisnički definiranim funkcijama

Kada deklarirate funkciju, možete navesti popis parametara koji se mogu proslijediti funkciji, na primjer:

funkcija funkcija ($a, $b, /* ..., */ $z) { ... };
?>

Kada pozivate funkciju funct(), morate navesti sve proslijeđene parametre jer su oni obavezni. U PHP-u, korisnički definirane funkcije mogu imati izborne ili zadane parametre, ali više o tome kasnije.

Prema utvrđenim tradicijama, u svim programskim jezicima postoje dvije vrste argumenata funkcije:

  • parametri-vrijednosti;
  • parametri-varijable.

Funkcije ne mogu promijeniti vrijednost parametra, odnosno on je za funkciju samo za čitanje - može ga koristiti, ali ništa više. Nije potrebno navesti varijablu kao parametar vrijednosti; odatle i naziv - parametar vrijednosti.

Prema zadanim postavkama, argumenti funkcije prosljeđuju se prema vrijednosti (to znači da ako promijenite vrijednost argumenta unutar funkcije, vrijednost izvan funkcije i dalje će ostati ista). Evo primjera:

funkcija funkcija ($string)
{
jeka "

Parametar = $string

" ;
}

$str = 777 ;
funkcija(777);
funkcija( $str);

// Funkcija "funct" dvaput će ispisati niz "Parametar = 777".

?>

Za razliku od parametara vrijednosti, varijabilni parametri mogu se mijenjati dok je funkcija pokrenuta. Ovdje više ne možete proslijediti vrijednost, morate proslijediti varijablu. PHP koristi mehanizam prosljeđivanja varijable referencom za deklariranje parametara varijable.

Ako želite dopustiti funkciji da mijenja svoje argumente, morate ih proslijediti referencom.

Ako želite da se argument uvijek prosljeđuje referencom, morate navesti ampersand (&) prije naziva argumenta u deklaraciji funkcije:

funkcija funkcija (& $string)
{
$string .= "a ovaj je unutra." ;
}
$str = "Ova linija je izvan opsega funkcije,";
funkcija($str);
echo $str ; // Ispisuje "Ova linija je izvan funkcije, a ova linija je unutar."
?>

Zadane postavke

Kod programiranja često postoji potreba za kreiranjem funkcije s promjenjivim brojem parametara. Za to postoje dva razloga:

  • Ima previše parametara. Nema smisla svaki put navoditi sve parametre;
  • Funkcije moraju vraćati vrijednosti različitih tipova ovisno o skupu parametara.

U PHP-u funkcije mogu vratiti bilo koju vrijednost ovisno o parametrima koji su im proslijeđeni.

funkcija makecup ($type = "Tea" )
{
povratak "Napravite šalicu $type.\n";
}
echo šminka();
echo šminka ("Kava");
?>

Rezultat gornje skripte bit će ovakav:

Napravite šalicu čaja
Skuhajte šalicu kave

PHP također omogućuje korištenje nizova i posebnog tipa NULL kao zadanih vrijednosti, na primjer:

funkcija makecup ($types = array("Coffee"), $Maker = NULL )
{
$device = is_null ($Maker)? "šećer": $Maker;
povratak "Napravi šalicu". pridruži(", ", $vrste). " s $uređajem.\n" ;
}
echo šminka();
echo makecup (array("Coffee" , "Tea" ), "cream" );
?>

Dotična skripta ispisat će sljedeće:

Skuhajte šalicu kave sa šećerom. Napravite šalicu kave, čaja s vrhnjem.

Zadana vrijednost mora biti konstantan izraz.

Imajte na umu da se svi argumenti koji imaju zadane vrijednosti moraju nalaziti desno od argumenata koji nemaju zadane vrijednosti, inače vaš kod možda neće raditi kako očekujete. Razmotrite sljedeći primjer:

funkcija makecup ($type = "tea" , $cond )
{
povratak ;
}

Echo šminka ("vruće"); //Neće raditi kako bismo mogli očekivati
?>

Izlaz gornje skripte bit će nešto poput ovoga:

Upozorenje: nedostaje argument 2 za makecup() in c:\inetpub\site\test.php na liniji 2
Napravite šalicu vruće hrane.

Sada modificirajmo razmatranu skriptu ispravljajući pogreške u njoj:

funkcija makecup ($cond , $type = "čaj")
{
povratak"Napravite šalicu $type $cond.\n";
}

Echo šminka ("vruće"); // Sada naša skripta radi ispravno!
?>

Rezultat ispravljene skripte izgledat će ovako:

Napravite šalicu vrućeg čaja.

Pažnja! Od PHP 5, zadane vrijednosti mogu se proslijediti referencom!

Promjenjivi broj argumenata u funkcijama

Ponekad ne znamo točno koliko će parametara biti proslijeđeno našoj funkciji. Posebno za ovaj slučaj, PHP programeri su osigurali mogućnost korištenja varijabilnog broja argumenata.

Implementacija ove značajke prilično je transparentna i uključuje korištenje funkcija func_num_args() , func_get_arg() I func_get_args() .

Razmotrimo mogućnosti razmatranih standardnih funkcija:

Standardna funkcija func_num_args() vraća broj argumenata proslijeđenih korisničkoj funkciji:

funkcija funkcija()
{
$numargums = func_num_args();
jeka "Broj argumenata: $numargums\n";
}

Funkcija (1, 2, 3); // Skripta će ispisati "Broj argumenata: 3"
?>

Standardna funkcija func_get_arg() vraća element s popisa argumenata proslijeđenih korisničkoj funkciji:

funkcija funkcija()
{
$numargs = func_num_args();
jeka "Broj argumenata: $numargs
\n"
;
if ($numargs >= 2 ) (
jeka "Drugi argument: ". func_get_arg(1). "
\n" ;
}
}

Funkcija (1, 2, 3);
?>

Za pretplatnike

Argumenti funkcije

Što su argumenti funkcije?

Argumenti funkcije navedene su odvojene zarezima u zagradama nakon naziva funkcije koja se definira i njezine su lokalne varijable.

Svi izrazi koji se prosljeđuju funkciji za obradu i mogu se izračunati mogu se koristiti kao vrijednosti argumenata. U tom slučaju funkcija možda uopće ne prima argumente, ali ako ih ima, oni se izračunavaju slijeva nadesno.

Prosljeđivanje argumenata funkcije po vrijednosti i po referenci

Zadano argumenti se prosljeđuju funkciji po vrijednosti, ali i podržan prosljeđivanje argumenata po referenci i zadane vrijednosti.

Prilikom prosljeđivanja argumenata po vrijednosti, izvorna vrijednost vanjske varijable ostaje konstantna kada se promijeni vrijednost argumenta unutar funkcije. Ako želite da funkcija može utjecati na vrijednost vanjske varijable, morate joj proslijediti argumente referencom. To se radi pomoću simbola & "&" ispred naziva argumenta u opisu funkcije (vidi primjer br. 1).

Primjer br. 1. Prosljeđivanje argumenata funkcije po vrijednosti i po referenci

Zadane vrijednosti argumenata funkcije

Također u PHP-u moguće je koristiti za argumenti funkcije zadane vrijednosti, koji predstavljaju vrijednosti koje se koriste ako se nikakva vrijednost ne proslijeđuje ovom argumentu prilikom pozivanja funkcije. Kako biste postavili zadanu vrijednost argumenta, morate u definiciji funkcije ovom argumentu dodijeliti željenu vrijednost (vidi primjer br. 2). U ovom slučaju, zadane vrijednosti mogu imati i argumente proslijeđene vrijednosti i argumente proslijeđene referencom. Međutim, u svakom slučaju, svi argumenti kojima su dodijeljene zadane vrijednosti moraju se pojaviti na popisu nakon argumenata koji nemaju zadane vrijednosti. Osim toga, kao zadane vrijednosti mogu se koristiti samo konstantni izrazi, nizovi i NULL. Ne možete koristiti, na primjer, varijable ili pozive funkcija.

Primjer br. 2. Korištenje zadanih vrijednosti argumenata

Popis argumenata promjenjive duljine

Ako točan broj argumenata proslijeđenih funkciji nije unaprijed poznat, možete koristiti popis argumenata promjenjive duljine. Takav popis formira se pomoću posebne varijable kojoj prethodi elipsa "...". Kao rezultat toga, argumenti će biti prebačeni u navedenu varijablu u obliku niza (vidi primjer br. 3).

Primjer br. 3. Korištenje popisa argumenata promjenjive duljine

Možete navesti uobičajene argumente ispred elipse, ali svi ostali argumenti proslijeđeni funkciji bit će uključeni u polje. Štoviše, prije elipse možete naznačiti vrstu argumenata koji se mogu unijeti u niz, kao i znak ampersand “&” za prosljeđivanje argumenata prema referenci (vidi primjer br. 4).

"; //Izlaz 10, jer je vrijednost proslijeđena funkciji //referencom, a zatim je funkcija promijenila u 10 echo $a_1; ?>

Primjer br. 4. Značajke korištenja liste argumenata promjenjive duljine

Dopušteno je koristiti elipsu "..." za proširenje polja proslijeđenog kao argument funkcije u argumente funkcije u obliku njegovih elemenata (vidi primjer br. 5).

"; //Dodijeli niz varijabli $a_3=; //Proširi niz proslijeđen funkciji //Izlaz 3 echo m_sum_2(...$a_3); ?>

Primjer br. 5. Proširenje niza argumenata koji se prosljeđuju funkciji kada je pozvana

Funkcije za pristup argumentima

  • func_get_args()- vraća niz koji se sastoji od argumenata funkcije;
  • func_get_arg(n)- vraća navedeni argument funkcije, gdje je n=0,1,2,... broj argumenta u listi, koji počinje od nule (zapamtite da se argumenti računaju slijeva na desno);
  • func_num_args()- vraća broj argumenata stvarno proslijeđenih funkciji.

"; //Prikazat će vrijednost trećeg argumenta proslijeđenog funkciji echo func_get_arg(2); //Vratiti zbroj argumenata funkcije return $sum; ) //Pozvati funkciju. Ispisati 38, tj. broj argumenata pass je 3, //i vrijednost 3. argument je jednak 8 (numeriranje elemenata počinje od nule) m_sum(1,2,8);

Primjer br. 6. Korištenje posebnih funkcija za rad s argumentima

Imajte na umu da se argumentima funkcije također može pristupiti pomoću posebnih funkcija, posebno ako funkcija uzima više argumenata nego što očekuje (pogledajte primjer #6):

Brzo idite na druge stranice

http://site Autorska prava © Petr Romanovsky, Minsk, 2016-2019.

U svojoj praksi web developmenta često sam se susretao sa situacijama u kojima korisnici postavljaju određeni cilj, odnosno podjelu dijelova admin panela s obzirom na dostupnost određenim korisnicima. Štoviše, razvoj ovog modula odvijao se u kontekstu proširivog sustava, odnosno s nefiksiranim brojem modula kojima je organiziran pristup, a time i neograničenim brojem korisnika sustava.

Pa, ova tema je sama po sebi dosta teška i zahtijeva određeno vrijeme za analizu i formuliranje problema.

U kontekstu ovog članka razvijat ćemo se u kontekstu nekog apstraktnog informacijskog sustava, s vlastitom infrastrukturom i arhitekturom, pri čemu ovaj sustav korisniku pruža mogućnost proširenja funkcionalnosti, odnosno instaliranja novih modula, te sukladno tome postavljanje pristupa prava na njih za ovog ili onog korisnika, registriranog kao administrator sustava.

Raspravljajmo o arhitekturi modularnog sustava na našem odabranom pseudosustavu od samog početka.

Svi moduli prikazani su u obliku umetaka povezanih s glavnim dokumentom (indeksna datoteka). Zahtjev za dodatak dolazi iz niza upita QUERY_STRING, a naziv dodatka prosljeđuje se kao argument act. U nekom trenutku u indeksu datoteka, ovaj parametar se dohvaća i obrađuje. Nakon toga, ako korisnik ima dovoljna prava za pristup modulu u kontekstu čitanja, provjerava se postojanje modula navedenog u retku upita, i ako postoji, povezuje se s indeksnom datotekom.

S razlogom sam spomenuo “kontekst čitanja”, jer naš sustav pretpostavlja postojanje dva konteksta za rad sa sustavom, a to su čitanje i pisanje. U ovom slučaju čitanje podrazumijeva izravan pristup modulu i onim njegovim dijelovima koji ne uključuju izmjene strukture podataka u bazi podataka. Pod snimanjem mislimo na izravno mijenjanje informacija pohranjenih u bazi podataka.

Za implementaciju ovog mehanizma provjerit ćemo vrijednost varijable niza upita `do`, koja se obrađuje u samom modulu i nosi informaciju o tome kojem dijelu modula treba dopustiti pristup korisniku.

Vrijednost do će biti fiksna, ova varijabla će poprimiti sljedeće vrijednosti:

  • main - glavni dio modula (dostupan u kontekstu čitanja)
  • config - odjeljak konfiguracije modula (dostupan u kontekstu snimanja)
  • stvoriti - izvršiti neke radnje za dodavanje informacija u bazu podataka (dostupno u kontekstu zapisa)
  • brisanje - pristup odjeljku koji pruža mogućnost brisanja nekih informacija u kontekstu određenog modula (dostupno u kontekstu zapisa)
  • uredi - pristup informacijama o uređivanju u kontekstu modula (dostupno u kontekstu objave)

Općenito, ovaj se popis može povećati, ali sve ovisi samo o razmjeru projekta i njegovim funkcionalnim potrebama.

Sada izravno o modulima. Osim fizičkog postojanja određenog modula u kontekstu datotečnog sustava projekta, modul mora biti dodan i u posebnu tablicu baze podataka, koja će sadržavati podatke o svim postojećim modulima u sustavu. Dodavanje i mijenjanje podataka u ovoj tablici obično se vrši direktno u sklopu modula, odnosno tijekom njihove instalacije u sustav. No, ovo je već produbljivanje u principe sagledavanja proširivih sustava, o čemu ćemo neki drugi put, pa ćemo se stoga ograničiti na ručno ažuriranje i dodavanje podataka o modulima.

Dakle, zapis o modulu sustava sadržavat će sljedeće informacije: engleski identifikator naziva modula, koji će biti identičan vrijednosti varijable okruženja GET - act (modul će biti izravno zatražen u odnosu na njega), Ruski identifikator modula koji će se koristiti na popisu modula.

Osim modula, imat ćemo još dvije tablice i to tablicu u kojoj će biti pohranjeni podaci o profilima prava pristupa i tablicu s informacijama o korisnicima izravno.

Tablica sigurnosnog profila sastojat će se od samo tri polja - identifikatora profila (numerička vrijednost identifikatora zapisa), identifikatora tekstualnog modula (namijenjenog korisnicima), kao i posebno generirane tekstualne oznake koja sadrži informacije o pravima korisnika u kontekstu svakog modula.

Pa, pogledajmo ovu posebnu strukturu. Bit će kako slijedi: [indefier_modula: + \: + \;] *

To jest, postoji popis parova: naziv modula ":" prava čitanja "," prava pisanja ";". U ovom slučaju, ova oznaka se ažurira kada se izvrše promjene korisničkih prava pristupa sustavu. Ako se u sustavu pojave informacije o modulu koji nije uključen u ovu oznaku, tada samo trebate provesti postupak uređivanja i podaci će se automatski spremiti.

Sada još samo trebamo razmotriti strukturu samo jedne tablice baze podataka i možemo krenuti s implementacijom algoritamskog dijela, odnosno tablice s podacima o korisnicima sustava, jer je dodjeljivanje prava pristupa njima naš glavni zadatak.

Neću mu dodati ništa dodatno, već samo ono što će se koristiti u kontekstu teme ovog članka. Tablica korisnika će sadržavati sljedeća polja: korisnički ID (numerički brojač), prijava, lozinka (hash izvorne lozinke), korisnički sigurnosni profil (ID korisničke grupe, u odnosu na prava u sustavu) i to je to. Čini mi se da su ove informacije sasvim dovoljne da i vi i ja realiziramo zadatak, a sve ostale dodatke dajem mogućnost da radimo sami.

Dakle, razgovarali smo o strukturi i, nadam se, svi već imaju neku ideju o tome kako ćemo provesti zadatak postavljen u temi članka. Sada ću dati pomoćni SQL kod za gore opisane tablice, nakon čega ću odmah prijeći na implementaciju algoritma za provjeru prava pristupa korisnika, kao i kreiranje i promjenu profila pristupa. Nakon svakog pojedinog modula detaljno ćemo razgovarati o eventualnim pitanjima čitatelja.

tablica `moduli`:

CREATE TABLE `modules` (`id` bigint(20) NOT NULL auto_increment, `indefier` text collate utf8_unicode_ci NOT NULL, `title` text collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

tablica `sigurne_grupe`:

CREATE TABLE `secure_groups` (`id` bigint(20) NOT NULL auto_increment, `title` text collate utf8_unicode_ci NOT NULL, `perms` text collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;

Tablica `korisnici`

CREATE TABLE `users` (`id` bigint(20) NOT NULL auto_increment, `login` text collate utf8_unicode_ci NOT NULL, `passwd` text collate utf8_unicode_ci NOT NULL, `groupId` int(1) NOT NULL default "0", PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;

temp=niz(); $this->temp["_result"]=0; $this->temp["_uid"]=explode("::",$_COOKIE["site_hash"]); $this->temp["_uid"]=$this->temp["_uid"]; $this->temp["_gid"]=$this->getUserSecurityAccess($this->temp["_uid"]); $this->temp["_conn_id"]=mysql_connect("host","user","passwd"); mysql_select_db("baza podataka"); $this->temp["_q1"]=mysql_query("SELECT perms" ."FROM `secure_groups`" ."WHERE id=".$this->temp["_gid"]); $this->temp["_access_stamp"]=mysql_fetch_assoc($this->temp["_q1"]); $this->temp["_access_stamp"]=$this->temp["_access_stamp"]["perms"]; $this->temp["_access_stamp"]=explode(";",$this->temp["_access_stamp"]); $this->temp["_access_stamp"]=array_slice($this->temp["_access_stamp"],0,-1); foreach($this->temp["_access_stamp"] kao $this->temp["v"])( $this->temp["_mod_access"]=explode(":",$this->temp["v) "]); $this->temp["_mod_indefier"]=$this->temp["_mod_access"]; if($this->temp["_mod_indefier"]==$module)( $this->temp[ "_perms"]=explode(",",$this->temp["_mod_access"]); switch($act)( case "r": $this->temp["_result"]=($this-> temp["_perms"]==1) case "w": $this->temp["_result"]==1)? ) ) mysql_close($conn_id); return $this->temp["_result"]; ) ) ?>

Ova klasa implementira funkcije dizajnirane za implementaciju gore opisanog algoritamskog zadatka. Sada ćemo raspravljati o svakoj funkciji zasebno.

secure::getUserId() funkcija

Koristeći ovu funkciju, mislimo da je tijekom autorizacije korisnika u sustavu varijabla `site_hash` postavljena u varijablu okruženja $_COOKIE, koja se sastoji od identifikatora korisnika u sustavu i hasha za provjeru njegove autentičnosti u sustavu. Funkcija jednostavno uklanja vrijednost identifikatora, vraćajući njegovu vrijednost kao izlaz.

Funkcija secure::getUserSecurityAccess($id)

Na izlazu ova funkcija vraća identifikator sigurnosnog profila trenutnog korisnika u sustavu.

Funkcija secure::checkUserPermission($module,$act))

Zahtjev se upućuje bazi podataka u vezi s pravima korisnika za izvođenje radnji čitanja/pisanja u kontekstu modula koji je proslijeđen kao parametar.

Ostaje još samo opisati postupak kreiranja varijable u okruženju $_COOKIE i tema članka se može smatrati riješenom.

Postupak autorizacije izgledat će tako da se osobni podaci korisnika (login i lozinka) unose u poseban obrazac, nakon čijeg slanja će se podaci koje je korisnik dostavio obraditi metodom funkcije checkAuthData(), te će se, ako su podaci ispravni, korisnički podaci bit će spremljeni kao kolačići za snimanje tijekom razdoblja koje je postavio korisnik ili u nedostatku navedene vrijednosti, tijekom zadanog razdoblja.

Kako bismo provjerili autentičnost podataka pohranjenih u varijabli okoline $_COOKIE, koristit ćemo funkciju EatCookie(), koja će potvrditi podatke vraćanjem Booleovog rezultata provjere (true - false).

Ne dajem obrazac za slanje, budući da to nije dio teorije programiranja, ukazuje samo na identifikatore polja.

  • `ulogin` - prijava korisnika
  • `upasswd` - korisnička lozinka
  • `stime` - vrijeme sesije koje postavlja korisnik (od 1 do 5 sati)
  • `auth` - naziv gumba za slanje

To je sve. Ostaje samo da pokušavate, eksperimentirate, griješite i nađete rješenje koje u potpunosti prepuštam vama.

Nadam se da ćemo se uskoro sresti, a za one koji imaju pitanje za mene u vezi članka, i ne samo - pišite na [e-mail zaštićen], na bilo kojem [e-mail zaštićen].

S poštovanjem, Kirill Karpenko, voditelj IT odjela INPP-a.



reci prijateljima
Pročitajte također