Conversia tipului de text în int php. Manipularea tipurilor de date PHP

Informația a fost întotdeauna reprezentată prin simboluri. Abia atunci când a apărut programarea a devenit parțial litere, cifre și semne (în sens formal).

Până la un anumit moment, cele mai populare erau vorbirea orală, simbolurile realizate manual, gesturile, precum și operele de artă, în special. Este important ca toate aceste opțiuni pentru prezentarea naturală a informațiilor, de la mic la mare, să poată fi întotdeauna descrise în cuvinte, adică făcute accesibile procesare softwareîntr-un sens sau altul.

Șiruri și numere

Corzile sunt, în primul rând, colecții diverse personaje. ÎN mijloace diferite programare, partea fracționată a fost separată de întreg în moduri diferite. Unii au preferat un punct, alții o virgulă (în PHP, conversia unui șir într-un număr implică „.”). Triadele au fost împărțite un singur apostrof, virgulă sau spațiu. Numerele reale erau scrise cu litera „E”.

Toate acestea sunt formalități. Matematica și principiile de funcționare ale oricărui procesor au recunoscut întotdeauna numerele fără bibelouri, iar procesoarele suplimentare corespunzătoare au fost dezvoltate pentru a lucra cu valori reale.

Dar o lume de variabile tip specific(pentru programe de epocă timpurie) și implementarea ideii moderne de consens pentru toate tipurile de date înseamnă: în PHP, conversia unui șir într-un număr este la fel cu a nu face nimic. ÎN cel mai bun scenariu PHP va „taie”, sau mai precis, îl va face 0 sau un număr, dacă există cel puțin o cifră în șirul sursă. Toate cifrele până la primul caracter fără cifre se vor adăuga la acest număr.

Regula generală de conversie

În PHP, conversia unui șir într-un număr, cu excepția cazului în care programatorul a specificat altfel, are loc automat în momentul aplicării. Dacă o variabilă conține doar numere și o perioadă, atunci se poate obține un număr real. Dacă o virgulă este întâlnită într-o succesiune de numere, atunci tot ceea ce vine înaintea ei va fi interpretat ca un număr, desigur, un număr întreg.

Orice caracter nenumeric din secvența de cifre oprește procesul și rezultatul este Conversii PHP„șir la număr” va fi doar valoarea care a fost formată înainte de primul caracter fără cifre.

Matematică și prelucrarea simbolurilor

Ce este mai dificil, primul sau al doilea, chiar și din punct de vedere al formulelor care nu se potrivesc pe pagină, matrici impresionante, grafice pe care uneori nici autorii nu le pot descurca, derivate de integrale, diferențiale de integrale și polinoame din a n-a generație. , este foarte simplu de spus: societatea , desigur, onorează meritele matematicii și ale matematicienilor, dar prelucrarea simbolurilor este mai importantă, mai complexă și acoperă matematica ca o plapumă, oferind o minte iscoditoare care nu poate depăși magia cifre, un mediu favorabil creativității.

De obicei pe șir PHP este convertit automat într-un număr, dar nu este niciodată o idee rea să verificați acest lucru. Cel mai bine este să fii întotdeauna sigur că PHP înțelege corect că o anumită variabilă este un număr. Dacă există chiar și o umbră de îndoială, ar trebui să specificați în mod explicit tipul variabilei (int) sau (float) înainte de valoare și să verificați cum înțelege PHP tipul funcții variabile is_integer() sau is_float().

Tendințele moderne de programare

Interpretarea clasică a problemei PHP „șir la număr” se află în cadrul reprezentărilor programare modernă. Proces invers are opțiuni mult mai diverse. Funcții number_format(), printf(), sprintf() pot face minuni, nu numai la nivelul unui număr, ci și la un grup de numere.

Conversie în PHP" linie la număr" indică, mai degrabă, că putem face acest lucru, dar m matematica și calculele numerice nu sunt punctul nostru forte.

