PHP में परेशान होने से पहले देखें कि क्या var मौजूद है?


88

त्रुटि रिपोर्टिंग पर, या यहां तक ​​कि सर्वश्रेष्ठ अभ्यास के लिए, जब PHP में एक चर को परेशान करते हैं, तो क्या आपको यह देखने के लिए जांचना चाहिए कि क्या यह पहले मौजूद है (इस मामले में यह हमेशा मौजूद नहीं है) और इसे अनसेट करें या बस इसे अनसेट करें?

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

// OR

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


1
यह NOTउपयोग करने के लिए अधिक कुशल है isset। मेरे जवाब पर एक नजर। मैंने गति अंतर को खोजने के लिए परीक्षण किए हैं।
डैन ब्रे

जवाबों:


167

बस इसे परेशान करें, अगर यह मौजूद नहीं है, तो कुछ भी नहीं किया जाएगा।


3
मुझे नहीं पता था कि यह चेतावनी या नोटिस फेंक देगा
जेसनडेविस

19
@SilentGhost मैं सहमत हूँ, ऐसा लगता है कि यह एक साधारण परीक्षण है, लेकिन वे पेशेवर सलाह के लिए पूछ रहे हैं, और जबकि त्रुटि लॉग में कोई त्रुटि नहीं हो सकती है / चेतावनी / नोटिस एक अपरिभाषित संस्करण को परेशान करते हुए, ऐसे अन्य मुद्दे हो सकते हैं जो लॉग नहीं किए गए हैं। उदाहरण के तौर पर सिर्फ अनसेट करने का मतलब है कि ऑल वर्जन डेटा के जरिए PHP रेकिंग करना क्योंकि यह कुछ भी नहीं ढूंढ if setसकता , जबकि इस्तेमाल करने से कुछ बेहतर इंडेक्सिंग स्कीम हो सकती हैं। (सिर्फ एक उदाहरण, पिछले शायद cobblers है और दोनों दृष्टिकोण एक ही डेटा जाँच विधि का उपयोग करते हैं)।
जेम्स

सच है, और यह अधिक कुशल भी है। मेरे उत्तर पर एक नज़र डालें क्योंकि मैंने issetछंदों का उपयोग न करने की गति का परीक्षण किया है isset
डैन ब्रे

नीचे वोट करें - आप उन सरणी कुंजियों को अनसेट नहीं कर सकते जिन्हें परिभाषित नहीं किया गया है।
बेहनाम

1
@ मैंने कहा, हम नहीं कर सकते!
बेहनाम

48

PHP मैनुअल से :

इन नोटों में पहले कुछ भ्रम के संबंध में कि क्या कारण है कि जब कोई अस्तव्यस्त चर मौजूद नहीं होता है तो नोटिस () को ट्रिगर करता है।

उन वेरिएबल को न छोड़ना, जो मौजूद नहीं हैं

<?php
unset($undefinedVariable);
?>

"अपरिभाषित चर" नोटिस को ट्रिगर नहीं करता है। परंतु

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

दो नोटिस ट्रिगर करता है, क्योंकि यह कोड किसी सरणी के एक तत्व को परेशान करने के लिए है; न तो $ undefinedArray और न ही $ undefinedKey खुद परेशान हैं, वे केवल यह पता लगाने के लिए इस्तेमाल किया जा रहा है कि क्या unset होना चाहिए। आखिरकार, यदि वे मौजूद थे, तब भी आप उनसे उम्मीद करेंगे कि वे दोनों बाद में हों। आप अपने पूरे एरे को गायब नहीं करना चाहेंगे क्योंकि आप इसके तत्वों में से एक () में से एक को गायब कर देंगे!


41
इसके लिए थोड़ा और स्पष्टीकरण चाहिए। आप सरणी कुंजियों को परेशान कर सकते हैं जो तब तक परिभाषित नहीं होती हैं जब तक कि सरणी स्वयं मौजूद न हो।
किंगमपेल

@kristovaher वास्तव में - यह उस विशिष्ट परिदृश्य को संबोधित नहीं करता है जो ओपी का वर्णन करता है।
मार्क एमी

21

unsetअपरिभाषित चर पर उपयोग करने से कोई त्रुटि नहीं होगी (जब तक कि चर किसी सरणी (या वस्तु) का सूचकांक नहीं है जो मौजूद नहीं है)।

इसलिए केवल एक चीज जिस पर आपको विचार करने की आवश्यकता है, वह है जो सबसे अधिक कुशल है। यह 'isset' के साथ परीक्षण नहीं करने के लिए अधिक कुशल है, जैसा कि मेरा परीक्षण दिखाएगा।

परीक्षा:

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
    • डिफाइंड यूज़ करना डिस्टर्ब है
  4. Function D time = 0.86475610733032
    • अनिर्धारित उपयोग परेशान है

निष्कर्ष:

यह हमेशा उपयोग करने के लिए कम कुशल होता है isset, यह लिखने में लगने वाले अतिरिक्त समय की छोटी मात्रा का उल्लेख नहीं करना। unsetयदि यह हो सकता है, तो यह जांचने के लिए अपरिभाषित चर का प्रयास करने की जल्दी है unset


1
यह स्वीकृत उत्तर की तुलना में बेहतर है! इन परीक्षणों को चलाने के लिए धन्यवाद।
एडम फ्रीडमैन

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

एक छोटा अद्यतन: PHP 7.4 / 8.0 में जब आप unsetगैर-मौजूदा मूल ऑब्जेक्ट की संपत्ति में कोई त्रुटि नहीं करते हैं। हालांकि, PHP8 में एक गैर-मौजूदा सरणी में एक कुंजी को अनसिट करना न केवल एक नोटिस बल्कि चेतावनी (परिवर्तन के अधीन) को बढ़ाता है।
wp78de

1

इस लिंक को https://3v4l.org/hPAto पर देखें

ऑनलाइन टूल PHP के विभिन्न संस्करणों के लिए कोड संगतता दिखाता है

इस टूल के अनुसार कोड

unset($_SESSION['signup_errors']);

PHP के लिए काम करेगा = = 5.4.0 बिना आपको कोई नोटिस / चेतावनी / त्रुटियां दिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.