internetul Windows. Android

Generator generează în PHP cum funcționează. Generatoare în PHP.

Bună ziua tuturor, astăzi vă voi spune despre generarea numerelor aleatorii în PHP. Datorită unei singure funcții, putem obține un număr aleatoriu din intervalul specificat, care este o sarcină destul de utilă. De exemplu, puteți retrage intrări aleatorii pe site, puteți implementa, de asemenea, un captiv. Numit acest lucru funcția mt_rand., Ca parametri, puteți specifica orice, iar apoi această funcție va returna un număr aleatoriu de la zero la valoarea maximă acceptată. Veți avea nevoie de această caracteristică fără a utiliza parametrii, dar totuși pentru a ști despre oportunitatea opțională de a indica, ți-am explicat-o. Doi parametri care pot fi setați în această caracteristică este valoarea minimă și valoarea maximă și veți fi returnați din această gamă de valori. Rămâne doar pentru a vă arăta un exemplu de utilizare a acesteia.

ecou. mt_rand () . "
" ;

ecou. mt_rand ( -5 , 7 ). "
" ;

ecou. mt_rand ( 3 , 20 ). "
" ;

?>

Acum vă sugerez să vă uitați la rezultatul executării codului nostru. Nu voi arăta o imagine, deoarece, de fiecare dată când pagina este actualizată, rezultatul se va schimba. În primul caz, veți primi un număr aleatoriu. În al doilea în intervalul de la minus cinci la șapte, și în al treilea de la trei la douăzeci. După cum puteți vedea, puteți indica o gamă negativă, așa că ți-am adus trei exemple. Nu este nimic mai mult despre această caracteristică, în curând!

Și acum luăm o funcție de generare a parolei gata și scrie un script pentru a restabili sau a crea o nouă parolă pentru utilizatorii site-ului dvs.

Scriptul de recuperare a parolei

Cum este scris scriptul?

Ca întotdeauna, este compilată o schemă treptată, ceea ce trebuie să facem în pași. Totul se întâmplă într-un singur fișier, memento.php

1. Porniți scriptul, numai dacă există o variabilă specifică, cum ar fi acțiunea $;

2. Pentru a porni procesul de generare a parolei, utilizatorul specifică adresa de e-mail $ _post [`Ema'l`]; Pentru a simplifica codul, atribuiți valoarea variabilei de e-mail $.

3. Verificăm cu expresii regulate toate caracterele pentru a vă asigura că utilizatorul indică corect adresa de e-mail. Dacă nu, luăm eroarea, nu mai folosim scenariul. Dacă totul are dreptate, mergeți mai departe.

4. Căutăm în baza de date, în cazul nostru, în tabelul utilizatorilor de utilizatori cu o adresă poștală. Dacă nu, oferim o eroare pe care nu există o astfel de adresă în baza de date și opriți funcționarea scriptului.

5. Utilizatorul cu această adresă din baza de date este, mergem mai departe și rulați funcția de a genera o nouă parolă. De asemenea, la e-mail, primim din baza de date un ID unic de utilizator și scrieți la variabila $ ID;

Reg.ru: domenii și găzduire

Cel mai mare înregistrator și furnizor de găzduire din Rusia.

Mai mult de 2 milioane de nume de domenii pentru întreținere.

Promovare, poștă pentru un domeniu, soluții de afaceri.

Mai mult de 700 de mii de clienți din întreaga lume și-au făcut deja alegerea.

Bootstrap Cadru: pâine adaptivă rapidă

Curs video pas cu pas cu privire la elementele de bază ale aspectului adaptiv în cadrul Bootstrap.

Aflați ușor, simplu, rapid și eficient, folosind un instrument puternic și practic.

Treceți la comandă și obțineți bani.

* Mouse-ul pentru suspendarea derulării.

Inapoi inainte

Generarea de linii aleatorii în PHP

În această scurtă notă, voi arăta cum puteți genera o linie aleatorie cu PHP.

O astfel de sarcină poate apărea într-o varietate de situații, de exemplu:

Crearea unei parole aleatoare dintr-un set de caractere preinstalate;

Generând un nume aleatoriu pentru un fișier sau un dosar (pentru a le ascunde și de a le proteja);

Crearea unui identificator unic temporar pentru orice proces;

Utilizați un șir aleatoriu ca un "material sursă" pentru un script mai complex etc.

În abordarea creativă, puteți găsi alte domenii de aplicare a unor rânduri aleatorii.

În PHP, nu există nici o funcție specială care să îndeplinească sarcina de interes pentru noi, astfel încât un astfel de instrument trebuie să scrie nevoilor lor.

Mai jos, dau una dintre soluțiile la această sarcină.

// funcția durează 2 parametri: lungimea liniei aleatorie și caracterele care sunt implicate în formarea funcției Random_String ($ str_length, $ str_characters) ($ str_characters \u003d matrice (0,1,2,3,4, 5,6,7,8, 9, "A", "B", "C", "E", "F", "G", "H", "I", "J", "K", "L", "N", "O", "P", "Q", "R", "T", "U", "V", "V", " "," X "," Z "," A "," B "," C "," E "," F "," G "," H "," I ", "J", "K", "M", "N", "O", "P", "Q", "R", "T", "T", "U", "V "," w "," x "," z "); // o funcție poate genera un șir aleatoriu și folosind cyrilic // $ str_characters \u003d matrice (0,1,2,3,4,5, 6,7,8,9 "A", "B", "în", "G", "D", "W", "S", "și", "K", "L" , "M", "O", "P", "C", "T", "U", "F", "X", "C", "H", "SH" "," Sh "," e "," yu "," i "); // returnați o minciună dacă primul parametru este zero sau nu este un număr întreg dacă (! IS_INT ($ str_length) || $ str_length< 0) { return false; } // Подсчитываем реальное количество символов, участвующих в формировании случайной строки и вычитаем 1 $characters_length = count($str_characters) - 1; // Объявляем переменную для хранения итогового результата $string = ""; // Формируем случайную строку в цикле for ($i = $str_length; $i > 0; $ i--) ($ string \u003d $ str_characters;) // returnați rezultatul de întoarcere $ string; )

Deoarece materialul este conceput pentru nou-veniți, voi face explicații ale acestei funcții.

Funcția de generare a liniei aleatorie are doi parametri. Primul este numărul de caractere pe care vrem să le vedem în șirul rezultat. Al doilea este gama de personaje pe care vrem să o folosim atunci când generăm.

Deoarece executarea funcției nu are sens la zero sau lungimea negativă a șirului rezultat și va fi încălcat la specificarea unui număr care nu este întreg, oferim aceste situații și returnând o minciună.

Dacă primul parametru este corect, numărăm numărul de caractere implicate în formarea șirului utilizând funcția Count () și scăzând de la unitatea rezultată. De ce o facem? Voi răspunde la această întrebare mai târziu, dar pentru moment mergem mai departe prin funcție.

Declarați o variabilă $ String. Pentru stocarea rezultatului final, procedăm la formarea unei linii aleatorii în ciclu pentru.

Ca valoare inițială a contorului $ I. Ciclul este numărul de caractere pe care dorim să le vedem într-o linie aleatorie ($ str_length).

Apoi, există o condiție ca ciclul să fie efectuat până când valoarea contorului este mai mare decât zero.

În cele din urmă, după fiecare iterație a ciclului, reducem valoarea contorului pe unitate utilizând operatorul de scădere "-".

Astfel, în ciclu, se vor face atât de multe iterații, câte caractere vrem să ajungem în rândul final.

Ei bine, acum să ne uităm la corpul ciclului și să revenim la întrebarea a ceea ce am scăpat o unitate a numărului total de caractere într-o variabilă $ str_characters..

După cum puteți vedea, formăm un șir final, adăugând în mod consecvent la variabila $ String. Un simbol pentru fiecare trecere prin ciclu.

Să arătăm mai detaliat.

Folosim funcția mt_rand () și transmiteți doi parametri la IT - zero și aceeași variabilă pe unitate $ Caractere_length.. Funcţie mt_rand () ne permite să generăm pur și simplu un număr aleatoriu într-o anumită gamă (adică de la zero la $ Caractere_length.).

Semnificația utilizării acestei caracteristici este că, cu ajutorul său, creăm un număr aleatoriu care este utilizat ca index pentru o matrice $ str_characters..

Indexul indică exact simbolul din matrice $ str_characters. Vrem să obținem.

