পিএইচপি-তে কোনও চলকের অস্তিত্বের জন্য পরীক্ষা করার সর্বোত্তম উপায়; isset () স্পষ্টভাবে নষ্ট হয়ে গেছে


187

isset()ডক্স থেকে :

isset() will return FALSE if testing a variable that has been set to NULL.

মূলত, isset()ভেরিয়েবলটি আদৌ সেট করা আছে কিনা তা যাচাই করে না, তবে এটি আর কিছুতে সেট করা আছে কিনা NULL

এটি দেওয়া হল, আসলে একটি ভেরিয়েবলের অস্তিত্বের জন্য যাচাই করার সর্বোত্তম উপায় কী? আমি এরকম কিছু চেষ্টা করেছি:

if(isset($v) || @is_null($v))

( সেট না করা @অবস্থায় সতর্কতা এড়াতে প্রয়োজনীয় $v) তবে is_null()এতে একই সমস্যা রয়েছে isset(): এটি TRUEআনসেট ভেরিয়েবলগুলিতে ফিরে আসে ! এটি প্রদর্শিত হয় যে:

@($v === NULL)

ঠিক মত কাজ করে @is_null($v), তাই এটিও বাইরে।

আমাদের কীভাবে নির্ভরযোগ্যভাবে পিএইচপি-তে কোনও পরিবর্তনকের অস্তিত্বের জন্য পরীক্ষা করা উচিত?


সম্পাদনা করুন: সেট করা হয়নি এমন ভেরিয়েবল এবং ভেরিয়েবলের মধ্যে স্পষ্টতই পিএইচপি মধ্যে পার্থক্য রয়েছে NULL:

<?php
$a = array('b' => NULL);
var_dump($a);

পিএইচপি $a['b']উপস্থিত রয়েছে যা দেখায় এবং এর একটি NULLমান রয়েছে। আপনি যদি যোগ করুন:

var_dump(isset($a['b']));
var_dump(isset($a['c']));

isset()ফাংশনটির সাথে আমি যে অস্পষ্টতা বলছি তা দেখতে পাবেন । এই তিনটিরই ফলাফল এখানে var_dump()s:

array(1) {
  ["b"]=>
  NULL
}
bool(false)
bool(false)

আরও সম্পাদনা: দুটি জিনিস।

এক, একটি ব্যবহারের কেস। একটি অ্যারে একটি এসকিউএল UPDATEস্টেটমেন্টের ডেটাতে পরিণত হচ্ছে , যেখানে অ্যারের কীগুলি টেবিলের কলাম এবং অ্যারের মানগুলি প্রতিটি কলামে প্রয়োগ করার মান to টেবিলের যে কোনও কলামই অ্যারেতে NULLএকটি NULLমান পাস করে স্বাক্ষরিত একটি মান ধরে রাখতে পারে । আপনার অ্যারে কী বিদ্যমান নেই এবং অ্যারের মান সেট করা হচ্ছে তার মধ্যে পার্থক্য করার একটি উপায় প্রয়োজনNULL ; এটি কলামটির মান আপডেট না করা এবং কলামটির মান আপডেট করার মধ্যে পার্থক্য NULL

দ্বিতীয়ত, Zoredache এর উত্তর , array_key_exists()সঠিকভাবে কাজ করে আমার উপরে ব্যবহারের ক্ষেত্রে জন্য এবং কোন বিশ্বব্যাপী ভেরিয়েবলের জন্য:

<?php
$a = NULL;
var_dump(array_key_exists('a', $GLOBALS));
var_dump(array_key_exists('b', $GLOBALS));

আউটপুট:

bool(true)
bool(false)

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

(কেবলমাত্র অন্যান্য ক্ষেত্রে আমি শ্রেণীর বৈশিষ্ট্যগুলির জন্য বিবেচনা করতে পারি, যার জন্য এখানে রয়েছে property_exists(), যা এর ডক্স অনুসারে একইভাবে কাজ করে array_key_exists()যে এটি সেট না করা এবং সেট করা না হওয়ার মধ্যে সঠিকভাবে পার্থক্য করে NULL))


আপনি চেক করতে পারবেন না - তবে আপনার দরকার কেন?
খুব বেশি পিএইচপি

12
পিএইচপি-তে NULL এর একটি নির্দিষ্ট অর্থ রয়েছে এবং এটি ভেরিয়েবল সেট করা আছে কিনা তা থেকে সম্পূর্ণ আলাদা ধারণা।
চাজোমেটিকস

33
আছে কারণ নাল এবং অবাস্তব মধ্যে পার্থক্য করতে। উদাহরণস্বরূপ, আপনি একটি ডাটাবেস টেবিলের মধ্যে একটি সারি প্রতিনিধিত্ব করতে একটি অবজেক্ট তৈরি করছেন। সারির প্রতিটি কলামের জন্য, আপনি একটি ব্যক্তিগত ভেরিয়েবল তৈরি করেন, কেবলমাত্র অবজেক্টের গেটর পদ্ধতির মাধ্যমে অ্যাক্সেসযোগ্য। ধরা যাক একটি কলামের মান নাল। এখন সেই গেটটার পদ্ধতিটি কীভাবে জানতে পারে যে টেবিলটিতে এই জাতীয় কোনও কলাম নেই, বা এই অবজেক্টটির কেবল সেখানে নাল মান রয়েছে কিনা? ভাগ্যক্রমে, আমার ক্ষেত্রে, ব্যক্তিগত ভেরিয়েবলটি আসলে একটি প্রাইভেট অ্যারেতে প্রবেশ করা হয়, তাই আমি অ্যারে_কি_এক্সিস্টগুলি ব্যবহার করতে পারি, তবে এটি একটি আসল সমস্যা।
নাথান লং

1
এটি পিএইচপি এর নতুন সংস্করণ থেকে সরানো হয়েছে, হ্যাঁ। দুর্ভাগ্যক্রমে, এটি পিএইচপি-র প্রতিটি স্থাপনার থেকে যায় নি। এছাড়াও, আমরা অ্যারে উপাদান বা ভেরিয়েবলগুলির বিষয়ে কথা বলছি কিনা তা নিয়ে শঙ্কিত করার জন্য এটি অর্থহীন শব্দার্থবিজ্ঞানের বিশদ বলে মনে হচ্ছে। আপনার কোড কোডটি কী মানা উচিত তা নির্বিশেষে, পিএইচপি ভাষায় কোনও অসঙ্গতির আশেপাশে কীভাবে কাজ করা যায় তা জানা দরকারী।
চাজোমেটিকস

2
@ চাজোমেটিকস তবে ভেরিয়েবল এবং অ্যারের উপাদানগুলি মূলত বিভিন্ন জিনিস ; কেবল কারণ আপনি তাদের সাথে একই জিনিসগুলি কিছু করতে পারেন তার অর্থ এই নয় যে সেগুলি হয় বা 100% বিনিময়যোগ্য হওয়া উচিত। এখানে "পিএইচপি ভাষায় কোনও অসঙ্গতি নেই", এমন কিছু যা আপনি পছন্দ / বুঝতে পছন্দ করেন না। যেমন register_globals, আমি এখনও এমন পরিস্থিতিটি ভাবতে লড়াই করছি যেখানে এমনকি এটির জন্যও এইরকম পার্থক্যের প্রয়োজন হবে, যেহেতু এইচটিটিপি অনুরোধ থেকে নিবন্ধিত কিছু সর্বদা একটি স্ট্রিং হয়ে থাকবে, নয় null
আইএমএসওপি