Scrierea unei funcționalități decente și de încredere care implementează cutare sau cutare procesare a numărului în PHP nu este o problemă, iar rezultatul nu va fi mai rău decât rezultatul din mai multe limbaje matematice. PHP este, în primul rând, un limbaj server, un limbaj de procesare a informațiilor, inclusiv a informațiilor matematice.

Am o aplicație care atinge clienți din toată lumea și, desigur, vreau ca tot ceea ce intră în bazele mele de date să fie codificat în UTF-8.

Principala problemă pentru mine este că nu știu care va fi codificarea sursă a oricărui șir - ar putea fi de la câmp de text(utilizare

util doar dacă utilizatorul a trimis efectiv formularul) sau ar putea fi de la un încărcat fisier text, așa că chiar nu pot controla intrarea.

Am nevoie de o funcție sau o clasă care să asigure că lucrurile care vin în baza mea de date sunt, pe cât posibil, codificate UTF-8. Am încercat iconv(mb_detect_encoding($text), "UTF-8", $text); dar aceasta are probleme (dacă intrarea este „logodnică”, returnează „logodnic”). Am incercat multe lucruri =/

Pentru încărcarea fișierelor îmi place ideea de a întreba Utilizator final indicați codificarea pe care o folosesc și afișați-le previzualizare despre cum va arăta rezultatul, dar asta nu ajută împotriva hackerilor urâți (de fapt, le-ar putea face viața puțin mai ușoară).

Am citit și alte întrebări SO pe acest subiect, dar par să aibă diferențe subtile, cum ar fi „Trebuie să analizez fluxurile RSS” sau „Elimin datele de pe site-uri web” (sau, într-adevăr, „Nu poți”).

Dar trebuie să fie ceva care macar, o încercare bună!

9 răspunsuri

Ceea ce ceri este extrem de dificil. Dacă este posibil, cel mai bine este să setați codificarea pentru utilizator. Prevenirea unui atac nu trebuie să fie mult mai ușoară sau mai dificilă.

Cu toate acestea, puteți încerca:

Iconv(mb_detect_encoding($text, mb_detect_order(), true), "UTF-8", $text);

Setarea unei valori stricte vă poate ajuta să obțineți rezultate mai bune.

În patria noastră, Rusia, avem 4 codificări populare, așa că întrebarea dvs. este foarte populară aici.

Numai cu codurile de caractere nu puteți detecta codificarea deoarece paginile de cod se suprapun. Câteva pagini de coduri limbi diferite chiar au intersecție completă. Asa de, avem nevoie de o abordare diferită.

Singura modalitate de a lucra cu codificări necunoscute este să lucrezi cu probabilități. Deci nu vrem să răspundem la întrebarea „care este codificarea acestui text?”, încercăm să înțelegem „ care este cel mai probabil codarea acestui text?".

Un tip de la un blog popular rusesc de tehnologie a venit cu această abordare:

Creați un interval de probabilitate de coduri de caractere în fiecare codificare pe care doriți să o acceptați. Îl poți construi folosind câteva texte mariîn limba ta (de ex. niște ficțiune, folosește Shakespeare pentru engleză și Tolstoi pentru rusă, lol). Veți obține ceva de genul acesta:

Encoding_1: 190 => 0.095249209893009, 222 => 0.095249209893009, ... encoding_2: 239 => 0.095249209893009, 207 => 0.095249209893009, ... encoding_2: 239 => 0.095249209893009, 207 => 0.095249209893009,...

Mai departe. Luați text într-o codificare necunoscută și pentru fiecare codificare din „dicționarul de probabilitate” căutați frecvența fiecărui caracter din text cu codificarea necunoscută. Probabilitatea totală a simbolurilor. Codarea cu rating ridicat, este probabil câștigătorul. Cele mai bune rezultate pentru texte mari.

Dacă sunteți interesat, vă pot ajuta cu plăcere să rezolvați această problemă. Putem îmbunătăți în mod semnificativ acuratețea creând o listă de două caractere de probabilități.

