2013-06-02 7 views
10

przeglądałem przez kilka podobnych pytań, ale wszystkie one stwierdzają tylko fakt:Dlaczego PHP rzuca dwa ciągi liczbowe na liczby przed [luźnym] porównaniem ich?

If ... comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically.

Ok, rozumiem. Wyjaśnia on, co dzieje się po, gdy '00001' == '1' zwraca TRUE.

Pytanie brzmi: Dlaczego PHP to robi? Jaki jest powód sondowania ciągów liczbowych, a następnie odlewania, jeśli tak? Dlaczego nie możemy po prostu porównać dwóch ciągów?

Rozumiem, jakie rzutowanie jest wymagane, jeśli dwa operandy mają różne typy. Ale dlaczego robi "usual math", gdy oba są ciągami?

+1

Ponieważ nie pobierali podpowiedzi od Perla. : P O wiele łatwiej byłoby powiedzieć: "' == "porównuje numerycznie,' eq' porównuje leksykalnie, a '===' porównuje ściśle ". (Choć gdybyśmy mieli pierwsze dwa, ten drugi może nigdy nie być potrzebny.) Eh, może z obiektami.) – cHao

Odpowiedz

3

Ah, w końcu mam go. To było dość głupie.

Porównanie obejmuje nie tylko "is equal", ale także "less than" i "greater than". A dla tych dwóch ostatnich oczywiste jest, aby operatory numeryczne były przed porównaniem, ponieważ liczby często są reprezentowane w PHP jako łańcuchy, a 11 musi być większe niż 9, nawet jeśli oba są przechowywane w łańcuchach.

Tak, jak compare_function() robi wszystkich porównań naraz powraca albo 1, 0, -1 powiedzieć jeśli pierwszy argument jest większy, mniejszy lub równy odpowiednio drugie - dobrze, to dość wyjaśnia, dlaczego argumenty odlewu.

4

Można porównać dwa ciągi.

"00001" === "1" // false 

Pamiętaj == oznacza równowartość === oznacza równe

My tylko domyślać, dlaczego tak jest dlatego, że w początku PHP starał się być językiem typu mniej zanim poszli trasę staje się luźno napisany język.

PHP był pierwotnie procesorem, który pozwalał na trochę skryptów wewnątrz niego. Ponieważ wszystkie dane wejściowe w Internecie mają charakter tekstowy, musiały ciężko pracować, biorąc pod uwagę dane tekstowe, aby zachowywać się zdrowo, gdy chodziło o radzenie sobie z liczbami.

Mogę się mylić, ale nie sądzę, że możliwość jawnego przesyłania typów danych pojawiła się na scenie aż do PHP 4 z wprowadzeniem funkcji * val (np. Intval) itd. I myślę, że notacja odlewnicza, podobnie jak (int) pojawił się po tym.

Dla operacji nieporównywania było to dość proste, ponieważ wszystkie one mają typ skojarzony z nimi (+ -/* wszystkie traktują o liczbach, podczas gdy zajmuje się ciągami), więc jasna ścieżka do tego, jak rzeczy powinny być rzucane w tych przypadkach jest oczywiste.

Jednak przy sprawdzaniu równości lub równoważności między zmiennymi jedynym sposobem na to było traktowanie wszystkiego, co wyglądało jak liczba jako liczba, ponieważ w tym czasie jedynym sposobem, w jaki mogłoby to zostać uzyskane, byłoby zewnętrznie. ciąg i nie było sposobu, aby zrobić inaczej.

+0

Wiedziałem, że dostanę wiele takich odpowiedzi. TAK jest tooooo direct :) –

+2

@Orangepill - ale jego pytanie brzmi "Dlaczego?" – vidit

+0

@TwójCommonSense jest lepszy? – Orangepill

3

Ponieważ PHP produkuje produkt dla użytkowników końcowych, a nie dla programistów aplikacji. Więc kiedy produkować taki produkt jak niżej:

if (isset($_POST['submit'])){ 
    if ($_POST['myinput'] == "1") echo 'Yes'; //or == 1 
    else echo 'NO'; 
} 

    ?> 
    <form name="myform" method="POST" action=""> 
    <input name="myinput"> 
    <input name="submit" type="submit"> 
    </form> 

Jeśli użytkownik wchodzi 1 lub 0001, czego można się spodziewać, aby wydrukować zarówno w przypadku? Yes lub NO?

odpowiedź jest jasna. spodziewamy się zobaczyć Yes.tak to jest why PHP does so Jeśli z jakiegokolwiek powodu rzadkiego, musimy zdecydowanie je porównać, to powinniśmy zmienić == do ===

+0

Dodano opcję Upvote, ponieważ wiele decyzji dotyczących projektu, w szczególności równoważność między '1 'i' 00001'', '(int) 1' i' (float) 1.0', wynika z tego, że HTTP obsługuje wyłącznie łańcuchy. PHP próbuje ułatwić żonglowanie typem dla programistów w świecie zorientowanym wyłącznie na łańcuchy. – KyleWpppd

Powiązane problemy