উত্তর:


97

আপনি যে ভেরিয়েবলটি যাচাই করছেন তা যদি আপনি করতে পারেন তবে বিশ্বব্যাপী স্কোপে থাকবেন:

array_key_exists('v', $GLOBALS) 

3
আহ হা! এখন আপনি কথা বলছেন '! শ্রেণীর বৈশিষ্ট্যগুলির জন্য আপনি কীভাবে এটি করবেন?
চাজোমেটিকস

22
একটি প্রকরণ হিসাবে, যদি চেকটির পাশাপাশি স্থানীয় স্কোপ ভেরিয়েবলগুলির জন্যও কাজ করা দরকার হয় তবে এটি পরীক্ষা করতে পারে $defined_vars = get_defined_vars();এবং তার মাধ্যমে পরীক্ষা করতে পারে array_key_exists('v', $defined_vars);
হেনরিক ওপেল

1
এটি আমার কাছে কিছুটা কুৎসিত দেখাচ্ছে, তবে আপনি যেখানে আসলে একটি অ্যারের উপাদান পরীক্ষা করছেন সেখানে এটি আরও বেশি অর্থবোধ করে: isset($foo[$bar])হয়ে ওঠেarray_key_exists($bar, $foo)
অর্থবোধ করে

property_exists এই ব্যতীত আশাব্যঞ্জক বলে মনে হচ্ছে:> সম্পত্তি_exists () ফাংশন __get যাদু পদ্ধতিটি ব্যবহার করে যাদুতে অ্যাক্সেসযোগ্য এমন বৈশিষ্ট্যগুলি সনাক্ত করতে পারে না।
অ্যালেক্স

__get এর মাধ্যমে @alexw ভেরিয়েবলগুলি "তৈরি" প্রকৃতপক্ষে নেই। __get হ'ল অযৌক্তিক ভেরিয়েবলগুলির ফ্যালব্যাক হিসাবে ব্যবহৃত স্বেচ্ছাসেবক কোড যা কোনও প্রাসঙ্গিক ডেটা সংরক্ষণ করা হয়েছিল কিনা তা বিবেচনা না করেই যা যা চায় তা ফিরে আসতে পারে।
ব্রিলিয়ান্ড

46

বিভিন্ন আলোচনা এবং উত্তরগুলির ওভারভিউ দেওয়ার চেষ্টা করা হচ্ছে:

এই প্রশ্নের কোনও একক উত্তর নেই যা 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সম্ভাবনা রয়েছে । প্রোগ্রামারটির উদ্দেশ্যটি কখন নির্ধারণ করা হয়নি তা সনাক্ত করা হয়েছিল , কিন্তু পিএইচপি তাদের এটি করার অনুমতি দেয় না।echosome_testtrue$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 "মেটাডেটা" হিসাবে ভাবতে পারেন, পার্লের "ভেরিয়েবল টেনেন্টিং" এর মতো কিছুটা। তার চেয়ে আপনি এটি কল করতে পারেন এবং তার চেয়ে আরও বেশি ,issethas_been_assigned_tounsetreset_assignment_state

তবে যদি তা হয় তবে কেন বুলিয়ান থামবেন? আপনি যদি জানতে চান যে পরীক্ষাটি কতবার পাস করেছে; আপনি কেবলমাত্র আপনার মেটাডেটা পূর্ণসংখ্যায় প্রসারিত করতে পারেন get_assignment_countএবং থাকতে পারেন এবং reset_assignment_count...

স্পষ্টতই, এই জাতীয় বৈশিষ্ট্য যুক্ত করার ফলে ভাষার জটিলতা এবং কার্য সম্পাদনের ক্ষেত্রে বাণিজ্য বন্ধ হয়ে যায়, সুতরাং এর প্রত্যাশিত কার্যকারিতাটির বিরুদ্ধে এটি সাবধানতার সাথে ওজন করা দরকার। very_nullধ্রুবক হিসাবে , এটি কেবল খুব সংকীর্ণ পরিস্থিতিতে কার্যকর হবে এবং পুনরায় ফ্যাক্টরিংয়ের জন্য অনুরূপ প্রতিরোধী হবে।

আশাবাদী-সুস্পষ্ট প্রশ্নটি হ'ল পিএইচপি রানটাইম ইঞ্জিনটি কেন আগে থেকেই ধরে নেওয়া উচিত যে আপনি সাধারণ কোড ব্যবহার করে স্পষ্টভাবে তা ছেড়ে দেওয়ার পরিবর্তে এই জাতীয় বিষয়ের উপর নজর রাখতে চান।


শ্রেণি এবং বৈশিষ্ট্য সম্পর্কে, দুঃখজনকভাবে সম্পত্তি_exists () সম্পত্তিটি অ্যারে থাকলে কাজ করে না, উদাহরণস্বরূপ: শ্রেণি {সর্বজনীন $ সম্পত্তি = অ্যারে ()}} একটি ত্রুটি নিক্ষেপ।
অ্যান্ড্রু

1
@ অ্যান্ড্রু আমার পক্ষে ভাল কাজ করছে বলে মনে হচ্ছে: 3v4l.org/TnAY5 একটি সম্পূর্ণ উদাহরণ দেওয়ার জন্য যত্ন?
আইএমএসওপি

হ্যাঁ মনে হচ্ছে এটি ঠিকঠাক কাজ করছে, আমার সেটআপটির সাথে কিছু ভুল ছিল। মিথ্যা অ্যালার্মের জন্য দুঃখিত :)
অ্যান্ড্রু

20

কখনও কখনও কোনও পরিস্থিতি কোন তুলনামূলক অপারেশনটি ব্যবহার করতে হয় তা নির্ধারণের চেষ্টা করে আমি কিছুটা হারিয়ে যেতে পারি। isset()কেবল অবিজ্ঞানী বা স্পষ্টভাবে নাল মানগুলিতে প্রযোজ্য। যৌক্তিক তুলনা প্রত্যাশার সাথে কাজ করে তা নিশ্চিত করার জন্য নাল পাস / অ্যাসাইন করা একটি দুর্দান্ত উপায়।

তবুও, এই সম্পর্কে চিন্তা করা কিছুটা কঠিন তাই এখানে বিভিন্ন অপারেশনের মাধ্যমে কীভাবে বিভিন্ন মূল্যবোধকে মূল্যায়ন করা হবে তার তুলনা করে একটি সাধারণ ম্যাট্রিক্স এখানে দেওয়া হয়েছে:

|           | ===null | is_null | isset | empty | if/else | ternary | count>0 |
| -----     | -----   | -----   | ----- | ----- | -----   | -----   | -----   |
| $a;       | true    | true    |       | true  |         |         |         |
| null      | true    | true    |       | true  |         |         |         |
| []        |         |         | true  | true  |         |         |         |
| 0         |         |         | true  | true  |         |         | true    |
| ""        |         |         | true  | true  |         |         | true    |
| 1         |         |         | true  |       | true    | true    | true    |
| -1        |         |         | true  |       | true    | true    | true    |
| " "       |         |         | true  |       | true    | true    | true    |
| "str"     |         |         | true  |       | true    | true    | true    |
| [0,1]     |         |         | true  |       | true    | true    | true    |
| new Class |         |         | true  |       | true    | true    | true    |