Btw. mb_detect_encoding cu siguranță nu funcționează. Da, în general. Te rog să arunci o privire sursă mb_detect_encoding în „ext/mbstring/libmbfl/mbfl/mbfl_ident.c”.

Probabil ați încercat asta, dar de ce să nu folosiți funcția mb_convert_encoding? Va încerca să determine automat setul de caractere al textului furnizat sau îi puteți trece o listă.

În plus, am încercat să alerg:

$text = "logodnica"; echo mb_convert_encoding($text, "UTF-8"); ecou"

"; echo iconv(mb_detect_encoding($text), "UTF-8", $text);

iar rezultatele sunt aceleași pentru ambele. Cum vezi că textul tău este trunchiat la „logodnic”? este in baza de date sau in browser?

Este imposibil să identifici o codificare de șir care este complet exactă. Există modalități de a încerca să ghicească codificarea. Una dintre aceste metode, și probabil/în prezent cea mai bună în PHP, este mb_detect_encoding(). Aceasta vă scanează șirul și caută aparițiile unor lucruri unice pentru anumite codificări. În funcție de șirul dvs., este posibil să nu existe astfel de cazuri distincte.

Luați codificarea ISO-8859-1 și ISO-8859-15 (http://en.wikipedia.org/wiki/ISO/IEC_8859-15#Changes_from_ISO-8859-1)

Există doar câteva caractere diferite și, pentru a le înrăutăți, sunt reprezentate de aceiași octeți. Este imposibil să descoperi, având în vedere un șir fără a cunoaște codificarea acestuia, dacă octetul 0xA4 ar trebui să reprezinte ¤ sau € în șirul tău, așa că nu există nicio modalitate de a-i cunoaște codificarea exactă.

(Notă: puteți adăuga un element uman sau o metodă de scanare și mai avansată (cum ar fi ceea ce sugerează Oroboros102) pentru a încerca să vă dați seama, pe baza contextului înconjurător, dacă personajul ar trebui să fie ¤ sau €, deși și asta pare o punte. departe)

Există diferențe mai distincte între, de exemplu, UTF-8 și ISO-8859-1, așa că merită totuși să încerci să-l dai seama când nu ești sigur, deși poți și nu ar trebui să te bazezi că este corect.

Există și alte modalități de a asigura codificarea corectă. În ceea ce privește formularele, încercați să forțați UTF-8 cât mai mult posibil (verificați Snowman pentru a vă asigura că veți reprezenta UTF-8 în fiecare browser: http://intertwingly.net/blog/2010/07/29/Rails-and- Oameni de zăpadă) Acest lucru se face astfel încât cel puțin să puteți fi sigur că fiecare text trimis prin formularele dvs. este utf_8. Pentru fișierele descărcate, încercați să rulați comanda unix„fișier -i” pe el, de exemplu. exec() (dacă este posibil pe serverul dvs.) pentru a ajuta descoperirea (folosind specificația documentului). În ceea ce privește datele de scraping, puteți citi anteturile HTTP, care de obicei determină codificarea. Când se analizează fișiere XML consultați Dacă metadatele XML conțin o definiție de set de caractere.

În loc să încercați să ghiciți automat codificarea, ar trebui să încercați mai întâi să furnizați codificarea specifică, dacă este posibil, sau să încercați să obțineți definiția de la sursa de la care o obțineți (dacă este cazul) înainte de a recurge la detectare.

Principala problemă pentru mine este că nu știu care va fi codificarea sursă a oricărui șir - ar putea fi dintr-un câmp de text (util doar dacă utilizatorul a trimis formularul) sau ar putea fi dintr-un text încărcat fișier, așa că chiar nu pot controla intrarea.

Nu cred că aceasta este o problemă. Aplicația cunoaște sursa de intrare. Dacă este dintr-un formular, utilizați codificarea UTF-8 în cazul dvs. Funcționează. Doar asigurați-vă că datele furnizate sunt codificate corect (verificați). Rețineți că nu toate bazele de date acceptă pe deplin UTF-8.

Dacă este un fișier, nu îl veți salva în codificare UTF-8 în baza de date, ci în formă binară. Când scoateți din nou fișierul, utilizați și ieșirea binară, atunci este complet transparent.

Ideea ta este bună că utilizatorul poate spune codificarea dacă poate spune oricum după descărcarea fișierului, deoarece este binar.

Așa că trebuie să recunosc că nu văd problema specifică pe care o ridicați cu întrebarea dvs. Dar poate poți adăuga câteva detalii despre problema ta.

Grim, există câteva răspunsuri foarte bune și încercări de a răspunde la întrebarea ta aici. Aș dori să mulțumesc tuturor pentru răspunsurile lor. Sunt superbe. Nu sunt un maestru de codare, dar înțeleg dorința ta de a avea o stivă pură UTF-8 în baza ta de date. Folosesc MySQL utf8mb4 pentru tabele, câmpuri și conexiuni.

Situația mea sa rezumat la „Vreau doar ca dezinfectanții, validatorii, logica de afaceri și declarațiile pregătite să gestioneze UTF-8 atunci când datele provin de la Formulare HTML sau link-uri pentru înregistrare e-mail". Deci, cred că am început cu această idee:

  • Încercarea de a detecta codificarea: $encodings = ["UTF-8", "ISO-8859-1", "ASCII"];
  • Dacă codificarea nu poate fi detectată, aruncați o nouă excepție RuntimeException
  • Dacă intrarea este UTF-8, continuați.
  • În caz contrar, dacă este ISO-8859-1 sau ASCII

    A. Se încearcă conversia în UTF-8 (în așteptare, nefinalizată)

    b. Determinați codarea valorii convertite

    Cu. Dacă valoarea raportată codificată și convertită este UTF-8, continuați.

    e. Altfel, lansați o nouă excepție Runtime

Din a mea clasa abstractă Dezinfectant

Funcția privată isUTF8($encoding, $value) ( ​​​​return (($encoding === "UTF-8")) && (utf8_encode(utf8_decode($value)) === $valoare)); ) funcție privată utf8tify( Valoarea &$) ( ​​$encodings = ["UTF-8", "ISO-8859-1", "ASCII"]; mb_internal_encoding("UTF-8"); mb_substitute_character(0xfffd); //INLOCUITOR CARACTER mb_detect_order( $encodings); $stringEncoding = mb_detect_encoding($value, $encodings, true) if (!$stringEncoding) ( $value = null; arunca noua \RuntimeException("Nu se poate identifica codarea caracterelor in Sanitizer."); ) if ( $this-> isUTF8($stringEncoding, $value)) ( return; ) else ( $value = mb_convert_encoding($valoare, "UTF-8", $stringEncoding); $stringEncoding = mb_detect_encoding($valoare, $encodings, true) ; if ($ this->isUTF8($stringEncoding, $value)) ( return; ) else ( $value = null; throw new \RuntimeException("Nu se poate converti codarea caracterelor din ISO-8859-1, sau ASCII, în UTF -8 în dezinfectant ."); ) ) return; )

S-ar putea argumenta că ar trebui să decuplez preocupările de codificare de la clasa mea abstractă Sanitizer și pur și simplu să inserez un obiect Encoder într-o instanță concretă a copilului Sanitizer. Cu toate acestea, principala problemă a abordării mele este că eu, fără nicio cunoștință, resping tipurile de codare de care nu am nevoie (și mă bazez pe Funcții PHP mb_ *). Fără studii suplimentare, nu pot să știu dacă unii oameni sunt răniți sau nu (sau dacă pierd Informații importante). Așa că trebuie să știu mai multe. Am gasit acest articol.

Printre diversele sarcini de programare, diferite manipulări cu valori de dată și oră sunt destul de comune. Rar sistem automatizat, baza de date se poate descurca fără a stoca informații despre timpul unui anumit proces. Pe lângă cea mai simplă adăugare a unei date într-o înregistrare a bazei de date sau afișarea acestei date, există multe sarcini de afișare a acestor date în sub diverse forme, verificând dacă ora curentă se potrivește cu un anumit cronometru, calculând perioada dintre două date și multe altele.

Pentru a facilita lucrul cu datele, fiecare limbaj de programare are propriile tipuri de date speciale pentru stocarea valorilor datei și orei. Cel mai adesea asta valoare numerica, fie număr întreg, fie virgulă mobilă.

ÎN Funcționează PHP cu o dată, cel mai adesea întâlnește UNIX TIMESTAMP. Aici timpul este stocat ca un număr întreg. Calculul timpului începe la 1 ianuarie 1970. Prin urmare, de exemplu, data și ora 12/11/2014 19:40:00 ar fi reprezentate de numărul 1418316000. Acest număr arată câte secunde au trecut de la data zero de 1 ianuarie 1970, numită Epoca Unix.

Un exemplu de pagină PHP care oferă capabilități de conversie a datelor este prezentat pe site în sectiunea programului program „Conversia formatului de dată și oră”. Aici puteți crea data dorităîn formatul UNIX TIMESTAMP, precum și aduce acest format într-o formă standard, care poate fi citită de om.

Obținerea orei și datei curente în PHP

Pentru a obține ora actuală a serverului, utilizați funcția

int time(void)

care va returna valoarea în format de marcaj temporal Unix.

timpul ecou(); // scoateți ora curentă în format de marcaj temporal Unix

La prima vedere, acesta nu este un format foarte convenabil pentru o persoană, dar, după cum știți, decât prezentare mai simplă date, cu atât computerul procesează mai repede aceste valori. În plus, stocarea unui număr într-o bază de date este mult mai rentabilă decât utilizarea oricărui format special. De asemenea, PHP funcționează la fel de-a lungul timpului atât pe Unix, cât și Platforma Windows, ceea ce face posibilă utilizarea codului pe oricare dintre aceste platforme.

Convertiți formatul de dată și oră în PHP

Cel mai simplu mecanism pentru conversia unei valori numerice a datei în valori mai ușor de înțeles este oferit de funcția:

matrice getdate()

Returnează o matrice asociativă care conține informații despre dată. Dacă parametrul timestamp nu este specificat, ora curentă va fi returnată. Această matrice conține următoarele valori:

Matricea rezultată vă permite să afișați valorile în forma dorită:

$date = 1418372345;
$date_mas = getdate($data);
echo $date_mas["mday"] . " . " . $date_mas["lună"] . " . " . $date_mas["an"]; // 12.12.2014


De asemenea, puteți utiliza funcția pentru a converti formatul de dată și oră:

șir data(șir $șablon [, int $unix_timestamp])

Este destinat obținerii curentului date unix marca temporală în formatul necesar. Parametrul șir $template specifică formatul de ieșire. Parametrul $unix_timestamp poate fi folosit pentru a specifica valoarea timpului cu care să lucrați. Este optional, deci daca nu este specificat va fi folosit Data curentă si timpul.

Formatul este specificat de următoarele valori:

A„înainte” și „după” amiază: „am” sau „pm”
A„înainte” și „după” amiază cu litere mari: "AM sau PM"
dziua lunii din 2 cifre (dacă este mai mică de 10, zero este primul) (de la 01 la 31)
Dziua saptamanii in 3 litere. De exemplu, „Luni” (luni)
jziua lunii, 1-2 cifre fără zerouri inițiale (de la 1 la 31)
Fnumele lunii. De exemplu, „ianuarie”
horă, format de 12 ore (de la 01 la 12)
Horă, format de 24 de ore (de la 00 la 23)
goră, format de 12 ore fără zerouri (de la 1 la 12)
Goră, format de 24 de ore fără zerouri (de la 0 la 23)
iminute (de la 00 la 59)
I (majusculă i)1 dacă ora de vară este în vigoare, în caz contrar 0
L1 dacă anul este un an bisect sau 0 dacă nu este un an bisect
Bora în format de oră de internet ( sistem alternativ numărătoarea inversă a orei zilei) (de la 000 la 999)
Tfusul orar al computerului. De exemplu, MDT
l (L minuscule)zi a săptămânii. De exemplu, „luni”
mlună, două cifre cu zerouri (de la 01 la 12)
nlună, una sau două cifre fără zero (de la 1 la 12)
Mnumele prescurtat al lunii. De exemplu, „Ian”
tnumărul de zile din luna specificată (de la 28 la 31)
ssecunde (de la 0 la 59)
SSufixul numerelor ordinale din două litere din engleză ("st", "nd", "rd" sau "th")
Unumăr întreg de secunde de la începutul epocii UNIX
yan, digital, 2 cifre (14)
Yan, digital, 4 cifre (2014)
znumărul ordinal al zilei din an (de la 0 la 365)
Zcompensare a fusului orar în secunde (de la -43200 la 43200)
Nnumăr de serie zile ale săptămânii de la 1 (luni) la 7 (duminică) în conformitate cu standardul ISO-8601, (adăugat la versiuni PHP 5.1.0)
wnumărul de serie al zilei săptămânii de la 0 (duminică) la 6 (sâmbătă)
Wnumărul de serie al săptămânii din an în conformitate cu standardul ISO-8601; săptămânile încep luni (adăugat în PHP 4.1.0)
onumărul de an conform standardului ISO-8601. Are aceeași semnificație cu Y, cu excepția cazului în care numărul săptămânii ISO (W) este din anul precedent sau următor; atunci se va folosi anul acelei săptămâni. (adăugat în PHP 5.1.0)
ecodul de scară a fusului orar. De exemplu: UTC, GMT, Atlantic/Azore (adăugat în PHP 5.1.0)
Odiferență față de ora Greenwich, în ore. De exemplu: +0200
Pdiferență față de Greenwich Mean Time cu două puncte între ore și minute. De exemplu: +02:00 (adăugat în PHP 5.1.3)
cdata în format standard ISO 8601 De exemplu, 2014-12-12T15:19:21+00:00 (adăugat în PHP 5).
rdata în format » RFC 2822 De exemplu: Joi, 21 Dec 2000 16:01:07 +0200
Unumărul de secunde care au trecut de la începutul epocii Unix (Epoca Unix, 1 ianuarie 1970 00:00:00 GMT)

După cum puteți vedea din listă, puteți obține o mulțime de date utile folosind această funcție. De exemplu:

$date = 1418372345; // data si ora initiala 12/12/2014 11:19:05

echo date("d.m.Y" , $date); // 12.12.2014 (data)
echo date("H:i:s" , $data); // 11:19:05 (ora)
echo date("H:i" , $data); // 11:19 (ora)
echo date("t" , $data); // 31 (numărul de zile dintr-o lună)
echo date("z" , $data); // 345 (numărul ordinal al zilei din an)
echo date("l dS \of F Y h:i:s A" , $data); // Vineri, 12 decembrie 2014, ora 11:19:05

Alte caractere incluse în model vor fi tipărite așa cum sunt pe linie. Dacă trebuie să introduceți un caracter care este utilizat în funcție ca cod de format, caracterul „\” este inserat în fața lor. Pentru valoarea „\n” (caracterul de tranziție linie nouă), trebuie să specificați „\\n”. Astfel, puteți scoate un mesaj întreg care conține informații despre dată și oră:

data ecou( "Astăzi a z-a zi Y an", $data); // Astăzi este a 345-a zi a anului 2014

Convertiți data și ora în formatul de marcaj de timp

Pentru a inversa conversia datei de la format standard Funcția este aplicată valorii numerice de marcaj temporal:

int mktime(]]]]]])

