Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] '==' vs '==='
Forum PHP.pl > Forum > Przedszkole
Fred1485
Pisząc dziś sobie klasę do łączenia z bazą napotkałem na dziwny dla mnie problem...

Zawsze robiłem w ten sposób:

  1. function jakas() {
  2.  
  3. if(cos) {
  4. return false
  5. }
  6.  
  7. }


A w innym pliku przy odwołaniu do tej funkcji np:

  1. if(jakas() == false) {
  2. echo 'blablabla'
  3. }


Nic dziwnego prosty kod wink.gif

Natomiast dziś zacząłem pisać klasę opartą na wyjątkach i jeśli coś pójdzie nie tak to mam
  1. return false
, dalej w innym plik mam odwołanie do tej klasy:

  1. $a = new klasa;
  2.  
  3. if($a->funkcja() == false) {
  4.  
  5. echo 'blad'
  6.  
  7. }


I błąd się pojawia zawsze, natomiast kiedy zmienie na

  1. $a = new klasa;
  2.  
  3. if($a->funkcja() === false) {
  4.  
  5. echo 'blad'
  6.  
  7. }

To działa bez żadnego problemu, dlaczego tak się dzieje (niby działa ale chcę widziec czemu) zawsze używałem '==' i działało a teraz nie?
com
pisząc == nie sprawdzasz tego jakiego dana zmienna jest typu, a przy === już tak smile.gif

poza tym co za sens sprawdzać czy 0=0, to zawsze daje prawde smile.gif
gorden
co zwraca klasa::funkcja() oprócz false?
sprawdź tabelę porównań: http://php.net/manual/pl/types.comparisons.php
Fred1485
To możę pokażę kod:

  1. <?php
  2.  
  3. class database {
  4.  
  5. private $host;
  6. private $user;
  7. private $password;
  8. private $database;
  9.  
  10. public $connection;
  11. public $error;
  12.  
  13. function __construct() {
  14.  
  15. //dane do bazy
  16. }
  17. public function connect_database() {
  18.  
  19. try {
  20.  
  21. $this->connection = @new mysqli($this->host, $this->user, $this->password, $this->database);
  22.  
  23. if($this->connection->connect_errno) {
  24.  
  25. throw new Exception($this->connection->connect_error, $this->connection->connect_errno);
  26. }
  27. }
  28. catch(Exception $error) {
  29.  
  30. return FALSE; //tymczasowo tylko żeby sprawdzić czy ogólnie skrypt działa
  31. }
  32. }
  33. }
  34.  
  35. $plik = new database;
  36. if($plik->connect_database() == FALSE) {
  37.  
  38. echo 'blad';
  39. }
  40.  
  41. ?>


I w tym wypadku błąd zawsze się pokaża, mówiecie żeby inaczej to zrobić i zamiast true/false cos innego?
Tuminure
Cytat
mówiecie żeby inaczej to zrobić i zamiast true/false cos innego?

Gdybyś zwracał true, to nie byłoby problemu wink.gif.

I wystarczy wtedy po prostu sprawdzenie...
  1. if($plik->connect_database()) {
  2. echo 'blad';
  3. }


Cytat
pisząc == nie sprawdzasz tego jakiego dana zmienna jest typu, a przy === już tak smile.gif

Przy == zmienne są konwertowane do tego samego typu, a przy === nie. Niby bez znaczenia, jednak Twoje tłumaczenie sugeruje, że === wykonuje dodatkowe operacje (i jest wolniejsze), podczas gdy to właśnie == wykonuje dodatkowe operacje smile.gif.
johny_s
Nic nie zwracasz jeśli funkcja wykona się poprawnie, więc albo dodasz jakiegoś returna przy poprawnym wywołaniu albo będziesz sprawdzał za pomocą ===
Fred1485
Bingo, wystarczyło dodać zwracanie TRUE jeśli wszystko OK, niby proste ale się zapomniało biggrin.gif

com
Tuminure
A guzik prawda, jak nie wiesz to poczytaj zanim dajesz rady innym. PHP w każdy wypadku rzutuje na typ bo nie ma silnego typowania, ale w wypadku == rzutuje także 0 stad też to co napisałem 0=0 ale to czy da się === czy == w tym wypadku niczego nie zmienia bo false === false daje tak czy tak true. I co jest niby wolniejsze pisałeś na to jakieś testy że coś takiego wysnuwasz?
Tuminure
@up
http://php.net/manual/en/language.operators.comparison.php ("The type conversion does not take place when the comparison is === or !== as this involves comparing the type as well as the value.")

a testy:
http://www.phpbench.com/ (switch/case/default vs. if/elseif/else)

PS Jeżeli jest jednak inaczej (tzn. coś źle zrozumiałem), to również prosiłbym o jakiś link/dłuższe wytłumaczenie.
com
Faktycznie jest tam taki zapis ale to się dotyczy całego kontekstu nie można brać tego pojedynczo, bo chodzi tam o ten zapis "If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically. " Czyli to co powiedziałem porównanie słabe skonwertuje nam do liczby i porówna, a silne patrzy nie tylko na wartość ale też na to jakiego ona jest typu, ale ponieważ nie ma typów w php to generalnie musi z tego ciągu go wyłuskać i to miałem na myśli, może nie wyraziłem się tam zbyt jasno, ok. A co do tych testów to nie do końca wiem czemu to chcesz przypisać, przyjęło się że switch jest lepszy od if ale testy te które pokazałes temu zaprzeczają.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.