টেবিলটি ফিট করতে আমি লেবেলগুলিকে কিছুটা সংকুচিত করেছি:

  • $a; একটি ঘোষিত তবে স্বাক্ষরিত ভেরিয়েবলকে বোঝায়
  • প্রথম কলামে থাকা সমস্ত কিছুই একটি নির্ধারিত মানকে বোঝায়, যেমন:
    • $a = null;
    • $a = [];
    • $a = 0;
    • ...
  • কলামগুলি তুলনামূলক ক্রিয়াকলাপগুলি উল্লেখ করে:
    • $a === null
    • isset($a)
    • empty($a)
    • $a ? true : false
    • ...

সমস্ত ফলাফল বুলিয়ান হয়, trueমুদ্রিত হয় এবং falseবাদ দেওয়া হয়।

আপনি নিজে পরীক্ষা চালাতে পারেন, এই টুকরোটি দেখুন:
https://gist.github.com/mfdj/8165967


এই প্রশ্নের "0"empty
রিক স্কাফ

17

নাল ভেরিয়েবলের অস্তিত্বের জন্য পরীক্ষা করার জন্য আপনি কমপ্যাক্ট ল্যাঙ্গুয়েজ কনস্ট্রাক্ট ব্যবহার করতে পারেন। যে অস্তিত্বের অস্তিত্ব নেই তার ফলটি আরম্ভ হবে না, যখন নাল মানগুলি প্রদর্শিত হবে।

$x = null;
$y = 'y';

$r = compact('x', 'y', 'z');
print_r($r);

// Output:
// Array ( 
//  [x] => 
//  [y] => y 
// ) 

আপনার উদাহরণের ক্ষেত্রে:

if (compact('v')) {
   // True if $v exists, even when null. 
   // False on var $v; without assignment and when $v does not exist.
}

অবশ্যই গ্লোবাল স্কোপে ভেরিয়েবলের জন্য আপনি অ্যারে_কি_এক্সিস্টগুলিও ব্যবহার করতে পারেন ()।

বিটিডব্লিউ ব্যক্তিগতভাবে আমি প্লেগের মতো পরিস্থিতি এড়িয়ে যাব যেখানে ভেরিয়েবলের অস্তিত্ব নেই এবং ভেরিয়েবলের নাল ভ্যালু রয়েছে তার মধ্যে অর্থগত পার্থক্য রয়েছে। পিএইচপি এবং সর্বাধিক অন্যান্য ভাষা কেবল আছে বলে মনে করে না।


3
পিএইচপি করে না, তবে আমি বলব না যে বেশিরভাগ অন্যান্য ভাষা তা করে না। ভেরিয়েবল ঘোষিত বেশিরভাগ যে কোনও ভাষা ভেরিয়েবল ঘোষিত না হলে একটি ত্রুটি ফেলবে তবে আপনি সেগুলিতে সেট করতে পারেন NULL। শব্দার্থগতভাবে, এর NULLঅর্থ "কোনও সংস্থান নেই", তবে একটি ভেরিয়েবল সংজ্ঞা না দেওয়া একটি প্রোগ্রামার ত্রুটি।
এম মিলার

1
@ মিমিলার শিওর, তবে "প্রোগ্রামার ত্রুটি" এর ক্ষেত্রে একটি সংস্থান এবং "প্রোগ্রামার ত্রুটি" এর ক্ষেত্রে একটি পৃথক পথ অনুসরণকারী লিখন কোডটি মোটামুটি বোকামি। আপনি যদি ডিবাগিংয়ের সময় অঘোষিত ভেরিয়েবলগুলি সনাক্ত করতে চান তবে কোনও স্থিতিশীল বিশ্লেষণ সরঞ্জামটি ব্যবহার করুন, যেমন আপনি কোনও ভাষায় সম্ভাব্য ত্রুটিগুলি খুঁজে পেতে চান।
আইএমএসওপি

@ মিমিলার, শীতল, আপনি কীভাবে এটি ভেবেছিলেন?
পেসারিয়ার

1
@ মিমিলার তবে এটি প্রত্যাখ্যান হিসাবে কাজ করে না, কারণ উত্তরের বিবৃতিটি "পরিবর্তনশীল বিদ্যমান নয়" সম্পর্কে স্পষ্টতই, এবং আপনার পাল্টা উদাহরণটি কোনও অবজেক্ট সম্পত্তি / হ্যাশ কী বিদ্যমান নয় সম্পর্কে । এই মামলার মধ্যে পার্থক্য কেবল ঘটনাগত নয়।
IMSoP

1
@ মিমিলার - এটি আরও ভাল উদাহরণ better তবুও, কঠোর ভাষায় 20+ বছর প্রোগ্রাম করার পরে, আমার যে পরিস্থিতিগুলির মধ্যে একটি পার্থক্যের প্রয়োজন ছিল undefinedএবং nullএত বিরল যে আমি এটিকে মিস করি না। আইএমএইচও, এর প্রধান ব্যবহার undefinedহ'ল "একটি কঠোর ভাষায় প্রোগ্রামার ত্রুটি"। কঠোর ভাষায়, যদি আমার আলাদা স্বতন্ত্র অবস্থার প্রয়োজন হয় client did not state a valueতবে আমি পরিস্থিতিটির জন্য উপযুক্ত একটি মান ঘোষণা করি এবং এটির জন্য পরীক্ষা করি। সবচেয়ে খারাপ ক্ষেত্রে, একটি পৃথক পতাকা চলক যুক্ত করতে হবে। তবে দু'বার বিভিন্ন অ-মূল্যবান রাষ্ট্রের সাথে সবসময় মোকাবিলা করার চেয়ে কদাচিৎ তা করা ভাল !!
টুলমেকারস্টেভ

15

যুক্তিযুক্তভাবে ভাবনা, নাল ব্যাখ্যা

আমি এই সমস্তটির সুস্পষ্ট উত্তরটি অনুমান করি ... আপনার ভেরিয়েবলগুলি NULL হিসাবে আরম্ভ করবেন না, সেগুলি কী হয়ে ওঠার উদ্দেশ্যে রয়েছে তার সাথে প্রাসঙ্গিক কিছু হিসাবে সূচনা করুন।

NULL সঠিকভাবে চিকিত্সা করুন

NULL কে "অ-অযৌক্তিক মান" হিসাবে বিবেচনা করা উচিত, এটি NULL এর অর্থ। চলকটি পিএইচপি-তে বিদ্যমান হিসাবে শ্রেণিবদ্ধ করা যায় না কারণ এটি কী ধরণের সত্তা হওয়ার চেষ্টা করছে তা বলা হয়নি। এটি অস্তিত্বহীন থাকতে পারে, সুতরাং পিএইচপি ঠিক বলেছে "চমৎকার, এটি এর কারণ নয় যেহেতু এটির কোনও মানে নেই এবং NULL এটি বলার আমার উপায়"।

একটি যুক্তি

আসুন এখন তর্ক করা যাক। "তবে NULL 0 বা মিথ্যা বা '' বলার মতো।

ভুল, 0-মিথ্যা- '' এগুলি এখনও শূন্য মান হিসাবে শ্রেণিবদ্ধ, তবে এগুলি কোনও প্রশ্নের মান বা প্রাক-নির্ধারিত উত্তর হিসাবে নির্দিষ্ট। মিথ্যা হ্যাঁ বা না-এর উত্তর, '' কেউ জমা দেওয়া শিরোনামের উত্তর এবং 0 0 পরিমাণ বা সময় ইত্যাদির উত্তর They এগুলি কোনও প্রকারের উত্তর / ফলাফল হিসাবে সেট করা হয় যা সেট হিসাবে বৈধ করে তোলে।