Funcția mktime() returnează valoarea timpului Unix corespunzătoare datei și orei specificate de argumentele sale. De exemplu:

$my_date = mktime(10, 30, 0, 12, 12, 2014);

Ar trebui să fiți atenți la ordinea argumentelor funcției: ore, minute, secunde, lună, zi, an.

Cu exceptia formare simplă valorile datei în marca temporală, funcția mktime() poate fi utilizată pentru a efectua aritmetic cu date. Pentru a face acest lucru, puteți introduce pur și simplu argumentele necesare. De exemplu, dacă specificați luna a 14-a, atunci în valoarea finală luna va fi a 2-a, iar valoarea anului va crește cu unu:

$my_day = 12;
$my_month = 12;
$my_year = 2014;

$new_date = mktime(0, 0, 0, $my_month + 5, $my_day, $my_year);

echo date("d.m.Y" , $new_date); // 05/12/2015 (data)

Puteți face același lucru cu alți parametri.

Verificarea valabilității datei în PHP

Când lucrați cu date, mai ales când se generează o dată folosind funcția mktime() propusă mai sus, este necesar să se țină cont de corectitudinea datei introduse. Pentru a face acest lucru, PHP folosește funcția:

bool data de verificare (int luna, int zi, int an)

Returnează adevărat dacă data specificată de argumente este corectă; altfel se întoarce false. Data este considerată corectă dacă:

