পিএইচপি কেন বুলিয়ান প্রসঙ্গে "0" কে মিথ্যা বলে বিবেচনা করে?


12

"0", একটি অক্ষর সমন্বিত একটি স্ট্রিং হিসাবে, স্বজ্ঞাতভাবে কিছু খালি নয়। পিএইচপি কেন অন্য প্রোগ্রামিং ভাষার মতো নয়, বুলিয়ান রূপান্তরিত করে এটিকে মিথ্যা হিসাবে বিবেচনা করে?


2
এর সদৃশ: স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / ৫৩৩6464৩/২ । এটি পিএইচপি এবং জাভাস্ক্রিপ্ট উভয় ক্ষেত্রেই একই
ওয়ালফ্র্যাট

5
এটি হ'ল পিএইচপি যতটা সম্ভব তার নিজের এবং প্রতিটি প্রোগ্রামিং ভাষা উভয়ের সাথেই বেমানান হতে পারে।
ডেভিড আরনো

2
@ ডেভিড আর্নো বিপরীতে, এটি সামঞ্জস্যপূর্ণ হওয়ার জন্য যথাসাধ্য চেষ্টা করছে ; একবার আপনি স্বতঃআরক্ষার স্ট্রিং শুরু করেন (কোনও ভাষাতে খুব সহজেই ইউআরএল বা অনুরোধ সংস্থাগুলির কাছ থেকে বর্ণ গ্রহণ করা হয়) আপনাকে সেই যুক্তিটি অনুসরণ করতে হবে। যদি '0'হিসাবে গণ্য হবে 0মধ্যে $x + 1কেন এটা হিসাবে গণ্য করা উচিত নয় 0, সেইজন্য এবং false, এ if ( $x )?
আইএমএসওপি

1
@ ডেভিড আর্নো ঠিক;)
লিনাক্সুনিল

1
@ ডেভিড আর্নো একবার আপনি ক্ষতিকারক কাস্টগুলি সম্পাদন শুরু করলে, কিছুটা অসঙ্গতি অবশ্যম্ভাবী বলে মনে করি; ধারাবাহিক সমাধানের মধ্যে কিছু ক্যাসেট প্রত্যাখ্যান করা এবং খুব যত্ন সহকারে নকশা করা। খুব কম জনপ্রিয় ভাষা যদিও স্ক্র্যাচ থেকে ডিজাইন করা হয়েছে; বেশিরভাগই দুর্ঘটনাক্রমে-জনপ্রিয় পরীক্ষাগুলি থেকে, বা বিভিন্ন লক্ষ্য এবং ব্যাগেজ সহ পুরানো ভাষা থেকে বিকশিত হয়। এমনকি সি #, যার প্রচুর শব্দ তাত্ত্বিক নকশা রয়েছে, এর সি থেকে কিছু উত্তরাধিকার রয়েছে, যা কখনও পরিণত হওয়ার মতো সর্বজনীন হওয়ার ইচ্ছা ছিল না। স্পোর্টস ম্যাচে রেফের দিকে চিৎকার করার মতো "" অসামঞ্জস্যপূর্ণ হতে বড় দৈর্ঘ্যে যাওয়া "এর মতো স্নার্ক।
আইএমএসওপি

উত্তর:


12

পিএইচপি ওয়েব অনুরোধগুলির সাথে ব্যবহারের জন্য (বা পরিবর্তে বিবর্তিত) নকশা করা হয়েছিল, যেখানে আপনি প্রায়শই স্ট্রিং ইনপুট (ইউআরএল প্যারামিটার, বা ব্রাউজারের কোনও ফর্মের পোস্টের অনুরোধগুলি) নিয়ে ডিল করছেন। যেমনটি, এটি স্বয়ংক্রিয়ভাবে অন্যান্য ধরণের স্ট্রিংগুলি ফেলে দেয়।