NULL এর এখন পর্যন্ত কোন উত্তর নেই, এটি আমাদের হ্যাঁ বা না বলে দেয় না এবং এটি আমাদের সময় দেয় না এবং এটি কোনও ফাঁকা স্ট্রিং জমা দেওয়ার কথা বলে না। এটি নুলকে বোঝার প্রাথমিক যুক্তি।

সারসংক্ষেপ

সমস্যাটি সমাধান করার জন্য এটি উদ্বেগজনক ফাংশন তৈরির বিষয়ে নয়, এটি আপনার মস্তিষ্কের NUL- র দিকে দৃষ্টি আকর্ষণ করার পদ্ধতিটি পরিবর্তন করছে। যদি এটি নাল হয় তবে ধরে নিন যে এটি কোনও কিছু হিসাবে সেট করা নেই। আপনি যদি ভেরিয়েবলগুলি প্রাক-সংজ্ঞায়িত করে থাকেন তবে তাদের 0, ফলস বা আপনার ব্যবহারের ধরণের উপর নির্ভর করে "" তাদের পূর্বনির্ধারিত করুন।

এই উদ্ধৃতি নির্দ্বিধায়। এটি আমার যৌক্তিক মাথার শীর্ষে নেই :)


5
দুর্দান্ত উত্তর। আমি বহুবার লোককে দেখি যে তারা কীভাবে কোনও ভাষার এই বৈশিষ্ট্যটিকে বা এই বৈশিষ্ট্যটিকে ঘৃণা করে about তবে তারা ধরেই নিচ্ছে যে "এটি যদি আমার উপায়ে না করে, তবে এটি ভেঙে গেছে।" হ্যাঁ, ডিজাইনের খারাপ সিদ্ধান্ত আছে। তবে খুব ঘনিষ্ঠ চিন্তার বিকাশকারীও আছেন!
কার্টিসডেফ

23
আনসেট ভেরিয়েবল এবং ভেরিয়েবল === নালীর মধ্যে একটি বিশাল পার্থক্য রয়েছে। একজনের অস্তিত্ব নেই, অন্যটির মান নালায রয়েছে। যুক্তিগুলি যে নাল মানে কোনও মূল্য সহজেই সত্য হয় না। নাল টাইপ নাল একটি মান। এটি পুরোপুরি বৈধ মান এবং পিএইচপি করার জন্য এটি অ-বিদ্যমান মান হিসাবে গণ্য করার কোনও কারণ নেই যা এটি দুঃখের সাথে করে। এটি ঠিক আছে, যদি অ-বিদ্যমান ভেরিয়েবলগুলি নাল হয় এবং প্রতিটি বিদ্যমান ভেরিয়েবল নাল ছিল না এবং ভেরিয়েবলের মধ্যে নাল নির্ধারণ করা সেটটি সেট না করে। তবে অনেকগুলি পরিস্থিতি রয়েছে, যেখানে ফাংশনগুলি আসল মান হিসাবে বাতিল হয়। তারপরে আমরা বিভ্রান্ত হয়ে পড়েছি, কারণ এর পরীক্ষার কোনও রক্তাক্ত উপায় নেই।
enrey

2
আমি জানি যে পিএইচপি, নরকের পরিবর্তনশীল অস্তিত্ব পরীক্ষা করার জন্য আমরা "অনুমিত" নই, এটি পরীক্ষা করার কোনও সত্যিকারের উপায়ও নেই। আমি কোড লিখতে যাচ্ছি না যা এটির উপর নির্ভর করে, কারণ এটি পিএইচপি সম্ভব নয়। এটি পিএইচপিএইচ এর একটি সীমাবদ্ধতা। নন-সেট এবং নাল ভেরিয়েবলের মধ্যে স্পষ্টতই পার্থক্য রয়েছে, তবুও পিএইচপি এইগুলি আলাদা করার কোনও উপায় সরবরাহ করে না। তবুও অনেকগুলি মেটা কার্যকারিতা এটি ইন্টার্নির উপর নির্ভর করে: অ-বিদ্যমান ভার্সা পড়া নোটিশ উত্পন্ন করে, নাল isset($a['x'])হলে আপনাকে মিথ্যা বলবে x, তবুও এটি প্রদর্শিত হবে count($a)... compactসহ সমস্ত সেট ভেরিয়েবলগুলিতে কাজ করবে nulls, ইত্যাদি on
enrey

3
এই উত্তরটি একটি প্রধান উপায়ে ত্রুটিযুক্ত: ওও প্রোগ্রামিংয়ে নালকে "অবজেক্ট" না বোঝার যুক্তিযুক্ত পছন্দ choice উদাহরণস্বরূপ, অব্যক্ত পরিস্থিতিতে যখন কোনও ফাংশন কোনও বস্তু বা কোনও অবজেক্ট ফিরিয়ে দিতে পারে তখন নাল স্পষ্ট পছন্দ। টেকনিক্যালি পিএইচপি-তে, মিথ্যা বা বুলিয়ান প্রসঙ্গে মিথ্যা হিসাবে বিবেচিত অন্য কোনও মান ব্যবহার করা যেতে পারে তবে তারপরে আপনি কিছু অর্থপূর্ণ বিশুদ্ধতা হারাচ্ছেন। সুতরাং, নাল যে একটি পরিবর্তনশীল আরম্ভ করতে একটি বস্তু অবশেষে রাখা উচিত, কারণ এটি একটি পুরোপুরি যুক্তিসঙ্গত মান হয় তা পরিণত উদ্দীষ্ট এমন প্রাসঙ্গিক।
চাজোমেটিকস

3
পিএইচপি যতক্ষণ না অনির্ধারিত ভেরিয়েবলগুলির জন্য ত্রুটিগুলি নিক্ষেপ করে তবে শূন্যের জন্য না, ততক্ষণ পার্থক্য রয়েছে। যদি নাল এবং অপরিজ্ঞাত সত্যই একই ধারণা ছিল, তবে পিএইচপি'র উচিত ডিফল্ট অপরিজ্ঞাত / অঘোষিত ভেরিয়েবলগুলি নাল হয়ে যায় এবং কখনই কোনও ত্রুটি নিক্ষেপ করা উচিত নয়, তবে কেউই এটি চায় না কারণ এটি একটি উন্নয়নের দুঃস্বপ্ন। মূল্য শব্দার্থবিজ্ঞানের প্রসঙ্গে নাল এবং অপরিজ্ঞাত প্রকৃতপক্ষে আলাদা নাও হতে পারে, তবে স্পষ্ট এবং ডিবাজিযোগ্য কোড লেখার ক্ষেত্রে এটি খুব আলাদা।
ক্রিস মিডলটন

9

অবজেক্ট বৈশিষ্ট্য সম্পত্তি_পরিচয়বিদদের দ্বারা অস্তিত্বের জন্য পরীক্ষা করা যায়

ইউনিট পরীক্ষা থেকে উদাহরণ:

function testPropertiesExist()
{
    $sl =& $this->system_log;
    $props = array('log_id',
                   'type',
                   'message',
                   'username',
                   'ip_address',
                   'date_added');

    foreach($props as $prop) {
        $this->assertTrue(property_exists($sl, $prop),
                           "Property <{$prop}> exists");
    }
}

4

NUL এর অর্থ কী তা নিয়ে গ্রেটবিগম্যাসিভের আলোচনার সংযোজন হিসাবে , " অস্তিত্ব" আসলে কী বোঝায় তা বিবেচনা করুন।

