2014-11-04 6 views
5

मैं कोड है कि मेरी समझ चोरी है इस छोटे से टुकड़े को देखा:समझौता पीएचपी प्रकार बलात्कार

<?php 

$a = '0e462097431906509019562988736854'; 
$b = '0e830400451993494058024219903391'; 

var_dump($a == $b); 

कौन सा होगा उत्पादन:

bool(true) 

मैं समझता हूँ कि जब == PHP का उपयोग फजी तुलना का प्रयास करेंगे, तुलना करने के क्रम में चुपचाप प्रकारों के बीच रूपांतरित करना। मैं समझ रहा हूं कि PHP ऐसा लगता है कि ये दो तार समान हैं। मैंने सोचा होगा कि $a और $b तार हैं, कि किसी भी प्रकार के रूपांतरण की आवश्यकता नहीं होगी।

मैं क्या समझ नहीं कर रहा हूँ?

उत्तर

4

मुझे लगता है कि इस लेख में यह बहुत अच्छी तरह से बताते हैं:

Type-coercing comparison operators will convert numeric strings to numbers

बस यहाँ मुख्य मुद्दा उद्धृत करने के लिए:

php language.operators.comparison के अनुसार, प्रकार- coercing तुलना ऑपरेटरों दोनों ऑपरेंड विवश अगर वे दोनों नंबरों की तरह लग रहे तैरता के लिए होगा, भले ही वे दोनों पहले से ही तार कर रहे हैं:

जहां दोनों strings घातीय संकेतन, इसलिए सांख्यिक स्ट्रिंग्स माना जाता है का उपयोग कर, ढीले तुलना (==) बनाने, वास्तव में "शिथिल" उनकी तुलना करने से पहले इन stringsfloats को मजबूर कर रहे हैं।

सर्वश्रेष्ठ व्यवहार के रूप और अप्रत्याशित व्यवहार को रोकने के लिए, हमेशा इस्तेमाल करने की कोशिश identity equality (===), विशेष रूप से जब strings

0

यह है वास्तव में एक जवाब है, लेकिन अगर आप का प्रयास करें:

$a = '0e4620974319065090195629887368549'; 
$b = '0e8304004519934940580242199033918'; 
echo floatval($a) . '<br>' . floatval($b);var_dump($a == $b); 

आप मिल:

bool (सही)

अब, यदि आप कोशिश करते हैं:

$a = '0e4620974319065090195629887368549'; 
$b = '1e8304004519934940580242199033918'; 
echo floatval($a) . '<br>' . floatval($b);var_dump($a == $b); 

आप मिल:

INF

bool (गलत)

मेरा अनुमान है कि पीएचपी तैरता को तार परिवर्तित करता है और प्राप्त तैरता है, का उपयोग कर तुलना परिणाम देता है जो वैसे भी सही नहीं हैं, लेकिन यह एक और कहानी है।

+0

लेकिन क्यों, दोनों तार हैं? – amphetamachine

0

आधिकारिक दस्तावेज में, 2 vairiables betwen समानता के परीक्षण के रूप में पालन किया जाता है:

$a == $b # Equal TRUE if $a is equal to $b after type juggling. 

उदाहरण:

$a = 13; # integer type 
$b = "13"; # string type 
var_dump($a == $b); # will say TRUE, because juggling was made 
var_dump($a === $b); # will say FALSE, because PHP will also evaluate the type of variables :) 
0

पीएचपी के साथ काम कर नाव टाइप करने के लिए क्योंकि स्ट्रिंग एक 0. साथ शुरू होता है परिवर्तित करने के लिए प्रयास है 0 के बाद बंद हो जाता है क्योंकि अगला चरित्र एक संख्या नहीं है। वही बात तब होती है जब आप वैज्ञानिक नोटेशन को पूर्णांक में परिवर्तित करने के लिए टाइप जबरन का उपयोग करते हैं:

$x = (float)"12E-1x"; // $x == 1.2 
$x = (int)"12E-1x"; // $x == 12 (stops at E because it's not an integer) 
संबंधित मुद्दे