এই একটি সহজ উদাহরণ যে '1' + '2'দেয় 3, কোনো ত্রুটি, বা '12', অথবা অন্য কোনো ব্যাখ্যা। একই যুক্তি দ্বারা, স্ট্রিংটি '0'একটি সংখ্যা হিসাবে ব্যবহার করা যেতে পারে 0

এদিকে, অনেক ভাষার মতো, পিএইচপি কিছুটা মানকে "মিথ্যা" হিসাবে বিবেচনা করে যখন বুলিয়ান সম্পর্কে কাস্ট করা হয় - যেগুলি আপনি যেমন বলেন তেমন স্বজ্ঞাত "খালি" থাকে। এর মধ্যে সংখ্যাযুক্ত 0পাশাপাশি খালি স্ট্রিং ''এবং খালি অ্যারে অন্তর্ভুক্ত রয়েছে []। একটি ইন ifবিবৃতি প্রকাশের স্পষ্টভাবে, বুলিয়ান কাস্ট তাই if ( 0 )হিসাবে একই if ( false )

এই দুটি জিনিস একসাথে রেখে, আপনি একটি ধাঁধা পান: একদিকে যেমন আপনি বলেছেন '0'একটি খালি খালি স্ট্রিং; অন্যদিকে, আমরা বলেছি যে এটি একটি সংখ্যা হিসাবে ব্যবহৃত হতে পারে 0, যা "খালি"। পিএইচপি '0'"স্ট্রিংনেস" এর চেয়ে "শূন্য-নেস" কে আরও গুরুত্বপূর্ণ হিসাবে বিবেচনা করে , তাই এটিকে "ফালসি" বলে মনে করা হয়।

সংক্ষেপে '0' == 0 == false:; অথবা(bool)'0' === (bool)(int)'0'


আমি কি পিএইচপি রক্ষা করার এবং একটি সস্তা এবং অজ্ঞান রসিকতা বাদে অন্য কিছু দিয়ে প্রশ্নের উত্তর দেওয়ার সাহস করার কারণে কেউ আমার উত্তরকে হ্রাস করেছে? বা আমার উত্তরে কিছু ভুল বা অসহায় কিছু আছে যা তারা উল্লেখ করতে চাইবে?
আইএমএসওপি

1
আমার মনে হয় পিএইচপি এটি পার্লের কাছ থেকে নিয়েছিল, যা " "0" মিথ্যা" আচরণের মতো। পার্লে, আক্ষরিকভাবে স্ট্রিং "0"এবং সংখ্যার মধ্যে কোনও ব্যবহারকারী-দৃশ্যমান পার্থক্য নেই 0- JSON পরিচালনা করার সময় বিরক্তিকর, তবে পাঠ্যগত ডেটা পরিচালনা করার সময় খুব স্বজ্ঞাগত। তারপরেও 0স্ট্রিংটি ভুয়া না থাকলে সংখ্যাটি মিথ্যা "0"হওয়া অসম্ভব। পিএইচপি এবং JavaScript এই নকশা সিদ্ধান্ত ধার কিন্তু স্ট্রিং / bools / সাংখ্যিক ধরনের পার্থক্য থাকতেই অন্তর্নিহিত ধর্মান্তর অনুমতি দিয়ে কিছু বিভ্রান্তির যোগ করুন (পিএইচপি: 0 == "0 foo", 0 == falseকিন্তু "0 foo" == true: ==সকর্মক নয়)
আমন

@ এ্যামন হ্যাঁ, পার্ল (প্রায়) সমস্ত অপারেটর এবং অন্তর্নির্মিত ফাংশনগুলির একটি বিশেষ ধরণের অপারেশনগুলিকে জোর করে স্ট্রিং ইক্যুয়ালিটির মতো অতিরিক্ত অপারেটরগুলির আকর্ষণীয় পন্থা গ্রহণ করে eq। যাইহোক, এই লজি কাস্ট অ-transitivity থেকে এটা সংরক্ষণ করে না: "0 foo"একটি বুলিয়ান প্রেক্ষাপটে truthy, কিন্তু সমান 0অধীনে ==। সুতরাং if ( ! $foo ) ..এবং $false = (1 == 2); if ( $foo == $false ) ... একই ফলাফল দেবেন না। আমি অনুমান করি যে ভাষাটি "বুলিয়ান সমতা" অপারেটরকে হারিয়েছে যা এটি ধারাবাহিকভাবে আচরণ করতে পারে ...
IMSoP