An în intervalul de la 1 la 32767;

Luna variază de la 1 la 12;

Ziua pentru o lună dată, luând în considerare anii bisecți, este indicată corect.

Exemplu de verificare a datei:

$my_day = 32;
$my_month = 12;
$my_year = 2014;

dacă (!checkdate($my_month, $my_day, $my_year))
ecou „Eroare: data este incorectă”;

PHP nu necesită (sau suportă) o definiție explicită a tipului atunci când declara o variabilă; tipul unei variabile este determinat în funcţie de contextul în care este utilizată. Adică, dacă atribuiți o valoare șir lui $var , $var va deveni un șir. Dacă apoi atribuiți $var o valoare întreagă, aceasta devine un număr întreg.

Un exemplu de conversie automată a tipului este operatorul de adăugare " + ". Dacă oricare dintre operanzi este un număr în virgulă mobilă, atunci toți operanzii sunt interpretați ca numere în virgulă mobilă, rezultatul va fi și un număr în virgulă mobilă. În caz contrar, operanzii vor fi interpretați ca numere întregi și rezultatul va fi, de asemenea, un număr în virgulă mobilă. întreg Rețineți că acest lucru NU schimbă tipurile de operanzi înșiși. Câteva exemple practice:

$foo = "0" ; // $foo este un șir (ASCII 48)
$foo += 2 ; // $foo este acum un număr întreg (2)
$foo = $foo + 1,3 ; // $foo este acum un float (3.3)
$foo = 5 + „10 purceluși” ; // $foo este un număr întreg (15)
$foo = 5 + „10 porci mici” ; // $foo este un număr întreg (15)
?>

