2013-06-02 3 views
10

मैं कई इसी तरह के सवाल के माध्यम से ब्राउज़ किया, लेकिन वे सभी केवल तथ्य राज्य:क्यों PHP तुलनात्मक रूप से दो संख्यात्मक तारों को संख्याओं से तुलना करता है [संक्षेप में] उनकी तुलना करना?

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

ठीक है, मैं समझ गया। यह बताता है कि'00001' == '1'TRUE पर वापस आ रहा है।

सवाल यह है: क्यों PHP ऐसा करता है?
संख्यात्मक होने के लिए स्ट्रिंग की जांच करने का कारण क्या है, और फिर यदि ऐसा हो तो? हम पहले से ही दो तारों की तुलना क्यों नहीं कर सकते?

मैं समझ सकता हूं कि दो ऑपरेंड के अलग-अलग प्रकार होने पर कास्टिंग की आवश्यकता होती है। लेकिन जब यह तार हैं तो यह "usual math" क्यों करता है?

+1

क्योंकि उन्होंने पर्ल से संकेत नहीं लिया। : पी यह कहना इतना आसान होता कि "' == 'संख्यात्मक रूप से तुलना करता है,' eq' तुलनात्मक रूप से तुलना करता है, और '===' सख्ती से तुलना करता है "। (हालांकि अगर हमारे पास पहले दो थे, तो बाद वाले को कभी भी इस्तेमाल करने की आवश्यकता नहीं हो सकती थी। एह, शायद ऑब्जेक्ट्स के साथ।) – cHao

उत्तर

3

आह में बदल जानी चाहिए, अंत में मुझे मिल गया है। यह मेरे बारे में काफी बेवकूफ था।

तुलना में न केवल "is equal" बल्कि "less than" और "greater than" शामिल है। और बाद के दो के लिए तुलनात्मक रूप से संख्यात्मक ऑपरेटरों को तुलना करने के लिए स्पष्ट रूप से महत्वपूर्ण है, क्योंकि संख्याओं को PHP में तारों के रूप में अक्सर प्रदर्शित किया जा रहा है, और 11 को तारों में संग्रहित होने पर भी 9 से अधिक होना चाहिए।

तो, के रूप में compare_function() एक बार पर सभी तुलना करता है, रिटर्न या तो 1, 0, -1 अगर पहले संकार्य, बड़ा बराबर या क्रमश: दूसरे से भी कम है बताने के लिए - ठीक है, यह काफी स्पष्ट करता है, क्यों ऑपरेंड डाली जा रहा है।

4

आप दो तारों की तुलना कर सकते हैं।

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

याद रखें == का मतलब बराबर === का मतलब बराबर

मेरी केवल करने के लिए क्यों यह मामला है के रूप में है, क्योंकि शुरुआत में पीएचपी एक प्रकार कम भाषा होने के लिए प्रयासरत इससे पहले कि वे एक बनने का मार्ग चला गया अनुमान ढीली टाइप की गई भाषा।

PHP मूल रूप से स्ट्रिंग प्रोसेसर था जो इसके अंदर एक छोटी लिपि के लिए अनुमति देता था। चूंकि वेब पर सभी इनपुट प्रकृति में टेक्स्ट हैं, इसलिए इसे संख्याओं से निपटने के लिए संवेदनापूर्वक व्यवहार करने के लिए कठोर पाठ इनपुट इनपुट करना था।

मैं इसके बारे में गलत हो सकता हूं लेकिन मुझे विश्वास नहीं है कि * वैल फ़ंक्शंस (जैसे अंतराल) आदि के परिचय के साथ PHP 4 तक चरण में दर्ज डेटा प्रकारों को स्पष्ट रूप से डालने की क्षमता और मुझे लगता है कि कास्टिंग नोटेशन, जैसे (int) उसके बाद आया था।

गैर तुलना संचालन के लिए यह बहुत आसान था क्योंकि उनके पास उनके साथ एक प्रकार है (+ -/* सभी संख्याओं के साथ सौदा करते हैं। तारों के साथ सौदों) तो उन मामलों में चीजों को कैसे डाला जाना चाहिए इसका स्पष्ट मार्ग स्पष्ट है

लेकिन वैरिएबल के बीच समानता या समकक्ष जांच के साथ, ऐसा करने का एकमात्र तरीका किसी संख्या की तरह दिखने वाली सभी चीजों का इलाज करना था क्योंकि उस समय एकमात्र तरीका यह हो सकता है कि वह बाहरी रूप से होगा स्ट्रिंग और इसे अन्यथा बनाने का कोई तरीका नहीं था।

+0

मुझे पता था कि मुझे इस तरह के बहुत सारे जवाब मिलेंगे। तो बहुत ही प्रत्यक्ष है :) –

+2

@ ओरंगपिल - लेकिन उसका सवाल है क्यों? ' – vidit

+0

@YourCommonSense बेहतर है? – Orangepill

3

क्योंकि, PHP अंतिम उपयोगकर्ताओं के लिए उत्पाद उत्पन्न करता है, न कि एप्लिकेशन डेवलपर्स के लिए। उपयोगकर्ता 1 या 0001 दर्ज करते हैं

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> 

, क्या तुम दोनों मामले में मुद्रित करने के लिए उम्मीद करते हैं: तो जब आप नीचे की तरह इस तरह के उत्पाद का उत्पादन? Yes या NO?

उत्तर स्पष्ट है। हम Yes देखने की उम्मीद करते हैं।इसलिए इस why PHP does so किसी भी दुर्लभ कारण के लिए, हम निश्चित रूप से उनकी तुलना करने की जरूरत है, तो हम =====

+0

उपरोक्त जोड़ा गया क्योंकि कई डिज़ाइन निर्णय, विशेष रूप से '1'' और' 00001'', '(int) 1' और' (float) 1.0' के बीच समानता HTTP केवल सहायक स्ट्रिंग्स के कारण हैं। PHP 'स्ट्रिंग्स-ओनली' उन्मुख दुनिया में डेवलपर्स के लिए टाइप-जुगलिंग को कम करने की कोशिश करता है। – KyleWpppd

संबंधित मुद्दे