• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
چرا این شرط غلط، درست است؟
#1
اگر شرط پایین را تست کنید منظور من را متوجه خواهید شد:

کد پی‌اچ‌پی:
if('987654321123456789987654321123456789'=='987654321123456789876543210012345698'){
    echo 
'Why this condition is true?';


البته اگر این شرط را با "===" تست کنیم به صورت صحیح اجرا می شود. لطفا علت این مشکل را برایم بگویید که آیا باگ از PHP است یا مشکل جایی دیگر است؟
  پاسخ
تشکر شده توسط :
#2
گاهی سوالاتی مطرح میشه که من خسته رو هم سر ذوق میاره دوست عزیز به دقت نظری که داشتید تبریک می گم گرچه ممکن این سوال در هنگام مواجهه با یک باگ براتون مطرح شده سعی می کنم جواب مبسوطی به سوال شما بدم تا بار آموزشی این مورد رو برای همه دوستان افزایش بدم
ابتدا باید به تفاوت ماحوی دو اپراتور برابری (==) و یکسانی (===) توجه کنید اپراتور برابری تنها به برابری ارزش عملوندها توجه دارد اما اپراتور یکسانی عملوندها را به لحاظ نوع داده ای هم مورد پردازش قرار می دهد
در پی اچ پی رشته هایی که حاوی عدد باشند تحت عمگر برابری به نوع داده ای عددی تبدیل می شوند که تحت حالات مختلف به اعداد صحیح یا ممیز شناور تبدیل میشوند که توضیح جامع آن از حوصله بنده خارج است!
لذا رشته های شما تحت تبدیل نوع به Int تبدیل شده و به دلیل طول مجاز int تنها بخشی از ابتدای دو رشته به نوع int تبدیل شده لذا نتیجه این برابری صحیح خواهد بود اما در عملگر یکسانی تغییر نوع صورت نگرفته دو رشته با یکدیگر مقایسه شده نتیجه نادرست خواهد بود.
امیدوارم دیگر دوستان به این نکته دقت کافی داشته باشند.
  پاسخ
تشکر شده توسط : oia admin Goback cyletech Bojbaj opensecure hosseintdk775
#3
با تشکر دوست عزیز.
به هر حال به نظر من نباید اینطور باشه چون رشته بودن آنها مشخصه و نباید آنها به صورت عدد مقایسه بشن. به هر حال نکته جالبی بود که من قبلا خبر نداشتم.
من حتی با دو مقدار "0002" و "000002" هم آزمایش کردم و همانطور که شما گفتید با وجود رشته بودن، ولی آنها را به صورت عددی مقایسه کرد.
  پاسخ
تشکر شده توسط :
#4
(۱۳۹۰ مرداد ۱۸, ۰۷:۰۸ ب.ظ)opensecure نوشته: با تشکر دوست عزیز.
به هر حال به نظر من نباید اینطور باشه چون رشته بودن آنها مشخصه و نباید آنها به صورت عدد مقایسه بشن. به هر حال نکته جالبی بود که من قبلا خبر نداشتم.

با اجازه آقای فرمانی .
این برای PHP مزیته . ( ناصر اینجاهم نیای بگی ... / می زنمت ها Big Grin )
مغییری رو که شما تعریف می کنید خب نیاز نیست براش نوع در نظر بگیرید و آزادیدی هرجور داده ایی رو توش ( متغییر ) ذخیره کنید .
داده ها در PHP بصورت خودکار تبدیل می شوند. برای این مشکل!!! خب از راه حل مناسب ( === ) استفاده کنید! Sleepy
  پاسخ
تشکر شده توسط : Na3r
#5
رامین کم میاد ولی موقعی هم که میاد کولاک میکنهCool

اللهم صل علی محمد و آل محمد و عجل فرجهم

افلاطون را گفتند چرا هرگز غمگین نمیشوی؟
گفت :دل برآنچه نمی ماند،نمی بندم.
  پاسخ
تشکر شده توسط :
#6
(۱۳۹۰ مرداد ۱۸, ۰۷:۱۶ ب.ظ)oia نوشته:
(۱۳۹۰ مرداد ۱۸, ۰۷:۰۸ ب.ظ)opensecure نوشته: با تشکر دوست عزیز.
به هر حال به نظر من نباید اینطور باشه چون رشته بودن آنها مشخصه و نباید آنها به صورت عدد مقایسه بشن. به هر حال نکته جالبی بود که من قبلا خبر نداشتم.

با اجازه آقای فرمانی .
این برای PHP مزیته . ( ناصر اینجاهم نیای بگی ... / می زنمت ها Big Grin )
مغییری رو که شما تعریف می کنید خب نیاز نیست براش نوع در نظر بگیرید و آزادیدی هرجور داده ایی رو توش ( متغییر ) ذخیره کنید .
داده ها در PHP بصورت خودکار تبدیل می شوند. برای این مشکل!!! خب از راه حل مناسب ( === ) استفاده کنید! Sleepy

واقعا این چه مزیتیه ؟ Big Grin
  پاسخ
تشکر شده توسط :
#7
(۱۳۹۰ مرداد ۱۹, ۱۲:۲۶ ب.ظ)Na3r نوشته: واقعا این چه مزیتیه ؟ Big Grin
( اسمایلی نبی زاده ! ) تو روحت Big Grin

  پاسخ
تشکر شده توسط :
#8
(۱۳۹۰ مرداد ۱۹, ۱۲:۲۶ ب.ظ)Na3r نوشته:
(۱۳۹۰ مرداد ۱۸, ۰۷:۱۶ ب.ظ)oia نوشته:
(۱۳۹۰ مرداد ۱۸, ۰۷:۰۸ ب.ظ)opensecure نوشته: با تشکر دوست عزیز.
به هر حال به نظر من نباید اینطور باشه چون رشته بودن آنها مشخصه و نباید آنها به صورت عدد مقایسه بشن. به هر حال نکته جالبی بود که من قبلا خبر نداشتم.

با اجازه آقای فرمانی .
این برای PHP مزیته . ( ناصر اینجاهم نیای بگی ... / می زنمت ها Big Grin )
مغییری رو که شما تعریف می کنید خب نیاز نیست براش نوع در نظر بگیرید و آزادیدی هرجور داده ایی رو توش ( متغییر ) ذخیره کنید .
داده ها در PHP بصورت خودکار تبدیل می شوند. برای این مشکل!!! خب از راه حل مناسب ( === ) استفاده کنید! Sleepy


واقعا این چه مزیتیه ؟ Big Grin

به نظر من این داخل وب یه مزیت حساب میشه. دلیل هم این هست که داخل وب بیشتر کار ما کارکردن با اطلاعات ورودی هست. این اطلاعات می تونه از صدجای مختلف بیاد و واقعا وقت صرف کردن واسه اینکه ما ببینیم که نوع متغیر ورودی چی هست کار خیلی سختی هست
  پاسخ
تشکر شده توسط :
#9
وحید جدی نگیر داشتم با محمد امین شوخی میکردم. Tongue
  پاسخ
تشکر شده توسط :
#10
تو روحت Big Grin
  پاسخ
تشکر شده توسط : Na3r oia


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان