পিএইচপি মধ্যে সেট না করার আগে var উপস্থিত কিনা তা পরীক্ষা করে দেখুন?


89

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

<?PHP
if (isset($_SESSION['signup_errors'])){
    unset($_SESSION['signup_errors']);
}

// OR

unset($_SESSION['signup_errors']);
?>


4
এটি NOTব্যবহার করা আরও দক্ষ isset। আমার উত্তর দেখুন। গতির পার্থক্য খুঁজতে আমি পরীক্ষা করেছি।
ড্যান ব্রে

উত্তর:


171

কেবল এটি আনসেট করুন, এটি উপস্থিত না থাকলে কিছুই করা হবে না।


4
আমি জানতাম না এটি কোনও সতর্কতা বা নোটিশ
ফেলবে কিনা

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

সত্য, এবং এটি আরও কার্যকর। আমার উত্তরটি একবার দেখুন কারণ আমি ব্যবহার issetনা করে শ্লোকগুলি ব্যবহারের গতি পরীক্ষা করেছি isset
ড্যান ব্রে

ভোট ডাউন - আপনি সংজ্ঞাযুক্ত নয় এমন অ্যারে কীগুলি আনসেট করতে পারবেন না।
বহনাম

4
@ জাসাচা আমি বলেছিলাম, আমরা পারব না!
বহনাম

48

পিএইচপি ম্যানুয়াল থেকে :

এই নোটগুলিতে কিছুটা বিভ্রান্তির বিষয়ে আগে যেগুলি অস্তিত্বহীন ভেরিয়েবলগুলি সেট না করে যখন বিজ্ঞপ্তিগুলি ট্রিগার করতে আনসেট () সৃষ্টি করে তার কারণ সম্পর্কে ...

যেমনটি বিদ্যমান নেই তেমন আনসেটিং ভেরিয়েবল

<?php
unset($undefinedVariable);
?>

একটি "অপরিজ্ঞাত পরিবর্তনশীল" বিজ্ঞপ্তি ট্রিগার করে না। কিন্তু

<?php
unset($undefinedArray[$undefinedKey]);
?>

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


42
এর আরও কিছুটা ব্যাখ্যা দরকার needs আপনি অ্যারে কীগুলি আনসেট করতে পারেন যা অ্যারির উপস্থিতি অবধি নির্ধারিত নয়।
কিংম্যাপল

@ ক্রিস্টোওহর প্রকৃতপক্ষে - এটি ওপিতে বর্ণিত নির্দিষ্ট দৃশ্যের সমাধান করে না।
মার্ক অ্যামেরি

23

অপরিবর্তিত unsetভেরিয়েবলের সাহায্যে কোনও ত্রুটি ঘটবে না (যদি না ভেরিয়েবলটি কোন অ্যারের সূচক (বা অবজেক্টটি বিদ্যমান না থাকে))।

তাই আপনাকে কেবলমাত্র বিবেচনা করা উচিত, এটিই সবচেয়ে দক্ষ। 'ইসসেট' দিয়ে পরীক্ষা না করা আরও দক্ষ, কারণ আমার পরীক্ষাটি প্রদর্শিত হবে।

পরীক্ষা:

function A()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        unset($defined);
    }
}

function B()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        unset($undefined);
    }
}

function C()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        if (isset($defined))
            unset($defined);
    }
}

function D()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        if (isset($undefined))
            unset($undefined);
    }
}

$time_pre = microtime(true);
A();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function A time = $exec_time ";

$time_pre = microtime(true);
B();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function B time = $exec_time ";

$time_pre = microtime(true);
C();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function C time = $exec_time ";

$time_pre = microtime(true);
D();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function D time = $exec_time";
exit();

ফলাফল:

  1. Function A time = 1.0307259559631
    • আইসেট ছাড়াই সংজ্ঞায়িত
  2. Function B time = 0.72514510154724
    • আইসেট ব্যতীত অপরিজ্ঞাত
  3. Function C time = 1.3804969787598
    • Isset ব্যবহার করে সংজ্ঞায়িত
  4. Function D time = 0.86475610733032
    • আইসেট ব্যবহার করে অপরিজ্ঞাত

উপসংহার:

এটি ব্যবহার করতে সর্বদা কম দক্ষ হয় isset, লিখতে যে পরিমাণ অতিরিক্ত সময় লাগে তা উল্লেখ না করে। এটি unsetঅনির্ধারিত পরিবর্তনশীল হতে পারে কিনা তা যাচাই করার চেয়ে দ্রুততর unset