Așa că am abordat punctul cheie. Dacă primul element a fost obținut utilizând designul formularului

$ str_characters;

apoi, ultimul element ar putea fi obținut prin scrierea următoarelor (la urma urmei, în matrice avem 62 de elemente):

$ str_characters;

Ar fi destul de logic, dar, din păcate, incorect.

De fapt, primul element este disponibil prin

$ str_characters;

și 62 element (ultimul) prin

$ str_characters;

Puteți să vă asigurați că prezentați pur și simplu aceste valori.

Acum devine complet clar de ce am fost scăzute din 62 de unități. Numai pentru a se asigura că gama indicii noștri este de la 0 la 61. Acest lucru ne va asigura că ne va oferi formarea corectă a unei linii aleatorii fără probabilitate de a se referi accidental la un element inexistent cu un index 62.

Asta e tot. Returnați o valoare utilizând operatorul Întoarcere. - Și funcția noastră este gata.

Rămâne să o sunați și să transferați numărul dorit de caractere ca parametru în linia noastră aleatorie, de exemplu, după cum urmează:

Echo Random_String (16, $ str_characters);

Ca rezultat, vom obține ceva complet incoerent, un fel de:

ATQ4LH9PNEM8CCXP.

Scopul este realizat și acum putem aplica creativ funcția noastră în cazul în care este necesar.

Desigur, funcția noastră este universală și funcționează perfect cu limba rusă. În codul de mai sus puteți vedea o altă variantă a matricei $ str_characters. (Este comentat), care conține caractere chirilice.

Pentru a vă asigura că putem comenta prima matrice. $ str_characters. (cu simboluri latine) și descărcați al doilea.

Acum, dacă actualizăm pagina, vom obține ceva de genul:

Jewd70y779teh5y.

Astfel, puteți utiliza orice caractere care doresc numai. Pentru a face acest lucru, puteți sau să le adăugați la o matrice existentă sau să creați una nouă.

Și în cele din urmă, o observație care poate fi utilă.

Sunt sigur că tu, ca utilizator, întâlnit cu parole generate aleatoriu, în care cu greu înțelege ce este simbolul:

Indiferent dacă litera mică "L", dacă cifra este "1";
- fie rusă "C", fie engleza "C";
- fie rusă "y", fie engleza "y";
- fie zero, indiferent dacă litera "o" (din nou, rusă sau engleză);
- etc.

Prin urmare, dacă tu generează un rând pentru alți utilizatori, merită să luăm în considerare faptul că ea pentru a fi clară pentru ei. Imaginați-vă că ați fost pe site-ul unei alte persoane și ghiciți: "Ce este?", "Scrisoarea sau o figură, naibii?"

Dacă ați auzit ceva despre iteratori, atunci probabil știți că iterația este un concept foarte important pentru lumea programării, dar punerea în aplicare a interfețelor necesare pentru crearea de obiecte-iteratoare poate fi o ocupație foarte dificilă din cauza unui număr mare de codul de șablon că este necesar să scrieți lucrării iteratorului. Dar, cu eliberarea PHP 5.5, generatoarele au venit în cele din urmă la noi!

În acest articol, voi considera generatoarele care permit un efort mare de a implementa funcționalitatea itheratoarelor simple fără a fi nevoie să trageți întreaga complexitate a interfeței Iterator..

Cum funcționează generatoarele?

Potrivit Wikipedia, generatorul "este foarte asemănător cu o funcție care returnează o matrice, deoarece generatorul are parametri de intrare, poate fi numit și generează o secvență de valori." În termeni generali, generatorul este o funcție regulată, dar în loc să returneze o valoare, aceasta oferă atât de multe valori așa cum poate fi necesar. Generatorul arată ca o funcție, dar se comportă ca un iterator.

Generatoarele utilizează un cuvânt cheie randament În loc de cuvânt Întoarcere.. Se comportă într-un mod similar și returnează o valoare la un punct de apel, cu diferența că funcția nu este scoasă din stivă, iar starea sa este stocată în memorie. Acest lucru permite funcțiilor să continue să lucreze din starea anterioară atunci când se află lângă apel. De fapt, nu puteți utiliza un cuvânt cheie Întoarcere. Pentru a returna valoarea generatorului și pentru a opri executarea generatorului.