অনেক ভাষায়, আপনার প্রতিটি পরিবর্তনশীল ব্যবহার করার আগে আপনাকে স্পষ্টভাবে ডিক্লেয়ার করতে হবে ; এটি এটির ধরণ নির্ধারণ করতে পারে তবে আরও গুরুত্বপূর্ণভাবে এটি এর ব্যাপ্তিটি ঘোষণা করে । একটি ভেরিয়েবল তার ক্ষেত্রের সর্বত্র "বিদ্যমান", এবং এর বাইরে কোথাও নেই - এটি পুরো ফাংশন, বা একক "ব্লক" হোন।

এর স্কোপের মধ্যে একটি ভেরিয়েবল একটি লেবেলের কিছু অর্থ নির্ধারণ করে যা আপনি, প্রোগ্রামারটি বেছে নিয়েছেন। এর সুযোগের বাইরে, সেই লেবেলটি অর্থহীন (আপনি একই ক্ষেত্রটি ভিন্ন স্কোপে ব্যবহার করেন কিনা তা মূলত অপ্রাসঙ্গিক)।

পিএইচপি-তে, ভেরিয়েবলগুলি ঘোষণার প্রয়োজন হয় না - আপনার প্রয়োজনের সাথে সাথেই তারা প্রাণে ফিরে আসে। আপনি যখন প্রথমবারের জন্য কোনও ভেরিয়েবলটিতে লিখবেন, পিএইচপি সেই পরিবর্তনশীলটির জন্য মেমরিতে একটি এন্ট্রি বরাদ্দ করে। আপনি যদি এমন কোনও ভেরিয়েবল থেকে পড়েন যার বর্তমানে কোনও প্রবেশ নেই, পিএইচপি সেই পরিবর্তনশীলটিকে মান হিসাবে বিবেচনা করে NULL

তবে, আপনি যদি প্রথমে "আরম্ভকরণ" না করে ভেরিয়েবল ব্যবহার করেন তবে স্বয়ংক্রিয় কোডের মান সনাক্তকারীরা আপনাকে সতর্ক করে দেবে। প্রথমত, এটি টাইপগুলি সনাক্ত করতে সহায়তা করে যেমন অ্যাসাইন করা $thingIdকিন্তু থেকে পড়া $thing_id; তবে দ্বিতীয়ত, এটি আপনাকে ঘোষণার মতো সেই ভেরিয়েবলটির অর্থ কী তা নিয়ে বিবেচনা করতে বাধ্য করে।

যে কোনও কোড যে কোনও ভেরিয়েবল "বিদ্যমান" আছে কিনা তা যত্নশীল করে - এটি আরম্ভ করা হয়েছে কি না, আপনি প্রোগ্রামার হিসাবে কোডটির সেই বিন্দুতে সেই লেবেলটির অর্থ দিয়েছেন। যেহেতু আপনি এটি ব্যবহার করছেন, এটি অবশ্যই কিছুটা অর্থে "বিদ্যমান" থাকতে হবে এবং যদি এটি বিদ্যমান থাকে তবে এর অবশ্যই একটি অন্তর্নিহিত মান থাকতে হবে; পিএইচপি-তে, যে অন্তর্নিহিত মানnull

পিএইচপি যেভাবে কাজ করে তার কারণে, এমন কোড রচনা করা সম্ভব যা অস্তিত্বের ভেরিয়েবলের নামস্থানটিকে বিবেচনা করে যে আপনি যে লেবেলগুলিকে অর্থ দিয়েছেন তা নয়, তবে একধরনের কী-মান স্টোর হিসাবে। আপনি, উদাহরণস্বরূপ, এই মত কোড রান করতে পারেন: $var = $_GET['var_name']; $$var = $_GET['var_value'];আপনি পারছেন বলেই, এর অর্থ এটি একটি ভাল ধারণা নয়।

দেখা যাচ্ছে, পিএইচপি-র কী-ভ্যালু স্টোরকে উপস্থাপন করার অনেক ভাল উপায় আছে, যাকে এসোসিয়েটিভ অ্যারে বলা হয়। এবং যদিও একটি অ্যারের মানগুলি ভেরিয়েবলগুলির মতো বিবেচনা করা যায় তবে আপনি সামগ্রিকভাবে অ্যারেতেও অপারেশন করতে পারেন perform আপনার যদি কোনও এসোসিয়েটিভ অ্যারে থাকে তবে এটিতে কী ব্যবহার করে কী রয়েছে তা পরীক্ষা করতে পারেন array_key_exists()

আপনি গতিশীলভাবে বৈশিষ্ট্য নির্ধারণ property_exists()করে একইরকমভাবে অবজেক্টগুলিও ব্যবহার করতে পারেন , সেক্ষেত্রে আপনি ঠিক একই পদ্ধতিতে ব্যবহার করতে পারেন । অবশ্যই, যদি আপনি কোন ক্লাসে নির্ধারণ করুন, আপনার কি ডিক্লেয়ার করতে পারে বৈশিষ্ট্য এটা আছে - আপনি এমনকি মধ্যে নির্বাচন করতে পারবেন public, privateএবং protectedসুযোগ।

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


1
খুব ভাল পয়েন্ট, যদিও প্রশ্নের সঠিক উত্তর না।
চাজোমেটিকস

1
সুস্পষ্ট প্রশ্নের কাছে "কীভাবে আমাদের পিএইচপি-তে কোনও ভেরিয়েবলের অস্তিত্বের জন্য নির্ভরযোগ্যভাবে পরীক্ষা করা উচিত?" আমার উত্তর "আপনি নন, এবং কেন এটি" why এই উত্তর এবং গ্রেটবিগম্যাসিভ উভয়ই "কেন সেভাবে আচরণ করে?" এই অন্তর্নিহিত প্রশ্নের উত্তর দেয় isset()
আইএমএসওপি

"আপনি যদি এমন কোনও চলক থেকে পড়েন যার বর্তমানে কোনও প্রবেশ নেই, পিএইচপি এই পরিবর্তনশীলটিকে মান ন্যূনাল হিসাবে বিবেচনা করে।" এটা মিথ্যা। একটি অপরিবর্তিত পরিবর্তনশীল কেবল অপরিজ্ঞাত। আপনি এটি অ্যাক্সেস করার চেষ্টা করার সময় এটি বাতিল হয়ে যেতে পারে, তবে এটি অপ্রাসঙ্গিক।
হুগো জিংক

@ হুগোজিংক কিসের সাথে অপ্রাসঙ্গিক? অপরিজ্ঞাত ভেরিয়েবলের মান সম্পর্কে যে কোনও পরীক্ষা আপনি করেন তা আপনাকে জানায় যে মানটি null। আপনার মূল্য দেখার আগে এই মানটি বিদ্যমান কিনা তা দার্শনিকদের জন্য প্রশ্ন, তবে যতদূর পর্যবেক্ষণযোগ্য আচরণের ক্ষেত্রেই মূল্যটি ধারাবাহিকভাবে বিবেচিত হয় null
আইএমএসপ

3

issetভেরিয়েবল সেট করা আছে কিনা তা পরীক্ষা করে এবং যদি তাই হয় তবে এর মানটি নুল নয় কিনা । পরবর্তী অংশটি (আমার মতে) এই ফাংশনের ক্ষেত্রের মধ্যে নেই। কোনও ভেরিয়েবল ন্যূনাল কারণ এটি সেট করা হয়নি বা এটি স্পষ্টভাবে NULL এ সেট করা আছে তা নির্ধারণের জন্য কোনও শালীন কাজ নেই ।