4
এটি গৃহীত উত্তরের চেয়ে ভাল! এই পরীক্ষা চালানোর জন্য ধন্যবাদ।
অ্যাডাম ফ্রাইডম্যান

3

আপনি যদি কোনও ভেরিয়েবল আনসেট করতে চান তবে আপনি কেবল ব্যবহার করতে পারেন unset

unset($any_variable); // bool, object, int, string etc

কোনও ভেরিয়েবল আনসেট করার চেষ্টা করার সময় এর অস্তিত্বের জন্য অনুসন্ধানের কোনও লাভ হয় না।

যদি ভেরিয়েবলটি একটি অ্যারে হয় এবং আপনি কোনও উপাদানটি আনসেট করতে চান তবে আপনাকে অবশ্যই পিতামাতার উপস্থিত রয়েছে তা নিশ্চিত করতে হবে , এটি বস্তুর বৈশিষ্ট্যের ক্ষেত্রেও যায়।

unset($undefined_array['undefined_element_key']); // error - Undefined variable: undefined_array

unset($undefined_object->undefined_prop_name); // error - Undefined variable: undefined_object

এটি সহজেই unsetকোনও if(isset($var)){ ... }ব্লকে মোড়ানো দ্বারা সমাধান করা হয় ।

if(isset($undefined_array)){
    unset($undefined_array['undefined_element_key']); 
}

if(isset($undefined_object)){
    unset($undefined_object->undefined_prop_name); 
}

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

if(isset($array)){
...
}

if(isset($object)){
...
}

.vs

$object->prop_name = null;
$array['element_key'] = null;

// This way elements/properties with the value of `null` can still be unset.

if(isset($array) && array_key_exists('element_key', $array)){
...
}

if(isset($object) && property_exists($object, 'prop_name')){
...
}

// or 

// This way elements/properties with `null` values wont be unset.

if(isset($array) && $array['element_key'])){
...
}

if(isset($object) && $object->prop_name)){
...
}

এটি বলার অপেক্ষা রাখে না তবে typeকোনও উপাদান বা সম্পত্তি প্রাপ্ত, স্থাপন এবং আনসেট করার সময় আপনি পরিবর্তনশীলটির বিষয়টিও জেনে রাখা গুরুত্বপূর্ণ ; ভুল বাক্য গঠন ব্যবহার করে ত্রুটি ছুঁড়ে ফেলা হবে।

বহুমাত্রিক অ্যারে বা অবজেক্টের মান আনসেট করার চেষ্টা করার সময় এটি একই। আপনাকে অবশ্যই নিশ্চিত করতে হবে যে প্যারেন্ট কী / নামটি বিদ্যমান।

if(isset($variable['undefined_key'])){
    unset($variable['undefined_key']['another_undefined_key']);
}

if(isset($variable->undefined_prop)){
    unset($variable->undefined_prop->another_undefined_prop);
}

অবজেক্টগুলির সাথে ডিল করার সময় আরও একটি বিষয় চিন্তা করা উচিত এবং এটি দৃশ্যমানতা স্থির করে।

এটি উপস্থিত থাকার অর্থ এই নয় যে আপনার এটিকে সংশোধন করার অনুমতি আছে।


অবশেষে, একটি সঠিক উত্তর। ধন্যবাদ.
wp78de

একটি ছোট আপডেট: পিএইচপি 7.4 / 8.0 এ কোনও ত্রুটি নিক্ষেপ করা হয় না যখন আপনি unsetঅ-বিদ্যমান প্যারেন্ট অবজেক্টটির সম্পত্তি হন। তবে, পিএইচপি 8-তে একটি অ-বিদ্যমান অ্যারেতে কীটি আনসেটল করা কেবল একটি বিজ্ঞপ্তিই নয় একটি সতর্কতা উত্থাপন করে (পরিবর্তনের সাপেক্ষে)।
wp78de

1

এই লিঙ্কটি https://3v4l.org/hPAto দেখুন

অনলাইন সরঞ্জামটি পিএইচপি-র বিভিন্ন সংস্করণের কোডের সামঞ্জস্যতা দেখায়

এই সরঞ্জাম অনুযায়ী কোড

unset($_SESSION['signup_errors']);

আপনাকে কোনও বিজ্ঞপ্তি / সতর্কতা / ত্রুটি না দিয়ে পিএইচপি> = 5.4.0 এর জন্য কাজ করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.