PHP Manual citește: "Când generatorul este chemat, acesta returnează un obiect care poate fi declanșator." Este un obiect al clasei interne. Generator.care implementează interfața Iterator.Și se comportă ca un iterator unidirecțional. În timp ce cheltuiți iterația deasupra obiectului, PHP numește generatorul de fiecare dată când trebuie să obțină o valoare. Statul este salvat de fiecare dată când generatorul afișează o valoare, astfel că data viitoare PHP necesită o valoare, generatorul va restabili starea anterioară.

Acest cod va emite următoarele:

Generatorul a început să se producă 0 randatați 1 cu 2 randatați 3 randatați 4 Generatorul sa încheiat

Primul nostru generator

Generatoarele nu sunt un concept nou, ele există deja în astfel de limbi cum ar fi C #, Python, JavaScript și Ruby (contoare), ele pot fi determinate de obicei prin utilizarea unui cuvânt cheie randament. Acest cod este un exemplu în Python:

Să rescriem eșantionul generatorului Python în PHP. (Rețineți că ambele bucăți de cod nu-i pasă de verificările de eroare).

Funcția generatorului deschide fișierul și oferă fiecărei linii de fișier dacă a fost solicitată. De fiecare dată când sunați generatorul, acesta continuă să lucreze din statul anterior. Funcționarea funcției nu pornește mai întâi, deoarece starea sa a fost salvată înainte de efectuarea operatorului de randament. Odată ce toate liniile au fost mutate - generatorul își completează activitatea, ciclul este finalizat.

Întoarceți cheile

Iteratoarele din PHP constau dintr-o perechi de "cheie / valoare". În exemplul nostru, întoarcem doar valoarea, iar cheile din acest caz vor fi numerice (tastele implicite sunt numerice). Dacă trebuie să returnați perechile asociative - modificați formatul operatorului randament Astfel încât să se aprindă și cheia folosind sintaxa de matrice.

Implementarea valorilor

Operator randament Nu numai că returnează valorile - poate lua și valori din exterior. Acest lucru se face prin apelarea metodei () Obiectul generatorului cu transmiterea valorii necesare ca parametru. Această valoare poate fi utilizată în calcule sau alte operații. Metoda transmite valoarea generatorului ca urmare a executării randamentului și reluă executarea.

trimite ("opri"); ) ecou "($ v) n"; )

Producția va fi după cum urmează:

Salvați memoria utilizând generatoare

Generatoarele sunt bune atunci când procesați seturi de date mari și nu doriți să alocați memorie pentru toate rezultatele intermediare sau dacă nu știți, veți avea nevoie de toate aceste rezultate. Datorită metodei de procesare a rezultatelor, utilizarea memoriei poate fi redusă la minimul necesar pentru stocarea numai a rezultatului curent al lucrării.

Reprezintă rezultatul funcției fișier ()care returnează toate rândurile fișierului citit ca o matrice. Dacă comparați performanța funcției fișier () și funcția noastră file_lines () deasupra aceluiași fișier cu 100 paragrafe ale textului aleator, atunci funcția fișier () Va folosi aproximativ 110 de ori mai multă memorie decât generatorul.

Concluzie

Odată cu introducerea generatoarelor PHP oferă dezvoltatorilor un instrument puternic. Acum putem scrie rapid iteratoare, menținând în același timp cantități semnificative de memorie în timpul aplicației. Sper că în acest ghid am putut să vă dau suficiente informații, astfel încât să puteți începe să utilizați generatoarele din proiectele dvs.

Vă aduc atenția asupra deciziei dvs. de a genera HTML pe PHP. Sarcina pare a fi trivială, dar aș vrea să se extindă, pe scurt, dar în același timp cu o bună funcționalitate. Sa dovedit că nu este rău.

Imediat voi spune (cât mai mulți oameni iau în considerare în comentarii) că sarcina a fost stabilită să nu scrie un sistem de șablon (care și atât de mult) și să nu înlocuiască șablonul JavaScript. Știu perfect că adevărata cale este să împărțiți HTML și datele. Dar am avut nevoie să scriu HTML în clase, să creez o componentă-cadru, pe CGGRIDView în Yii, fie să încheie HTML în aceste locuri pentru a vă rezolva.