এখানে একটি সম্ভাব্য সমাধান:

$e1 = error_get_last();
$isNULL = is_null(@$x);
$e2 = error_get_last();
$isNOTSET = $e1 != $e2;
echo sprintf("isNOTSET: %d, isNULL: %d", $isNOTSET, $isNULL);

// Sample output:
// when $x is not set: isNOTSET: 1, isNULL: 1
// when $x = NULL:     isNOTSET: 0, isNULL: 1
// when $x = false:    isNOTSET: 0, isNULL: 0

অন্যান্য কর্মক্ষেত্র হ'ল এর আউটপুট অনুসন্ধান করা get_defined_vars():

$vars = get_defined_vars();
$isNOTSET = !array_key_exists("x", $vars);
$isNULL = $isNOTSET ? true : is_null($x);
echo sprintf("isNOTSET: %d, isNULL: %d", $isNOTSET, $isNULL);

// Sample output:
// when $x is not set: isNOTSET: 1, isNULL: 1
// when $x = NULL:     isNOTSET: 0, isNULL: 1
// when $x = false:    isNOTSET: 0, isNULL: 0

2

আমি NULL সম্পর্কে আপনার যুক্তির সাথে একমত নই , এবং বলছি যে NULL সম্পর্কে আপনার মানসিকতা পরিবর্তন করা দরকার কেবল অদ্ভুত।

আমি মনে করি isset () সঠিকভাবে ডিজাইন করা হয়নি, isset () আপনাকে ভেরিয়েবলটি সেট করা আছে কিনা তা আপনাকে জানাতে হবে এবং এটি ভেরিয়েবলের প্রকৃত মানের সাথে সম্পর্কিত হওয়া উচিত নয়।

আপনি যদি কোনও ডাটাবেস থেকে ফিরে আসা মানগুলি এবং কোনও একটি কলামের নুল মান রয়েছে কিনা তা পরীক্ষা করে দেখেন, আপনি এখনও জানতে চান যে মানটি নূন্যতম হলেও এটি বিদ্যমান কিনা ... নাপ এখানে বিশ্বাস নেই।

অনুরূপভাবে

$a = array ('test' => 1, 'hello' => NULL);

var_dump(isset($a['test']));   // TRUE
var_dump(isset($a['foo']));    // FALSE
var_dump(isset($a['hello']));  // FALSE

isset () এর মতো কাজ করার জন্য ডিজাইন করা উচিত ছিল:

if(isset($var) && $var===NULL){....

এইভাবে আমরা প্রকারটি পরীক্ষা করার জন্য এটি প্রোগ্রামারের উপরে ছেড়ে দিচ্ছি এবং এটি সেট না করে ছেড়ে দেওয়া হবে না) এটি মান না কারণ মানটি নুল - এটি কেবল নির্বোধ নকশা


আপনার উদাহরণটি ভেরিয়েবলের অস্তিত্ব পরীক্ষা করছে না, তবে একটি অ্যারে কী আছে of আকারে বিদ্যমান যে একটি সমাধান array_key_exists। সত্যিকারের পরিবর্তনশীল উপস্থিত থাকলে আপনি কখনই রান-টাইমে জানেন না এমন পরিস্থিতিতে থাকা উচিত নয়।
আইএমএসওপি

@ চাজোম্যাটিকাস ওয়েল, আপনার কখনই এমন পরিস্থিতিতে উচিত হবে না যেখানে রেজিস্ট্রেশন_গ্লোবাল চালু থাকে, তাই আমি সেই বক্তব্যটির পাশে আছি।
আইএমএসওপি

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

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

2

আমি এটিতে একটি দ্রুত দুটি সেন্ট যুক্ত করতে যাচ্ছি। এই সমস্যাটি বিভ্রান্ত করার একটি কারণ হ'ল কারণ এই দৃশ্যটি ত্রুটি প্রতিবেদন না করে একই ফলাফলটি প্রত্যাবর্তন করে বলে মনে হচ্ছে :

$a = null;
var_dump($a); // NULL
var_dump($b); // NULL

আপনি এই ফলাফলটি থেকে অনুমান করতে পারেন যে $a = nullএবং সংজ্ঞা না দেওয়ার মধ্যে পার্থক্য $bকিছুই নয় nothing

আপ ক্র্যাঙ্ক ত্রুটি রিপোর্ট:

NULL

Notice: Undefined variable: b in xxx on line n
NULL

দ্রষ্টব্য: এটি একটি সংজ্ঞায়িত পরিবর্তনশীল ত্রুটি ছুঁড়েছে, তবে এর আউটপুট মানটি var_dumpএখনও আছে NULL

পিএইচপি স্পষ্টতই একটি নাল ভেরিয়েবল এবং একটি অপরিজ্ঞাত ভেরিয়েবলের মধ্যে পার্থক্য করার অভ্যন্তরীণ ক্ষমতা রাখে। আমার কাছে মনে হচ্ছে এটি পরীক্ষা করার জন্য একটি বিল্ট ইন ফাংশন থাকা উচিত।

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


অপরিবর্তিত ভেরিয়েবলগুলির বিষয়ে সতর্কতা হ'ল প্রোগ্রামারটির জন্য একটি ইঙ্গিত যা তারা কোডটিতে কিছু ভুল করেছে। বাইরের ডিবাগিংয়ের জন্য (যার জন্য ভাষার বাইরের সরঞ্জাম রয়েছে), এই জাতীয় অবস্থা সনাক্ত করার জন্য কোনও প্রোগ্রামের প্রয়োজন হবে না কারণ প্রোগ্রামারকে সর্বদা জানতে হবে যে তারা কী পরিবর্তনশীল ঘোষণা করছে lar
আইএমএসওপি

1

আমি যদি নিম্নলিখিতটি চালিত করি:

echo '<?php echo $foo; ?>' | php

আমি একটি ত্রুটি পেয়েছি:

PHP Notice:  Undefined variable: foo in /home/altern8/- on line 1

আমি যদি নিম্নলিখিতটি চালিত করি:

echo '<?php if ( isset($foo) ) { echo $foo; } ?>' | php

আমি ত্রুটি পাই না।

আমার যদি এমন একটি চলক থাকে যা সেট করা উচিত, আমি সাধারণত নিম্নলিখিতগুলির মতো কিছু করি।

$foo = isset($foo) ? $foo : null;

অথবা

if ( ! isset($foo) ) $foo = null;

এইভাবে, পরে স্ক্রিপ্টে, আমি নিরাপদে oo foo ব্যবহার করতে পারি এবং জানতে পারি যে এটি "সেট করা" আছে এবং এটি বাতিল হয়ে যায় to পরে if ( is_null($foo) ) { /* ... */ }যদি আমার প্রয়োজন হয় এবং নির্দিষ্টভাবে জানতে পারি যে ভেরিয়েবলটি শূন্য থাকে তবে তা বিদ্যমান।

পুরো আইসেটের ডকুমেন্টেশন প্রাথমিকভাবে যা আটকানো হয়েছিল তার চেয়ে একটু বেশি পড়ে। হ্যাঁ, এটি এমন চলকটির জন্য মিথ্যা প্রত্যাবর্তন করে যা পূর্বে সেট করা ছিল তবে এখন নাল, তবে ভেরিয়েবলটি এখনও (কখনও) সেট করা না থাকলে এবং সেট না করে চিহ্নিত হিসাবে চিহ্নিত যে কোনও ভেরিয়েবলের ক্ষেত্রে এটি মিথ্যাও প্রত্যাবর্তন করে। এটি আরও নোট করে যে NULL বাইট ("\ 0") নਾਲ হিসাবে বিবেচনা করা হয় না এবং সত্য ফিরে আসবে।

