Semnul de câine @ și suprimarea erorilor în rezultatul neașteptat php pentru array_walk

Într-un fel am întâlnit o problemă ciudată: când procesăm matricele printr-o funcție numită de comanda array_walk. În loc să verific o matrice, am decis să suprim mesajul de eroare dacă matricea nu există. După cum se spune, nu există instanță și nu există instanță. Matricea nu a fost o parte obligatorie a datelor, ea ar putea fi creată ca rezultat al codului anterior, sau ar putea să nu fie, în funcție de diferite condiții. Dacă este disponibil, matricea a fost procesată, în absența unui mesaj de eroare. Așa că am decis să nu verific existența matricei și să pun câinele array_walk pentru a simplifica codul.

Am fost foarte surprins când am aflat că matricea nu mai fusese procesată.

Vă sugerez să vă uitați la acest cod de testare:

Mai întâi scriu error_reporting (E_ALL). indiferent de setările serverului, vedeți erori PHP. Apoi, creez o funcție care atașează un cuvânt unui element de matrice. La ce, deoarece matricea este trecută prin referință, funcția ar trebui să modifice această matrice, în loc de copia transferată la ea. Dar, doar în cazul (mai bine să perebdet decât nedobdet), fac testul de ieșire din funcția de pe ecran.

Apoi, creez 3 matrice de test cu un set de cuvinte și pentru fiecare dintre ele am apel la funcția de procesare cu comanda array_walk. Dar în primul caz folosesc array_walk în forma sa pură, iar în următoarele două utilizez suprimarea mesajului de eroare, dacă matricea specificată nu există. În acest caz, într-o versiune am pus câinele înainte de a apela funcția, iar în cealaltă înainte de numele matricei. La început mi sa părut că acest lucru dă același rezultat. Pentru verificare, voi scoate conținutul matricelor după procesarea în interiorul blocului

.

Apoi, în același fel în care apelează procesarea matricelor existente, a cauzat procesarea celor inexistente pentru a vedea dacă mesajul de eroare este de fapt suprimat.

Și am obținut acest rezultat:

În interiorul funcției de băutură, totul se desfășura conform planului. PHP era gata să bea ceai, lapte și chiar bere. Cel puțin, ieșirea de pe ecran în interiorul funcției a corespuns celei așteptate. Dar, de fapt, sa dovedit că el este filonit și se toarnă în secret în whisky sub masă, pentru că atunci când verifică matrice prin print_r. cuvântul "băutură" nu sa alăturat nici la bere, nici la whisky.

De ce se întâmplă acest lucru, nu înțeleg total. La urma urmei, în interiorul funcției, totul părea excelent, indiferent de poziția câinelui când a fost chemat.

Apoi a venit verificarea suprimării erorii. Apelarea procesării unei matrice inexistente fără câine este de așteptat să producă un mesaj de eroare "argumentul trebuie să fie o matrice". Apelul de tratament, precedat de câine, se aștepta să nu semnaleze o eroare. Dar ceea ce se va întâmpla atunci când sunați cu un câine în fața unei serii, nu era cunoscut în prealabil. Fie PHP va fi, ca un pește, deoarece este interzis să vorbim despre o matrice, sau începe să se plângă că argumentul ar trebui să fie o matrice. Sa dovedit că se plânge. Se plânge dacă matricea nu o face. Simulează procesarea dacă există o matrice. Adică plasarea unui câine în fața unei matrice nu numai că nu dezactivează mesajul de eroare, ci cauzează și o eroare în prelucrarea datelor.

Numai plasarea câinelui înainte de a apela funcția dă rezultatul dorit: dacă matricea este, este procesată, dacă aceasta nu există, PHP trece silențios.

În cele din urmă, vreau să adaug că, în loc de array_walk, în cele mai multe cazuri este mai bine să folosiți array_walk_recursive. care vor procesa nu numai matrice simple, ci și cele multidimensionale cu toate nivelele lor de cuibărit. Este mai bine să folosiți array_walk_recursive imediat decât mai târziu, în cazul schimbării matricei, pentru a verifica dacă este procesată recursiv.