যদিও "0" হ'ল সংখ্যার হিসাবে মূল্যায়ন করা হয়, আমরা যখন বুলিয়ান প্রসঙ্গে একটি স্ট্রিং ব্যবহার করি (উদাহরণস্বরূপ যদি একটি বিবৃতিতে) তবে আমরা এর সংখ্যার মানতে আগ্রহী নই। যদি আমরা এটি সংখ্যাসূচক হিসাবে ব্যাখ্যা করতে চাই, আমরা এটি কয়েকটি সংখ্যার সাথে তুলনা করব, উদাহরণস্বরূপ $_POST['id'] == 0, যা অভিপ্রায়টি পরিষ্কার করে যে আমরা ব্যবহারকারীর ইনপুটটিকে একটি সংখ্যা হিসাবে গণ্য করতে চাই।
মাইকেল স্যাং

1
@ মাস্টারলিয়ন এই উদাহরণটি পিএইচপি না হয়ে পার্লের ছিল। পার্লের মধ্যে আলাদাভাবে কোনও বুলিয়ান ধরণের নেই বলে গুরুত্বপূর্ণ পার্থক্য রয়েছে, সুতরাং এতে $falseসেট আপ সেট আপ হয় 0; সুতরাং আপনি যখন লিখবেন $foo == $false, পার্ল জানেন না যে আপনি কোনও বুলিয়ান তুলনা করতে চান, এবং পরিবর্তে ক্রেস্টে কাস্ট করবেন। পিএইচপি-তে, এটি হয় না, কারণ $falseবুলিয়ান মিথ্যা, তাই ==!
বুলেয়ানকে

3

বুলিয়ান সম্পর্কে পিএইচপি ডকুমেন্টেশন অনুসারে এটি বলে যে:

বুলিয়ান রূপান্তর করার সময়, নিম্নলিখিত মানগুলি বিবেচনা করা হয় FALSE
...
খালি স্ট্রিং এবং স্ট্রিং "0"
...

অন্যথায়:

অন্যান্য প্রতিটি মান সত্য বলে বিবেচিত হয় (কোনও সংস্থান সহ)।

আপনি যদি চালান:

var_dump((bool) "0");

এটি মুদ্রণ করবে:

bool, (মিথ্যা)

সুতরাং এটি প্রত্যাশার মতো কাজ করছে।


আপনার প্রশ্নের স্পষ্টভাবে উত্তর দিতে:

তবে বেশিরভাগ ক্ষেত্রে castালাই অপ্রয়োজনীয়, যেহেতু কোনও অপারেটর, ফাংশন বা নিয়ন্ত্রণ কাঠামোর কোনও বুলিয়ান আর্গুমেন্টের প্রয়োজন হলে মানটি স্বয়ংক্রিয়ভাবে রূপান্তরিত হয়।

এর অর্থ পিএইচপি-র "অটোকাস্ট" "0" পূর্ণসংখ্যা 0 তে কাস্ট করবে, যা FALSEএকটি if()বিবৃতিতে বলার মতো নিয়ন্ত্রণ কাঠামোতেও রয়েছে ।


সুস্পষ্ট কাস্টিংয়ের প্রয়োজনের পরিবর্তে বুলেয়ানে রূপান্তরিত হওয়ার পরে আমি "0" কে FALSE হিসাবে বিবেচনা করে নকশার সিদ্ধান্তের যুক্তি জানতে চাই।
মাইকেল স্যাং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.