কোনও ভেরিয়েবল সেট করা আছে কিনা তা নির্ধারণ করুন।

যদি কোনও ভেরিয়েবল আনসেট () দিয়ে সেট না করা থাকে তবে এটি আর সেট করা হবে না। isset () নুআলএল সেট করা হয়েছে এমন একটি ভেরিয়েবলের পরীক্ষা করে যদি মিথ্যা প্রত্যাবর্তন করে। এছাড়াও নোট করুন যে একটি NULL বাইট ("\ 0") পিএইচপি NULL ধ্রুবকের সমতুল্য নয়।


তিনি এই লিঙ্কটি থেকে দস্তাবেজগুলি পেয়েছিলেন। আপনার প্রদত্ত লিঙ্কটিতে বর্ণনামূলক বিভাগের প্রথম বাক্য, দ্বিতীয় অনুচ্ছেদটি পড়ুন এটি ঠিক উপরে যা তিনি উদ্ধৃত করেছেন।
জোরডেচে

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

1
ভালভাবে ডিজাইন করা "বৃহত ওও" প্রকল্পগুলির জন্য কেন এটি মোটেও সমস্যা হবে? আপনি কেন কখনও এমন কোনও পদ্ধতিতে body foo রাখতে পারেন যা সম্ভবত এটির প্রথম ব্যবহারের আগে সেট করা হয়নি?
বিউ সিমেনসেন

1

ব্যবহার করার চেষ্টা করুন

unset($v)

এটি কেবলমাত্র একবার পরিবর্তনশীল সেট না করা হয় যখন এটি নির্দিষ্টভাবে আনসেট করা হয় ($ v)। দেখে মনে হচ্ছে আপনার 'অস্তিত্বের' অর্থ পিএইচপি-র সংজ্ঞা থেকে আলাদা is NULL অবশ্যই বিদ্যমান, এটি NULL।


আপনি কি বোঝাতে চাচ্ছেন তা আমি নিশ্চিত নই. আপনার যদি অ্যারে থাকে তবে একটি উপাদান 'এ' দিয়ে, আপনাকে পিএইচপি-তে অ্যালিমেন্ট 'বি'র অস্তিত্ব না থাকার জন্য () এলিমেন্ট' বি 'আনসেট করতে হবে না, এটি কেবল বিদ্যমান নেই। যেমন গ্লোবাল ভেরিয়েবলগুলির সাথে একই জিনিস, যা আপনি LO গ্লোবাল অ্যারের উপাদান হিসাবে ভাবতে পারেন।
চ্যাজোমেটিকাস

1
তবে আমি সম্মত হই যে নুল মান সহ একটি চলক আসলে বিদ্যমান থাকে।
চ্যাজোমেটিকস

0

আমার পিএইচপি প্রোগ্রামিংয়ের সমস্ত বছরগুলিতে আমাকে বলতে হবে, আমি isset()কোনও নাল ভেরিয়েবলের সাথে মিথ্যা ফিরিয়ে নিয়ে কোনও সমস্যার মুখোমুখি হইনি । ওটো, আমি isset()নাল অ্যারে প্রবেশে ব্যর্থ হওয়ার সাথে সমস্যার মুখোমুখি হয়েছি - তবে array_key_exists()সেই ক্ষেত্রে সঠিকভাবে কাজ করে।

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


0

খালি () ফাংশনটির জন্য পিএইচপি ম্যানুয়াল অনুসারে, "ভেরিয়েবলটি খালি বলে বিবেচনা করা হয় কিনা তা নির্ধারণ করুন A ভেরিয়েবলটি খালি বিবেচনা করা হয় যদি এটি উপস্থিত না থাকে বা যদি এর মান FALSE এর সমান হয় empty খালি () সতর্কতা তৈরি করে না যদি ভেরিয়েবলের অস্তিত্ব নেই " (আমার জোর।) এর অর্থ শূন্য () ফাংশনটি প্রশ্নের শিরোনাম অনুসারে "পিএইচপি-তে একটি পরিবর্তনশীলের অস্তিত্ব পরীক্ষা করার সর্বোত্তম উপায়" হিসাবে যোগ্য হওয়া উচিত।

যাইহোক, এটি যথেষ্ট ভাল নয়, কারণ খালি () ফাংশনটি একটি ভেরিয়েবল দ্বারা বোকা বানানো যেতে পারে যা বিদ্যমান এবং এটি NUL তে সেট করা আছে।

