বিভিন্ন আলোচনা এবং উত্তরগুলির ওভারভিউ দেওয়ার চেষ্টা করা হচ্ছে:
এই প্রশ্নের কোনও একক উত্তর নেই যা isset
ব্যবহার করা যেতে পারে সমস্ত উপায় প্রতিস্থাপন করতে পারে। কিছু ব্যবহারের ক্ষেত্রে অন্যান্য ফাংশন দ্বারা সম্বোধন করা হয়, আবার অন্যরা তদন্তের পক্ষে দাঁড়ায় না বা কোড গল্ফের বাইরে সন্দেহজনক মান রাখে না। "ভাঙ্গা" বা "অসামঞ্জস্যপূর্ণ" হওয়া থেকে দূরে, অন্যান্য ব্যবহারের ঘটনাগুলি প্রমাণ করে যে কেন isset
এর প্রতিক্রিয়া null
যুক্তিযুক্ত আচরণ।
বাস্তব ব্যবহারের কেস (সমাধান সহ)
1. অ্যারে কী
অ্যারেগুলির সঙ্গে ভেরিয়েবল সংগ্রহ মত গ্রহণ করা যেতে পারে, unset
এবং isset
তাদের চিকিত্সা তাকে অস্তিত্বে। তবে যেহেতু এগুলি পুনরাবৃত্তি, গণনা ইত্যাদি করা যায়, অনুপস্থিত মান যার মান হিসাবে একই হয় না null
।
এই ক্ষেত্রে উত্তর, পরিবর্তে ব্যবহার array_key_exists()
করা হয়isset()
।
যেহেতু এটি ফাংশন আর্গুমেন্ট হিসাবে অ্যারেটি পরীক্ষা করে নেওয়া হয়, পিএইচপি এখনও অ্যারে উপস্থিত না থাকলে "বিজ্ঞপ্তি" উত্থাপন করবে। কিছু ক্ষেত্রে, এটি যুক্তিযুক্তভাবে যুক্তিযুক্ত হতে পারে যে প্রতিটি মাত্রা প্রথমে শুরু করা উচিত ছিল, সুতরাং নোটিশটি তার কাজ করছে। অন্যান্য ক্ষেত্রে, একটি "পুনরাবৃত্ত" array_key_exists
ফাংশন, যা ঘুরে অ্যারের প্রতিটি মাত্রা পরীক্ষা করে, এটি এড়াতে পারে, তবে মূলত একই রকম হবে @array_key_exists
। এটি null
মানকে সামলানোর ক্ষেত্রে কিছুটা স্পর্শকাতর ।
2. বস্তুর বৈশিষ্ট্য
"অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং" এর traditionalতিহ্যগত তত্ত্বে, এনক্যাপসুলেশন এবং পলিমারফিজম হ'ল বস্তুর মূল বৈশিষ্ট্য; পিএইচপি এর মত একটি শ্রেণী ভিত্তিক গলি বাস্তবায়নের, encapsulated বৈশিষ্ট্য বর্গ সংজ্ঞার অংশ হিসেবে ঘোষণা করা হয়, এবং প্রদত্ত এক্সেস মাত্রা ( public
, protected
, অথবা private
)।
যাইহোক, পিএইচপি আপনাকে কোনও বস্তুতে গতিশীল বৈশিষ্ট্য যুক্ত করতে দেয়, যেমন আপনি কোনও অ্যারের কী করতে চান এবং কিছু লোক শ্রেণিবদ্ধ অবজেক্টগুলি ব্যবহার করে (প্রযুক্তিগতভাবে বিল্ট stdClass
ইনগুলির উদাহরণ, যার কোনও পদ্ধতি বা ব্যক্তিগত কার্যকারিতা নেই) একই রকম হয় use সহযোগী অ্যারে করার উপায়। এটি এমন পরিস্থিতিতে পরিচালিত করে যেখানে কোনও ফাংশন এটি জানতে পারে যে কোনও নির্দিষ্ট সম্পত্তি এটি প্রদত্ত বস্তুর সাথে যুক্ত হয়েছে কিনা।
অ্যারে কীগুলির মতো, অবজেক্টের বৈশিষ্ট্য যাচাই করার জন্য একটি সমাধান ভাষাতে অন্তর্ভুক্ত করা হয়, যাকে বলা হয়, যথেষ্ট যথেষ্ট,property_exists
।
অযৌক্তিকভাবে ব্যবহারযোগ্য মামলাগুলি আলোচনা সহ
3। register_globals
, এবং বিশ্বব্যাপী নেমস্পেসের অন্যান্য দূষণ
register_globals
বৈশিষ্ট্য বিশ্বব্যাপী সুযোগ যাদের নাম HTTP অনুরোধ (GET এবং পোষ্ট পরামিতি, এবং কুকি) দিক দ্বারা নির্ধারিত হয়েছিল ভেরিয়েবল এখনো যোগ করেনি। এটি বগি এবং অনিরাপদ কোডের দিকে নিয়ে যেতে পারে, এ কারণেই এটি পিএইচপি ৪.২.২০১ since সাল থেকে ডিফল্টরূপে অক্ষম করা হয়েছে , অগাস্ট 2000 প্রকাশিত এবং পিএইচপি 5.4-এ সম্পূর্ণরূপে অপসারণ করা হয়েছে , মার্চ ২০১২ । তবে এটি সম্ভব যে কিছু সিস্টেম এখনও এই বৈশিষ্ট্যটি সক্ষম বা অনুকরণ সহ চলছে। global
কীওয়ার্ড বা $GLOBALS
অ্যারে ব্যবহার করে অন্যান্য উপায়ে গ্লোবাল নেমস্পেসকে "দূষিত" করাও সম্ভব ।
প্রথমত, register_globals
নিজেই অপ্রত্যাশিতভাবে একটি null
পরিবর্তনশীল তৈরি হওয়ার সম্ভাবনা কম , যেহেতু জিইটি, পোষ্ট এবং কুকি মানগুলি সর্বদা স্ট্রিং ( ''
এখনও true
থেকে ফিরে আসার সাথে isset
) থাকবে এবং সেশনে ভেরিয়েবলগুলি পুরোপুরি প্রোগ্রামারের নিয়ন্ত্রণে থাকা উচিত।
দ্বিতীয়ত, মান সহ একটি ভেরিয়েবলের দূষণ null
কেবল তখনই ইস্যু হয় যদি এটি পূর্ববর্তী কিছু সূচনাটি ওভার-লিখন করে। "ওভার-রাইটিং" একটি অবিচ্ছিন্ন ভেরিয়েবল null
কেবল তখনই সমস্যাযুক্ত যদি অন্য কোথাও কোড দুটি রাজ্যের মধ্যে পার্থক্য করছিল, তাই নিজস্বভাবে এই সম্ভাবনাটিকে এই ধরনের পার্থক্য করার বিরুদ্ধে যুক্তি argument
4. get_defined_vars
এবংcompact
পিএইচপি-তে কয়েকটি কদাচিৎ ব্যবহৃত ফাংশন, যেমন get_defined_vars
এবং compact
, আপনাকে ভেরিয়েবলের নামগুলি এমন আচরণের অনুমতি দেয় যেমন তারা অ্যারেতে কী ছিল। গ্লোবাল ভেরিয়েবলের জন্য, সুপার-গ্লোবাল অ্যারে$GLOBALS
অনুরূপ অ্যাক্সেসের অনুমতি দেয় এবং এটি আরও সাধারণ। প্রাসঙ্গিক সুযোগে কোনও ভেরিয়েবল সংজ্ঞায়িত না করা হলে অ্যাক্সেসের এই পদ্ধতিগুলি আলাদাভাবে আচরণ করবে।
একবার আপনি এই পদ্ধতিগুলির মধ্যে একটির ব্যবহার করে অ্যারে হিসাবে ভেরিয়েবলগুলির একটি সেটকে আচরণ করার সিদ্ধান্ত নিয়েছেন, আপনি কোনও সাধারণ অ্যারে হিসাবে তার উপর সমস্ত একই ক্রিয়াকলাপ করতে পারেন। ফলস্বরূপ, দেখুন 1।
কার্যকারিতা যা কেবলমাত্র এই ফাংশনগুলি কীভাবে আচরণ করতে চলেছে তা অনুমান করার জন্যই বিদ্যমান ছিল (উদাহরণস্বরূপ "অ্যারেটিতে কী একটি 'ফু' থাকবে get_defined_vars
?") আপনি কেবল ফাংশনটি পরিচালনা করতে পারেন এবং কোনও খারাপ প্রভাব ছাড়াই খুঁজে পেতে পারেন।
4a। পরিবর্তনশীল ভেরিয়েবল ($$foo
)
ভেরিয়েবলের একটি সেটকে একটি এসোসিয়েটিভ অ্যারে রূপান্তরিত করে এমন ফাংশনগুলির মতো না হলেও, বেশিরভাগ ক্ষেত্রে "ভেরিয়েবল ভেরিয়েবল" ("এই অন্যান্য ভেরিয়েবলের উপর ভিত্তি করে একটি ভেরিয়েবলকে বরাদ্দ করা হয়") ব্যবহার করা যেতে পারে এবং পরিবর্তে একটি এসোসিয়েটিভ অ্যারে ব্যবহার করার জন্য এটি পরিবর্তন করা উচিত ।
একটি পরিবর্তনশীল নাম, মূলত, প্রোগ্রামার দ্বারা একটি মান দেওয়া লেবেল; আপনি যদি রান-টাইমে এটি নির্ধারণ করেন তবে এটি আসলে কোনও লেবেল নয় তবে কিছু মূল্যের স্টোরের কী। আরও ব্যবহারিকভাবে, অ্যারে ব্যবহার না করে আপনি গণনা, পুনরাবৃত্তি ইত্যাদির ক্ষমতা হারাচ্ছেন; কী-ভ্যালু স্টোরটি "বাইরের" ভেরিয়েবলের পক্ষে পাওয়া অসম্ভব হয়ে উঠতে পারে, যেহেতু এটি অতিরিক্ত লিখিত হতে পারে $$foo
।
একবার কোনও এসোসিয়েটিভ অ্যারে ব্যবহার করতে পরিবর্তিত হয়ে গেলে, কোডটি সমাধানের জন্য কার্যকর হবে 1.. পরোক্ষ বস্তুর সম্পত্তি অ্যাক্সেস (উদাহরণস্বরূপ $foo->$property_name
) সমাধান 2 দিয়ে সম্বোধন করা যেতে পারে।
৫. এর isset
চেয়ে টাইপ করা অনেক সহজarray_key_exists
আমি নিশ্চিত যে এটি সত্যই প্রাসঙ্গিক, তবে হ্যাঁ, পিএইচপি-র ফাংশন নামগুলি বেশিরভাগ সময় দীর্ঘ-বাতাসযুক্ত এবং বেমানান হতে পারে। স্পষ্টতই, পিএইচপি-র প্রাক-versionsতিহাসিক সংস্করণগুলি হ্যাশ কী হিসাবে একটি ফাংশন নামের দৈর্ঘ্য ব্যবহার করেছে, তাই রাসমাস ইচ্ছাকৃতভাবে ফাংশনটির নামগুলি তৈরি করেছেন htmlspecialchars
যাতে তাদের অস্বাভাবিক সংখ্যক অক্ষর থাকবে ...
তবুও, আমরা অন্তত জাভা লিখছি না, তাই না? ;)
Un. একচেটিয়াযুক্ত ভেরিয়েবলগুলির একটি প্রকার রয়েছে
পরিবর্তনশীল বুনিয়াদি ম্যানুয়েল পৃষ্ঠা এই বিবৃতি রয়েছে:
একত্রীকরণবিহীন ভেরিয়েবলগুলির প্রকারের উপর নির্ভর করে তাদের প্রকারের ডিফল্ট মান থাকে
আমি নিশ্চিত না যে "অবিচ্ছিন্ন তবে পরিচিত ধরণের" জেন্ড ইঞ্জিনে কিছু ধারণা আছে কিনা বা এটি বিবৃতিতে খুব বেশি পড়ছে কিনা।
যা স্পষ্ট তা হ'ল এটি তাদের আচরণের ক্ষেত্রে কোনও ব্যবহারিক তাত্পর্য তৈরি করে না, যেহেতু অবিচ্ছিন্ন ভেরিয়েবলগুলির জন্য সেই পৃষ্ঠাতে বর্ণিত আচরণগুলি একটি ভেরিয়েবলের আচরণের সাথে সমান যাঁর মান null
। একটি উদাহরণ বাছাই করতে, উভয় $a
এবং $b
এই কোডটিতে পূর্ণসংখ্যা হিসাবে শেষ হবে 42
:
unset($a);
$a += 42;
$b = null;
$b += 42;
(প্রথমে আপনাকে অঘোষিত ভেরিয়েবল সম্পর্কে একটি নোটিশ উত্থাপন করবে, আপনাকে আরও ভাল কোড লিখতে দেওয়ার প্রয়াসে, তবে কোডটি আসলে কীভাবে চালায় তাতে কোনও পার্থক্য হবে না।)
99. কোনও ফাংশন চালিত হয়েছে কিনা তা সনাক্ত করা হচ্ছে
(এটি অন্যের চেয়ে অনেক বেশি দীর্ঘ হিসাবে এটিকে অব্যাহত রাখা Maybe সম্ভবত আমি পরে এটি সম্পাদনা করব ...)
নিম্নলিখিত কোড বিবেচনা করুন:
$test_value = 'hello';
foreach ( $list_of_things as $thing ) {
if ( some_test($thing, $test_value) ) {
$result = some_function($thing);
}
}
if ( isset($result) ) {
echo 'The test passed at least once!';
}
যদি some_function
ফিরে আসতে পারে তবে ফিরে আসা সত্ত্বেও এটি পৌঁছাবে না এমন null
সম্ভাবনা রয়েছে । প্রোগ্রামারটির উদ্দেশ্যটি কখন নির্ধারণ করা হয়নি তা সনাক্ত করা হয়েছিল , কিন্তু পিএইচপি তাদের এটি করার অনুমতি দেয় না।echo
some_test
true
$result
তবে এই পদ্ধতির সাথে অন্যান্য সমস্যা রয়েছে, যা আপনি যদি বাইরের লুপ যুক্ত করেন তবে তা স্পষ্ট হয়ে যায়:
foreach ( $list_of_tests as $test_value ) {
// something's missing here...
foreach ( $list_of_things as $thing ) {
if ( some_test($thing, $test_value) ) {
$result = some_function($thing);
}
}
if ( isset($result) ) {
echo 'The test passed at least once!';
}
}
কারণ $result
কখনই সুস্পষ্টভাবে আরম্ভ করা হয় নি, প্রথম পরীক্ষাটি পাস করার পরে এটি একটি মূল্য গ্রহণ করবে, পরবর্তী পরীক্ষাগুলি পাস হয়েছে কিনা তা বলা অসম্ভব করে তোলে। ভেরিয়েবলগুলি সঠিকভাবে আরম্ভ না করা হয় এটি আসলে একটি অত্যন্ত সাধারণ বাগ।
এটি ঠিক করার জন্য, আমাদের যে লাইনে মন্তব্য করা হয়েছে যে কিছু অনুপস্থিত রয়েছে সে লাইনে আমাদের কিছু করা দরকার। সর্বাধিক সুস্পষ্ট সমাধান হ'ল $result
"টার্মিনাল মান" সেট করে যা some_function
কখনও ফিরে আসতে পারে না; যদি এটি হয় null
তবে বাকী কোডটি ঠিকঠাক কাজ করবে। যদি টার্মিনাল মানটির জন্য কোনও প্রাকৃতিক প্রার্থী না থাকে কারণ some_function
একটি অত্যন্ত অনির্দেশীয় রিটার্ন টাইপ (যা সম্ভবত নিজের মধ্যে একটি খারাপ চিহ্ন) থাকে, তবে অতিরিক্ত বুলিয়ান মান যেমন,$found
ব্যবহার করা যেতে পারে।
চিন্তাভাবনা পরীক্ষা এক: very_null
ধ্রুবক
পিএইচপি তাত্ত্বিকভাবে null
এখানে একটি টার্মিনাল মান হিসাবে ব্যবহারের জন্য পাশাপাশি একটি বিশেষ ধ্রুবক সরবরাহ করতে পারে ; সম্ভবতঃ এটি কোনও ফাংশন থেকে ফিরে আসা অবৈধ হবে, বা এটিতে জোর করা null
হবে এবং এটি সম্ভবত একটি ফাংশন আর্গুমেন্ট হিসাবে এটি পাস করার ক্ষেত্রে প্রযোজ্য। এটি একেবারে সুনির্দিষ্ট কেসটিকে কিছুটা সহজ করে তুলবে, তবে আপনি কোডটি পুনরায় ফ্যাক্ট করার সিদ্ধান্ত নেওয়ার সাথে সাথে - উদাহরণস্বরূপ, অভ্যন্তরীণ লুপটিকে একটি পৃথক ফাংশনে রাখার জন্য - এটি অকেজো হয়ে যাবে। যদি ধ্রুবকটি ফাংশনগুলির মধ্যে পাস করা যায় তবে আপনি গ্যারান্টি দিতে some_function
পারবেন না যে এটি ফেরত দেবে না, সুতরাং এটি সর্বজনীন টার্মিনাল মান হিসাবে কার্যকর হবে না।
এক্ষেত্রে অবিচ্ছিন্ন ভেরিয়েবলগুলি সনাক্ত করার যুক্তিটি সেই বিশেষ ধ্রুবকের পক্ষে যুক্তির দিকে ফোটে: আপনি যদি মন্তব্যটির সাথে প্রতিস্থাপন করেন unset($result)
এবং সেই থেকে আলাদা আচরণ করেন তবে $result = null
আপনি একটি "মান" প্রবর্তন করছেন$result
যা এর কাছাকাছি যেতে পারে না, এবং কেবলমাত্র হতে পারে নির্দিষ্ট অন্তর্নির্মিত ফাংশন দ্বারা সনাক্ত।
ভাবা পরীক্ষা দুটি: অ্যাসাইনমেন্ট কাউন্টার
সর্বশেষ if
যা জিজ্ঞাসা করছে সে সম্পর্কে চিন্তা করার আরেকটি উপায় "" কোনও কিছুর একটি কার্যভার দেওয়া হয়েছে $result
? " এটিকে একটি বিশেষ মান হিসাবে বিবেচনা করার পরিবর্তে আপনি এটিকে ভেরিয়েবল সম্পর্কে$result
"মেটাডেটা" হিসাবে ভাবতে পারেন, পার্লের "ভেরিয়েবল টেনেন্টিং" এর মতো কিছুটা। তার চেয়ে আপনি এটি কল করতে পারেন এবং তার চেয়ে আরও বেশি ,isset
has_been_assigned_to
unset
reset_assignment_state
।
তবে যদি তা হয় তবে কেন বুলিয়ান থামবেন? আপনি যদি জানতে চান যে পরীক্ষাটি কতবার পাস করেছে; আপনি কেবলমাত্র আপনার মেটাডেটা পূর্ণসংখ্যায় প্রসারিত করতে পারেন get_assignment_count
এবং থাকতে পারেন এবং reset_assignment_count
...
স্পষ্টতই, এই জাতীয় বৈশিষ্ট্য যুক্ত করার ফলে ভাষার জটিলতা এবং কার্য সম্পাদনের ক্ষেত্রে বাণিজ্য বন্ধ হয়ে যায়, সুতরাং এর প্রত্যাশিত কার্যকারিতাটির বিরুদ্ধে এটি সাবধানতার সাথে ওজন করা দরকার। very_null
ধ্রুবক হিসাবে , এটি কেবল খুব সংকীর্ণ পরিস্থিতিতে কার্যকর হবে এবং পুনরায় ফ্যাক্টরিংয়ের জন্য অনুরূপ প্রতিরোধী হবে।
আশাবাদী-সুস্পষ্ট প্রশ্নটি হ'ল পিএইচপি রানটাইম ইঞ্জিনটি কেন আগে থেকেই ধরে নেওয়া উচিত যে আপনি সাধারণ কোড ব্যবহার করে স্পষ্টভাবে তা ছেড়ে দেওয়ার পরিবর্তে এই জাতীয় বিষয়ের উপর নজর রাখতে চান।