Dacă doriți să testați oricare dintre exemplele furnizate în aceasta sectiune, puteți utiliza funcția var_dump() .

Atenţie: -1 conteaza ADEVĂRAT, ca orice număr diferit de zero (negativ sau pozitiv)!

Exemple de transformări:

var_dump ((bool) "" ); //bool(fals)
var_dump ((bool) 1 ); //bool(adevărat)
var_dump ((bool) - 2 ); //bool(adevărat)
var_dump ((bool) "foo" ); //bool(adevărat)
var_dump ((bool) 2.3e5 ); //bool(adevărat)
var_dump ((bool) matrice (12 )); //bool(adevărat)
var_dump((bool) array()); // bool(fals)
var_dump ((bool) „fals” ); //bool(adevărat)
?>

Conversia din boolean

FALS este convertit la 0 (zero) și ADEVĂRAT- în 1 (unitate).

Conversia din Float

La conversia de la un număr în virgulă mobilă la un număr întreg, numărul va fi rotunjit spre zero.

Dacă float depășește limitele întregului (de obicei +/- 2,15e+9 = 2^31), rezultatul va fi nedefinit deoarece întregul nu are suficientă precizie pentru a returna rezultatul corect. În acest caz, nu va fi afișată niciun avertisment sau măcar observație.