আমি আরও ভাল কিছু উপস্থাপনের জন্য আমার পূর্ববর্তী উত্তরকে বাধা দিচ্ছি, কারণ এটি আমার আসল উত্তরের চেয়ে তুলনামূলক কম (যা তুলনামূলকভাবে এই বাধা অনুসরণ করে)।

  function undef($dnc) //do not care what we receive
  { $inf=ob_get_contents();             //get the content of the buffer
    ob_end_clean();                     //stop buffering outputs, and empty the buffer
    if($inf>"")                         //if test associated with the call to this function had an output
    { if(false!==strpos($inf, "Undef"); //if the word "Undefined" was part of the output
        return true;                    //tested variable is undefined
    }
    return false;                       //tested variable is not undefined
  }

কোডের দুটি সাধারণ লাইন উপরের ফাংশনটি ব্যবহার করে ভেরিয়েবল অপরিবর্তিত থাকলে তা প্রকাশ করতে পারে:

  ob_start();                           //pass all output messages (including errors) to a buffer
  if(undef($testvar===null))            //in this case the variable being tested is $testvar

আপনি এই দুটি লাইন যথাযথ যে কোনও কিছুর সাথে অনুসরণ করতে পারেন, যেমন এই উদাহরণ:

    echo("variable is undefined");
  else
    echo("variable exists, holding some value");

আমি ফাংশনের অভ্যন্তরে ob_start () এবং ($ টেস্টভার === নাল) কল রাখতে চেয়েছিলাম এবং কেবল ভেরিয়েবলটি ফাংশনে স্থান দিতে চাইছিলাম, তবে এটি কার্যকর হয় না। এমনকি যদি আপনি ফাংশনের পরিবর্তকের "পাস বাই রেফারেন্স" ব্যবহার করার চেষ্টা করেন, পরিবর্তনশীল BECOMES সংজ্ঞায়িত করা হয়, এবং তারপরে ফাংশনটি কখনই সনাক্ত করতে পারে না যে এটি পূর্বনির্ধারিত ছিল। এখানে যা উপস্থাপন করা হয়েছে তা হ'ল আমি যা করতে চাইছিলাম এবং আসলে কী কাজ করে তার মধ্যে একটি সমঝোতা।

পূর্ববর্তীটি বোঝায় যে সর্বদা "অপরিজ্ঞাত ভেরিয়েবল" ত্রুটি বার্তায় চালনা এড়ানোর আরও একটি উপায় রয়েছে। (এখানে অনুমানটি হ'ল, এই জাতীয় বার্তাকে প্রতিরোধ করা কেন আপনি ভেরিয়েবল অপরিবর্তিত আছে কিনা তা পরীক্ষা করতে চান))

   function inst(&$v) { return; }  //receive any variable passed by reference; instantiates the undefined

আপনার $ টেস্টভারকে কিছু করার আগে কেবল সেই ফাংশনটি কল করুন:

   inst($testvar);                //The function doesn't affect any value of any already-existing variable

সদ্য-ইনস্ট্যান্টিয়েটেড ভেরিয়েবলের মান অবশ্যই বাতিল হয়ে গেছে, অবশ্যই!

(বাধা শেষ)

সুতরাং, কিছু অধ্যয়ন এবং পরীক্ষার পরে, এখানে কাজের গ্যারান্টিযুক্ত কিছু রয়েছে:

 function myHndlr($en, $es, $ef, $el)
 { global $er;
   $er = (substr($es, 0, 18) == "Undefined variable");
   return;
 }

 $er = false;
 if(empty($testvar))
 { set_error_handler("myHndlr");
   ($testvar === null);
   restore_error_handler();
 }
 if($er)  // will be 1 (true) if the tested variable was not defined.
 { ; //do whatever you think is appropriate to the undefined variable
 }

ব্যাখ্যা: একটি পরিবর্তনশীল। Er "ত্রুটি নেই" এর একটি ডিফল্ট মান থেকে আরম্ভ করা হয়। একটি "হ্যান্ডলার ফাংশন" সংজ্ঞায়িত করা হয়। যদি $ টেস্টভার (পরিবর্তনশীল আমরা জানতে চাই যে অপরিবর্তিত আছে কি না) প্রাথমিক খালি () ফাংশন পরীক্ষায় পাস করে, তবে আমরা আরও গভীর পরীক্ষা করি। পূর্বনির্ধারিত হ্যান্ডলার ফাংশনটি ব্যবহার করার জন্য আমরা সেট_অরর_হ্যান্ডলার () ফাংশনটিকে কল করি। তারপরে আমরা একটি সাধারণ পরিচয়-তুলনা করি identity টেস্টভারের সাথে জড়িত, যা যদি অনির্ধারিত থাকে তবে ত্রুটিযুক্ত ট্রিগার হবে। হ্যান্ডলার ফাংশন ত্রুটিটি ক্যাপচার করে এবং ত্রুটিটির কারণটি ভেরিয়েবল অপরিজ্ঞাত হয়েছে কিনা তা নির্দিষ্ট করে পরীক্ষা করে। ফলাফলটি ত্রুটি-তথ্য পরিবর্তনশীল in er এ স্থাপন করা হয়েছে, যা পরবর্তীতে $ টেস্টভার সংজ্ঞায়িত হয়েছিল কিনা তা নিশ্চিত করার জন্য আমরা যা যা করতে চাই তা পরীক্ষা করতে পারি। যেহেতু আমাদের কেবলমাত্র এই সীমিত উদ্দেশ্যে হ্যান্ডলার ফাংশন প্রয়োজন তাই আমরা মূল ত্রুটি-হ্যান্ডলিং ফাংশনটি পুনরুদ্ধার করি। "MyHndlr" ফাংশনটি কেবল একবার ঘোষণা করা দরকার; code টেস্টভার বা অন্য যে কোনও ভেরিয়েবলের জন্য আমরা এইভাবে পরীক্ষা করতে চাই তার জন্য অন্য কোডগুলি উপযুক্ত জায়গাগুলিতে অনুলিপি করা যায়।


1
যদি উদ্দেশ্যটি হ'ল কোনও সতর্কতা এড়ানোর জন্য যা আপনার ভেরিয়েবলগুলি ঘোষণা করা হয়নি, তবে সমাধানটি হ'ল আপনার কোডগুলি সঠিকভাবে ঘোষণা করার জন্য এটি ঠিক করা fix আপনার instফাংশনটি মূলত @ত্রুটি-দমন অপারেটরের মতো: "আমি জানি আমি এখানে কিছু ভুল করছি, তবে আমি কেবলমাত্র কোনওভাবেই আমার কোডের ক্রিয়াকলাপটি পরিবর্তন না করেই এই বার্তাটি সরে যেতে চাই"।
আইএমএসওপি

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

0

আমি মনে করি একমাত্র পূর্ণ সমাধান হ'ল নোটিশগুলি প্রতিবেদন করা

error_reporting(E_ALL); // Enables E_NOTICE

তবে আপনাকে অন্যের মধ্যে অপরিজ্ঞাত ভেরিয়েবল, ধ্রুবক, অ্যারে কী, শ্রেণীর বৈশিষ্ট্য দ্বারা উত্পন্ন সমস্ত বিজ্ঞপ্তিগুলি ঠিক করতে হবে। একবার আপনি এটি করেনি যে আপনাকে নাল এবং ঘোষিত ভেরিয়েবলগুলির মধ্যে পার্থক্য সম্পর্কে চিন্তা করতে হবে না এবং অস্পষ্টতা অদৃশ্য হয়ে যায়।

নোটিশ প্রতিবেদন সক্ষম করা করা সমস্ত পরিস্থিতিতে একটি ভাল বিকল্প নাও হতে পারে, তবে এটি সক্ষম করার উপযুক্ত কারণ রয়েছে:

আমি কেন E_NOTICE ত্রুটিগুলি ঠিক করব?

আমার ক্ষেত্রে এটি ছাড়া একটি প্রাইমে কাজ করা এক বছরেরও বেশি সময় ছিল, তবে ভেরিয়েবলগুলি ঘোষণার বিষয়ে সতর্কতা অবলম্বন করা হত, সুতরাং এটি দ্রুত রূপান্তরিত হয়েছিল।


0

কোনও পরিবর্তনশীল বর্তমান স্কোপে সংজ্ঞাযুক্ত কিনা তা জানার একমাত্র উপায় ( $GLOBALSবিশ্বাসযোগ্য নয়) array_key_exists( 'var_name', get_defined_vars() )


1
আমি মনে করি অন্য অনেক লোক এর আগে বলেছিল, বা আমি ভুল করছি?
স্টিফান ভেরক্যান্ট

-1

আমি ভ্যারিয়েবলের অস্তিত্বের জন্য যা খ) উপস্থিত রয়েছে তা যাচাই করার জন্য সেরা পদ্ধতি হিসাবে খালি না ব্যবহার করা পছন্দ করি এবং খ) নাল নয়।

if (!empty($variable)) do_something();

2
empty()ভেরিয়েবলটি নাল কিনা তা যাচাই করে না, এটি ভুয়া-ওয়াই কিনা তা যাচাই করে, যেমন ""(খালি স্ট্রিং) এর মধ্যে একটিও নয় , 0(0 পূর্ণসংখ্যা হিসাবে), 0.0(0 টি স্ট্রাইট "0"হিসাবে) NULL,, FALSE, array()(একটি খালি অ্যারে) এবং $var;(একটি ভেরিয়েবল ঘোষিত, তবে মান ছাড়াই) আপনি মান দুটি ইনপুট দিয়ে একটি ফর্ম মধ্যে একটি প্রয়োজনীয় রেডিও ক্ষেত্র আছে বলুন 0এবং 1। আপনি যদি empty()বৈধতার জন্য ব্যবহার করেন এবং ব্যবহারকারী একটিটি নির্বাচন করে 0, আপনি অজান্তে ত্রুটি করে "প্রয়োজনীয় ক্ষেত্রটি খালি থাকতে পারে না"। ম্যানুয়ালটি php.net/manual/en/function.empty.php দেখুন
হালিল Özgür
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.