Scopul principal va scăpa de HTML în clase și funcții.

Un exemplu simplu, butonul obișnuit:

CHTML :: Creați () -\u003e P () -\u003e a (matrice (href "\u003d\u003e" http://habrahbr.ru "," clasa "\u003d\u003e" btn ")) -\u003e text (" go ") -\u003e Render ();
Rezultat:

Merge

Nimic viclean, ar fi posibil să se limiteze, dar ciclurile au dorit:
$ arr \u003d matrice ("1" \u003d\u003e "primul", "2" \u003d\u003e "secund"); CHTML :: Creați () -\u003e Selectați ($ Opțiuni) -\u003e Fiecare (CHTML :: Plainarray ($ arr, "valoare", "Text")) -\u003e Opțiune ("matrice (" valoare "\u003d\u003e $ date-\u003e Valoare) ") -\u003e Text (" $ date-\u003e Text ") -\u003e End () -\u003e Endech ()
A fost nevoie de aici pentru a apela funcția Plainarray () care transformă matricea:
$ Arr \u003d matrice (matrice ("valoare" \u003d\u003e "1", "text" \u003d\u003e "primul"), matrice ("valoare" \u003d\u003e "2", "text" \u003d\u003e "al doilea"));
Etichetele din interiorul ciclului pot conține funcții sau rânduri cu expresii EVAL, orice cuibărit, un exemplu cu o masă:

$ coloane \u003d matrice (matrice (id "\u003d\u003e" nume "," etichetă "\u003d\u003e" nume "), matrice (" id "\u003d\u003e" vârstă "," etichetă "\u003d\u003e" vârstă ")); $ Date \u003d Array (matrice (denumire "\u003d\u003e" Peter "," Vârsta "\u003d\u003e 29), Array (" Nume "\u003d\u003e" Vasily "," Vârsta "\u003d\u003e 32)); CHTML :: CREATE () -\u003e Tabel () -\u003e Tead () -\u003e TR () -\u003e Fiecare ($ coloane) -\u003e TH () -\u003e Text (Funcție ($ coloană) (Return $ coloană [etichetă]; )) -\u003e capăt () -\u003e capăt () -\u003e capăt () -\u003e tbody () -\u003e fiecare ($ date) -\u003e tr () -\u003e fiecare ($ coloane) -\u003e TD ( ) -\u003e Text (funcție (rând, $ coloană) (returnați $ rând [id-coloană [id]];)) -\u003e capătul () -\u003e capăh () -\u003e capătul () -\u003e Endech () -\u003e Render ( );

Etichetele deblocate sunt închise automat.

Clasa poate fi extinsă, până la utilizarea în forme. Vă puteți extinde din cauza moștenirii sau a dependenței, pentru modul în care sunt afișate fiecare etichetă și atributele acesteia, se utilizează o funcție, astfel încât să puteți suprascrie cu ușurință acest comportament.

Clasa CMYHTML extinde CHTML ($ Options \u003d Array ()) ($ implicit \u003d matrice ("href" \u003d\u003e "javascript: vid (0)"); returnare părinte :: a (array_replace ($ implicit, $ Options));) )

Clasa Cform (Private $ _Lastlabel \u003d ""; Funcția publică __construct (CModel $ model, chtml $ html \u003d null) ($ acest -\u003e _ model \u003d $ model; $ acest -\u003e _ HTML \u003d $ HTML?: CHTML :: Creați ();) Funcția publică __Call ($ metoda, $ PS) ($ Opțiuni \u003d $ PS? $ PS: matrice (); dacă ($ metoda \u003d\u003d\u003d "etichetă") ($ acest -\u003e _ LastlaBel \u003d Isset ($ Opțiuni ["pentru"])? $ Acest -\u003e _ Model-\u003e Gelabel ($ Opțiuni ["pentru"]): "";) dacă ($ metoda \u003d\u003d\u003d "text" && $ -\u003e _ Lastlabel) ($ Opțiuni \u003d $ Opțiuni?: $ acest -\u003e _ lastlabel; $ acest -\u003e _ lastlabel \u003d "";) $ acest -\u003e _ HTML -\u003e $ metoda ($ opțiuni); returnați acest lucru;))

Decizia însăși poate fi văzută și încercați să