Atenţie! Nu convertiți niciodată o fracție necunoscută într-un întreg, deoarece uneori aceasta poate da rezultate neașteptate, de exemplu:

echo (int) ((0,1 + 0,7 ) * 10 ); // imprimă 7!
?>

Conversie din String

Conversii din alte tipuri

Pentru alte tipuri, comportamentul de conversie la un număr întreg este nedefinit. În prezent, comportamentul este același ca și cum valoarea ar fi fost mai întâi . in orice caz Nu Bazați-vă pe acest comportament, deoarece se poate schimba fără avertisment.

boolean ( boolean) sens ADEVĂRAT este convertit în șirul „1” și valoarea FALS reprezentat ca "" ( linie goală). În acest fel puteți converti valori în ambele direcții - de la tip boolean a înşira şi invers.

Număr întreg ( întreg) sau număr în virgulă mobilă ( pluti) este convertit într-un șir reprezentat de un număr format din cifrele sale (inclusiv exponentul pentru numerele cu virgulă mobilă).

Matricele sunt întotdeauna convertite în șirul „Matrice”, așa că nu puteți afișa conținutul matricei ( matrice), folosind ecou() sau imprimare() sa vezi ce contine. Pentru a vizualiza un singur element trebuie să faceți ceva de genul echo $arr["foo"] . Consultați mai jos sfaturi despre cum să afișați/vizualizați tot conținutul.

