Scrie o funcție în PHP 7+ care să verifice un număr natural


(Alex) #81

sa stii ca intr-un final vrem sa vedem si o solutie


(Serghei Amelian) #82

Cine ştie ce temă rezolvăm pentru el… :slight_smile:


#83

Bună asta :))


(Alex) #84

ok, recunosc ca n-am nici cea mai mica idee cum sa verific daca-i obiect fara sa-mi scuipe un notice.
astept niste indrumari.

function is_natural( $number = null ) {
	return $number !== null  && $number != (object) $number && $number != (array) $number && (string) $number === (string) (int) $number && (float) $number == (int) $number && (int) $number >= 0 && (int) $number < 9876543211;

}

(Georgiana Gligor) #85

Este un subiect de dezbatut, nu cred ca trebuie pus ca si conditie “nu treci testul daca nu faci asa”.
Da, au fost vremuri cand conta, si eu aveam mania asta. Dar m-am vindecat de ceva vreme. Ca idee, cand am inceput eu PHP, coding standard era Hungarian Notation. Sper sa puteti citi fara sa radeti.

$iCount = 0;
$sMessage = 'Kid me not';
$aItems = array();
$oPerson = new Person('John', 'Doe');

Erau si diferente mari de executie intre

// cel mai lent, se parsa stringul si daca nu erau variable in interiorul lui
$mesaj = "$altaValoare si inca ceva";

// rapid dar greu lizibil, error prone
$mesaj = $altaValoare . ' si inca ceva';

// best compromise intre viteza si readability
$mesaj = sprintf('%s si inca ceva', $altaValoare);

Nu mai e cazul, ne putem intoarce la varianta aceea ingrozitoare prima. Nikita Popov care a codat majoritatea speed improvements din PHP 7 (AST adica) ne spunea primavara trecuta printre 2 spaghete ca nici lui nu-i place option 1 dar e plin de oameni care numai asa stiu sa faca si a trebuit “rapidizata”.

Suntem in 2018, avem opcache de la 5.5 incoace, deci nu mai trebuie sa umblam cu soparla apcache sau alte cele pentru speed. Iar de la 7.1 in sus chiar nu are sens sa ne batem capul cu micro-optimizari de acest tip.
ASa cum zice @Catalin-Ionut mai sus, codul trebuie sa fie citit in primul rand de oameni.


(cosmos) #86

https://secure.php.net/manual/en/language.types.type-juggling.php

:slight_smile:


Am mai vazut variabile de acel tip

  • szBla
  • uchUser
    Codul nu mi s-a parut lizibil

#87

Funcția lui Serghei este corectă.

2.0 ajunge float 2 în funcție, ca și 1e3. Iar 2 este număr natural.

Singura greșeală, pe care mă fac că n-o observ este că verifică cu < 9876543212 în loc de < 9876543211. Mai mult ca sigur oboseala era de vină.

Cât despre codul scurt:

Dacă primul lucru pe care îl făceai era să scapi de spații libere și să redenumești variabilele, al doilea lucru care te interesa era să vezi dacă există metode mai simple prin care se poate face verificarea. Aici am vrut să ajung.

Cererea îi era adresată inițiatorului subiectului, care în mod clar nu mi-a inspirat că ar fi destul de pregătit să treacă prin toate cerințele mele. Lucrul ăsta îl putea trimite pe documentații, ceea ce nu era rău. Putea să scape cel puțin de condițiile clasice if / else

Știu despre opcache. A fost un subiect care m-a interesat foarte mult acum câțiva ani, când încercam să înțeleg dacă comentariile afectează durata de interpretare a scripturilor.

Deci, încă o dată, cerința cu numărul de caractere trebuia să afecteze modul în care se făcea verificarea în acea funcție. Nu puteam să spun asta, dar puteam să cer un cod scurt.


(Serghei Amelian) #89

Cred că cerinţa ar trebui să fie “cod concis”, nu “numar de caractere redus”. Concizia e una, obfuscarea codului e cu totul altceva… In orice caz, sunt sigur ca in PHP parsarea codului-sursă este nesemnificativă, în comparaţie cu execuţia în in sine, chiar dacă n-ar exista niciun un fel de cache.