Obiectele sunt întotdeauna convertite în șirul „Obiect”. Dacă doriți să imprimați valoarea variabilei membru a unui obiect ( obiect) Pentru scopuri de depanare, citiți următoarele paragrafe. Dacă doriți să obțineți numele clasei obiectului necesar, utilizați get_class() .

Resursele sunt întotdeauna convertite în șiruri cu structura „ID resursă #1”, unde 1 este numărul unic al resursei ( resursă) care i-a fost atribuit de PHP în timpul execuției. Dacă doriți să obțineți tipul de resursă, utilizați .

NUL este întotdeauna convertit în șirul gol.

Imprimarea matricelor, obiectelor sau resurselor nu vă oferă niciuna Informatii utile despre semnificațiile în sine. O modalitate mai bună de a afișa valori pentru depanare este utilizarea funcțiilor print_r()Și var_dump() .

De asemenea, puteți converti valorile PHP în șiruri de caractere pentru stocare persistentă. Această metodă se numește serializare și poate fi realizată folosind funcția serialize(). În plus, dacă instalarea dvs. PHP are suport WDDX, puteți serializa valorile PHP în structuri XML.

Conversie la tipul Array

Pentru oricare dintre tipurile: întreg, pluti, şir, booleanȘi resursă dacă convertiți valoarea într-o matrice, veți ajunge la o matrice cu un element (la indicele 0) fiind valoarea scalară cu care ați început.

Dacă convertiți un obiect într-o matrice ( obiect), veți obține proprietățile (variabilele membre) ale acestui obiect ca elemente de matrice. Cheile vor fi numele variabilelor membre.

Dacă convertiți valoarea într-o matrice NUL, veți obține o matrice goală.

Conversie la tip de obiect

Dacă un obiect este convertit într-un obiect, acesta nu este modificat. Dacă o valoare de orice alt tip este convertită într-un obiect, este creată o nouă instanță a clasei încorporate stdClass. Dacă valoarea era goală, noua instanță va fi, de asemenea, goală. Pentru orice altă valoare, aceasta va fi conținută într-o variabilă membru scalară:

$obj = (obiect) "ciao" ;
echo $obj -> scalar ; // va imprima "ciao"
?>