कैसे बचें () और खाली ()


98

E_NOTICE त्रुटि स्तर पर चलने के दौरान मेरे पास कई पुराने अनुप्रयोग हैं जो बहुत सारे "xyz अपरिभाषित हैं" और "अपरिभाषित ऑफ़सेट" संदेश हैं, क्योंकि चर का अस्तित्व स्पष्ट रूप से जाँच isset()और उपयोग नहीं किया जाता है ।

मैं उनके माध्यम से काम करने पर विचार कर रहा हूं ताकि उन्हें E_NOTICE संगत बनाया जा सके, क्योंकि गायब चर या ऑफसेट के बारे में नोटिस जीवन रक्षक हो सकते हैं, प्राप्त करने के लिए कुछ छोटे प्रदर्शन सुधार हो सकते हैं, और यह कुल मिलाकर क्लीनर तरीका है।

हालाँकि, मुझे पसंद नहीं है कि सैकड़ों isset() empty()और array_key_exists()मेरे कोड को क्या करना है। यह मूल्य या अर्थ के संदर्भ में कुछ भी हासिल किए बिना, फूल जाता है, कम पठनीय हो जाता है।

E_NOTICE के संगत होने के बावजूद, मैं चर कोड की अधिकता के बिना अपना कोड कैसे बना सकता हूं?


6
मैं पूरी तरह से सहमत हूँ। इसलिए मुझे Zend फ्रेमवर्क इतना पसंद है, वहां रिक्वेस्ट मॉड्यूल बहुत अच्छा है। अगर मैं कुछ छोटे ऐप पर काम कर रहा हूं, तो मैं आमतौर पर मैजिक विधियों __set और __get के साथ कुछ सरल अनुरोध वर्ग कोड करता हूं जो ZF के अनुरोध के समान काम करता है। इस तरह मैं अपने कोड में isset और खाली की सभी घटनाओं से बचता हूं। इस तरह से आप सभी का उपयोग करने की जरूरत है अगर (या ($ गिरफ्तारी)) 0) उन पर पुनरावृत्ति करने से पहले सरणियों पर और कुछ महत्वपूर्ण स्थानों पर (यदि अशक्त! == $ चर)। यह बहुत साफ दिखता है।
रिचर्ड नूप

जवाबों:


128

रुचि रखने वालों के लिए, मैंने इस विषय को एक छोटे से लेख में विस्तारित किया है, जो कुछ हद तक बेहतर संरचित रूप में नीचे दी गई जानकारी प्रदान करता है: PHP के लिए निश्चित मार्गदर्शिका


IMHO आपको केवल ऐप को "E_NOTICE संगत" बनाने के बारे में नहीं सोचना चाहिए, बल्कि पूरी चीज़ का पुनर्गठन करना चाहिए। बीत रहा है सैकड़ों अपने कोड में अंकों की कि नियमित रूप से एक नहीं बल्कि बुरी तरह से संरचित प्रोग्राम की तरह न के बराबर चर ध्वनियों का उपयोग करने का प्रयास करें। गैर-मौजूद चर का उपयोग करने की कोशिश कभी नहीं होनी चाहिए, अन्य भाषाओं को संकलन के समय इस पर गंजा होना चाहिए। तथ्य यह है कि PHP आपको ऐसा करने की अनुमति देता है इसका मतलब यह नहीं है कि आपको चाहिए।

ये चेतावनियाँ आपकी मदद करने के लिए हैं, आपको नाराज़ करने के लिए नहीं। यदि आपको एक चेतावनी मिलती है "आप उस चीज़ के साथ काम करने की कोशिश कर रहे हैं जो मौजूद नहीं है!" , आपकी प्रतिक्रिया "उफ़, मेरी बुरी होनी चाहिए , मुझे उस ASAP को ठीक करने दो।" और कैसे आप "चर कि बस ठीक अपरिभाषित काम" और ईमानदारी से गलत कोड है कि गंभीर त्रुटियों के लिए नेतृत्व कर सकते हैं के बीच अंतर बताने जा रहे हैं ? यही कारण है कि आप हमेशा, हमेशा , त्रुटि रिपोर्टिंग के साथ 11 में बदल जाते हैं और अपने कोड पर दूर तक प्लग लगाते रहते हैं जब तक कि एक भी नहींNOTICEजारी किया गया है। टर्निंग एरर की रिपोर्टिंग केवल प्रोडक्शन एनवायरनमेंट के लिए है, सूचना रिसाव से बचने के लिए और बग्गी कोड के सामने भी एक बेहतर उपयोगकर्ता अनुभव प्रदान करने के लिए।


समझाने के लिए:

आपको अपने कोड में हमेशा issetया emptyकहीं और की आवश्यकता होगी , उनकी घटना को कम करने का एकमात्र तरीका यह है कि आप अपने चर को ठीक से प्रारंभ करें। स्थिति के आधार पर ऐसा करने के विभिन्न तरीके हैं:

समारोह तर्क:

function foo ($bar, $baz = null) { ... }

इस बात की जाँच करने की कोई आवश्यकता नहीं है कि आप फ़ंक्शन के अंदर सेट हैं $barया नहीं $baz, क्योंकि आपने उन्हें सेट किया है, आपको केवल इस बात की चिंता करने की आवश्यकता है कि क्या उनका मूल्य trueया false(या जो भी हो) का मूल्यांकन करता है ।

कहीं भी नियमित चर:

$foo = null;
$bar = $baz = 'default value';

कोड के किसी खंड में अपने चरों को प्रारंभ करें जिसमें आप उनका उपयोग करने जा रहे हैं। यह !issetसमस्या को हल करता है, यह सुनिश्चित करता है कि आपके चर में हमेशा एक ज्ञात डिफ़ॉल्ट मान होता है, जिससे पाठक को यह पता चलता है कि निम्नलिखित कोड क्या काम करेगा और इस तरह से स्व-प्रलेखन का भी काम करता है।

सरणी:

$defaults = array('foo' => false, 'bar' => true, 'baz' => 'default value');
$values = array_merge($defaults, $incoming_array);

ऊपर जैसी ही बात है, आप ऐरे को डिफ़ॉल्ट मानों के साथ आरम्भ कर रहे हैं और उन्हें वास्तविक मानों के साथ अधिलेखित कर रहे हैं।

शेष मामलों में, मान लें कि आप एक ऐसा मानदंड तैयार कर रहे हैं जहां आप मानों को आउटपुट कर रहे हैं या किसी नियंत्रक द्वारा निर्धारित नहीं किया जा सकता है, आपको बस जांच करनी होगी:

<table>
    <?php if (!empty($foo) && is_array($foo)) : ?>
        <?php foreach ($foo as $bar) : ?>
            <tr>...</tr>
        <?php endforeach; ?>
    <?php else : ?>
        <tr><td>No Foo!</td></tr>
    <?php endif; ?>
</table>

यदि आप अपने आप को नियमित रूप से उपयोग करते हुए पाते हैं array_key_exists, तो आपको इसका मूल्यांकन करना चाहिए कि आप इसका क्या उपयोग कर रहे हैं। केवल एक बार फर्क पड़ता है यहाँ है:

$array = array('key' => null);
isset($array['key']); // false
array_key_exists('key', $array); // true

जैसा कि ऊपर कहा गया है, यदि आप अपने चर को ठीक से शुरू कर रहे हैं, तो आपको यह जांचने की आवश्यकता नहीं है कि कुंजी मौजूद है या नहीं, क्योंकि आपको पता है कि यह करता है। आप किसी बाहरी स्रोत से सरणी मिल रहे हैं, मूल्य सबसे अधिक संभावना नहीं किया जाएगा nullलेकिन '', 0, '0', falseया यह की तरह कुछ, यानी एक मूल्य के लिए आप के साथ मूल्यांकन कर सकते हैं issetया empty, अपने इरादे पर निर्भर करता है। यदि आप नियमित रूप से एक सरणी कुंजी सेट करते हैं nullऔर चाहते हैं कि इसका अर्थ कुछ भी हो false, लेकिन यदि उपरोक्त उदाहरण में, के भिन्न परिणाम हैं issetऔर array_key_existsआपके प्रोग्राम लॉजिक पर फर्क पड़ता है, तो आपको खुद से पूछना चाहिए कि क्यों। एक चर का अस्तित्व केवल महत्वपूर्ण नहीं होना चाहिए, केवल इसका मूल्य परिणाम होना चाहिए। यदि कुंजी एक true/ falseध्वज है, तो उपयोग करेंtrueया falseनहीं null। इसका एकमात्र अपवाद तीसरी पार्टी लाइब्रेरी होगी जो nullकुछ मतलब करना चाहती है, लेकिन चूंकि nullPHP में पता लगाने के लिए इतना कठिन है कि मुझे अभी तक ऐसा कोई भी पुस्तकालय नहीं मिला है जो ऐसा करता हो।


4
यह सच है, लेकिन अधिकांश असफल पहुंच प्रयास if ($array["xyz"])इसके बजाय की लाइनों के साथ हैं isset()या array_key_exists()जो मुझे कुछ वैध लगते हैं, निश्चित रूप से संरचनात्मक समस्याएं नहीं हैं (यदि मुझे गलती है तो सही करें)। array_key_exists()बस जोड़ना मुझे एक भयानक बर्बादी की तरह लगता है।
पक्के डेका

9
मैं किसी भी मामले के बारे में नहीं सोच सकता जहाँ मैं array_key_existsएक साधारण isset($array['key'])या के बजाय उपयोग करूँगा !empty($array['key'])। ज़रूर, दोनों आपके कोड में 7 या 8 अक्षर जोड़ते हैं, लेकिन मैं शायद ही कोई समस्या कहूंगा। यह आपके कोड को स्पष्ट करने में भी मदद करता है: if (isset($array['key']))इसका मतलब है कि यह चर वास्तव में वैकल्पिक है और अनुपस्थित हो सकता है, जबकि if ($array['key'])बस का अर्थ है "यदि सच है"। यदि आपको बाद वाले के लिए नोटिस मिलता है, तो आप जानते हैं कि आपका तर्क कहीं न कहीं खराब है।
धोखेबाज़ी

6
मेरा मानना ​​है कि isset () और array_key_exists () के बीच का अंतर यह है कि यदि मूल्य NULL है तो बाद वाला सच वापस आ जाएगा। isset () नहीं होगा।
हटबा

1
यह सच है, लेकिन मैं एक समझदार उपयोग के मामले के बारे में नहीं सोच सकता था, जहां मुझे गैर-मौजूद चर के बीच अंतर करने की आवश्यकता होती है और एक सेट कुंजी का मान शून्य होता है। यदि मान FALSE का मूल्यांकन करता है तो अंतर बिना किसी अंतर के होना चाहिए। :)
deceze

1
सरणी कुंजी निश्चित रूप से अपरिभाषित चर की तुलना में अधिक कष्टप्रद हैं। लेकिन अगर आप सुनिश्चित नहीं हैं कि किसी सरणी में कोई कुंजी है या नहीं, तो इसका मतलब है कि आपने सरणी को स्वयं परिभाषित नहीं किया है या आप इसे किसी ऐसे स्रोत से खींच रहे हैं जिसे आप नियंत्रित नहीं करते हैं। न तो परिदृश्य बहुत बार होना चाहिए; और यदि ऐसा होता है, तो आपके पास यह जांचने का हर कारण है कि क्या सरणी में वह है जो आपको लगता है कि यह करता है। यह एक सुरक्षा उपाय है IMO।
किजिन

37

बस उसके लिए एक फंक्शन लिखिए। कुछ इस तरह:

function get_string($array, $index, $default = null) {
    if (isset($array[$index]) && strlen($value = trim($array[$index])) > 0) {
        return get_magic_quotes_gpc() ? stripslashes($value) : $value;
    } else {
        return $default;
    }
}

जो आप के रूप में उपयोग कर सकते हैं

$username = get_string($_POST, 'username');

जैसे तुच्छ सामान के लिए भी ऐसा ही get_number(), get_boolean(), get_array()और पर इतना।


5
यह अच्छा लग रहा है, और साथ ही जाँच कर रहा है। अच्छा!
पक्का डेका

शानदार समारोह! साझा करने के लिए बहुत बहुत धन्यवाद।
माइक मूर

3
ध्यान दें कि $ _POST ['कुछ'] सरणी दे सकता है, उदाहरण के लिए इनपुट <input name="something[]" />। यह उपरोक्त कोड का उपयोग करके त्रुटि का कारण होगा (जैसा कि ट्रिम सरणियों पर लागू नहीं किया जा सकता है), इस मामले में एक का उपयोग करना चाहिए is_stringऔर संभवतः strval। यह केवल एक ऐसा मामला नहीं है जहां get_arrayउपयोगकर्ता इनपुट (दुर्भावनापूर्ण) के बाद से किसी का उपयोग करना चाहिए, शायद कुछ भी और उपयोगकर्ता इनपुट पार्सर को कभी भी त्रुटि नहीं फेंकनी चाहिए।
जियान

1
मैं एक ही तरह के फ़ंक्शन का उपयोग करता हूं, लेकिन इस प्रकार परिभाषित किया जाता है: फ़ंक्शन get_value (और $ आइटम, $ डिफ़ॉल्ट = NULL) {वापसी isset ($ आइटम)? $ आइटम: $ डिफ़ॉल्ट; } इस फ़ंक्शन का लाभ यह है कि आप इसे सरणियों, चर और वस्तुओं के साथ कॉल कर सकते हैं। दोष यह है कि $ आइटम को आरंभिक (शून्य करने के लिए) बाद में मिलता है अगर यह नहीं था।
Mat

आपको 1 फ़ंक्शन में उनके साथ व्यवहार करने के बजाय, वैश्विक रूप से जादुई उद्धरण बंद करना चाहिए। इंटरनेट पर जादू के उद्धरणों की व्याख्या करने वाले बहुत सारे स्रोत हैं।
कायला

13

मेरा मानना ​​है कि इस समस्या का सामना करने के सबसे अच्छे तरीकों में से एक GET और POST (COOKIE, SESSION, इत्यादि) के मूल्यों को एक वर्ग के माध्यम से एक्सेस करना है।

उन सरणियों में से प्रत्येक के लिए एक वर्ग बनाएं और घोषित करें __getऔर __setविधियां ( ओवरलोडिंग )। __getएक तर्क को स्वीकार करता है जो एक मूल्य का नाम होगा। इस विधि को इस मान को संबंधित वैश्विक सरणी में जांचना चाहिए, या तो इसका उपयोग करते हुए isset()या empty()यदि यह मौजूद है null(या कुछ अन्य डिफ़ॉल्ट मान) तो वापस कर दें ।

उसके बाद आप आत्मविश्वास से इस तरह से ऐरे वैल्यूज एक्सेस कर सकते हैं: $POST->usernameऔर किसी भी isset()एस या empty()एस का उपयोग किए बिना यदि आवश्यक हो तो कोई भी सत्यापन करें । यदि usernameइसी वैश्विक सरणी में मौजूद नहीं है तो nullवापस कर दिया जाएगा, इसलिए कोई चेतावनी या नोटिस उत्पन्न नहीं किया जाएगा।


1
यह एक महान विचार है, और मैं कुछ के लिए कोड पुनर्गठन के लिए तैयार हूं। +1
पीका डे

जब तक आप उन्हें $ _GET या $ _POST पर असाइन नहीं करते हैं, दुर्भाग्य से आप उन उदाहरणों को सुपरग्लॉइड नहीं बना पाएंगे, जो बहुत खराब होंगे। लेकिन आप निश्चित रूप से स्थिर वर्गों का उपयोग कर सकते हैं ...
ThiefMaster

1
आप "स्थिर वर्ग" पर गेटर्स और सेटर का उपयोग नहीं कर सकते। और प्रति चर एक वर्ग लिखना बुरा अभ्यास है क्योंकि इसका अर्थ है कोड दोहराव, जो बुरा है। मुझे नहीं लगता कि यह समाधान सबसे पर्याप्त है।
Mat

एक वर्ग का एक सार्वजनिक स्थैतिक सदस्य सुपरग्लोबल की तरह काम करता है, जैसे: HTTP :: $ POST-> उपयोगकर्ता नाम, जहाँ आप HTTP :: $ POST को उसके उपयोग से पहले किसी बिंदु पर तुरंत भेज देते हैं, अर्थात। कक्षा HTTP {सार्वजनिक स्थैतिक $ POST = सरणी (... ...}); HTTP :: $ POST = new someClass ($ _ POST); ...
velcrow

6

मैं array_key_exists()फ़ंक्शन का उपयोग करने से बुरा नहीं मानता । वास्तव में, मैं हैक फ़ंक्शंस पर भरोसा करने के बजाय इस विशिष्ट फ़ंक्शन का उपयोग करना पसंद करता हूं जो भविष्य में उनके व्यवहार को बदल सकता है जैसे ( और अतिसंवेदनशील से बचने के लिए स्ट्राइकड्रथ )।emptyisset


हालांकि, मैं एक सरल फ़ंक्शन का उपयोग करता हूं जो इस में काम आता है, और सरणी अनुक्रमित से निपटने में कुछ अन्य परिस्थितियां :

function Value($array, $key, $default = false)
{
    if (is_array($array) === true)
    {
        settype($key, 'array');

        foreach ($key as $value)
        {
            if (array_key_exists($value, $array) === false)
            {
                return $default;
            }

            $array = $array[$value];
        }

        return $array;
    }

    return $default;
}

मान लीजिए कि आप निम्नलिखित सरणियाँ हैं:

$arr1 = array
(
    'xyz' => 'value'
);

$arr2 = array
(
    'x' => array
    (
        'y' => array
        (
            'z' => 'value',
        ),
    ),
);

आपको सरणियों से "मूल्य" कैसे मिलता है? सरल:

Value($arr1, 'xyz', 'returns this if the index does not exist');
Value($arr2, array('x', 'y', 'z'), 'returns this if the index does not exist');

हमारे पास पहले से ही uni और बहुआयामी सरणियाँ शामिल हैं, हम और क्या कर सकते हैं?


उदाहरण के लिए निम्नलिखित कोड का टुकड़ा लें:

$url = '/programming/1960509';
$domain = parse_url($url);

if (is_array($domain) === true)
{
    if (array_key_exists('host', $domain) === true)
    {
        $domain = $domain['host'];
    }

    else
    {
        $domain = 'N/A';
    }
}
else
{
    $domain = 'N/A';
}

बहुत उबाऊ नहीं है? यहां Value()फ़ंक्शन का उपयोग करने का एक और तरीका है :

$url = '/programming/1960509';
$domain = Value(parse_url($url), 'host', 'N/A');

एक अन्य उदाहरण के रूप में, ले RealIP()समारोह के लिए एक परीक्षण के लिए:

$ip = Value($_SERVER, 'HTTP_CLIENT_IP', Value($_SERVER, 'HTTP_X_FORWARDED_FOR', Value($_SERVER, 'REMOTE_ADDR')));

नीट, हुह? ;)


6
"हैक कार्यों पर भरोसा जो भविष्य में उनके व्यवहार को बदल सकता है" ?! क्षमा करें, लेकिन यह उस सबसे हास्यास्पद बात के बारे में है जिसे मैंने पूरे सप्ताह सुना है। सबसे पहले, issetऔर emptyकर रहे हैं भाषा निर्माणों , नहीं काम करता है। दूसरे, यदि कोई मुख्य पुस्तकालय कार्य / भाषा निर्माण उनके व्यवहार को बदल देता है, तो आप खराब हो सकते हैं या नहीं। यदि array_key_existsइसका व्यवहार बदल जाए तो क्या होगा ? इसका उत्तर यह है कि जब तक आप इसे दस्तावेज के रूप में उपयोग नहीं कर रहे हैं, यह नहीं होगा। और issetदस्तावेज का उपयोग किया जाता है। सबसे बड़े मामले के कार्यों को एक प्रमुख रिलीज संस्करण या दो पर चित्रित किया गया है। NIH सिंड्रोम खराब है!
धोखेबाज़ी '

मुझे खेद है कि आपके द्वारा ध्यान न दिए जाने पर सबसे पहले हैक इटैलिक्स में है। =) दूसरे, आप का मतलब है कि किसी को एक सरणी में मौजूद कुंजी कीarray_key_exists() जाँच करने के लिए भरोसा नहीं करना चाहिए ! वास्तव में इसके लिए बनाया गया था , मैं इसके बजाय इस उद्देश्य के लिए और विशेष रूप से जिसका आधिकारिक विवरण है पर निर्भर करता है: "यह निर्धारित करें कि क्या एक चर खाली है", कुछ भी उल्लेख नहीं करता है अगर यह वास्तव में मौजूद है। आपकी टिप्पणी और डाउन-वोट सबसे हास्यास्पद है जो मैंने पूरे महीने देखा है । array_key_exists()isset()empty()
एलिक्स एक्सल

3
मैं कह रहा हूँ issetऔर emptyकोई कम या ज्यादा विश्वसनीय नहीं हैं array_key_existsऔर ठीक वही काम कर सकते हैं। आपका दूसरा, लंबा-चौड़ा उदाहरण $domain = isset($domain['host']) ? $domain['host'] : 'N/A';केवल मुख्य भाषा सुविधाओं के साथ लिखा जा सकता है, कोई अतिरिक्त फ़ंक्शन कॉल या घोषणाएं आवश्यक नहीं हैं (ध्यान दें कि मैं जरूरी नहीं कि टर्नरी ऑपरेटर के उपयोग की वकालत करता हूं; ओ)। साधारण स्केलर वैरिएबल के लिए आपको अभी भी उपयोग करने की आवश्यकता होगी issetया empty, और आप उन्हें उसी तरह सरणियों के लिए उपयोग कर सकते हैं। “विश्वसनीयता ऐसा न करने का एक बुरा कारण है।
deceze

1
आपने अपनी बात रखी, हालाँकि मैं आपके द्वारा कहे गए अधिकांश सामानों से सहमत नहीं हूँ। मुझे लगता है कि आपने इसे 90% + मामलों पर गलत तरीके से लिया है, उदाहरण के लिए मैं हर समय रूपों में छिपे हुए फ़ील्ड में "0" के मूल्य का उपयोग करता हूं। फिर भी मेरा मानना ​​है कि मैंने जो समाधान प्रदान किया है, वह डाउन-वोट के लायक नहीं है और पक्के के कुछ काम आ सकता है
एलिक्स एक्सल

2
जबकि @deceze का कस्टम फ़ंक्शन के साथ एक बिंदु है - मैं आमतौर पर एक ही रुख लेता हूं - मूल्य () दृष्टिकोण काफी दिलचस्प लगता है कि मैं इस पर एक नज़र डालूंगा। मुझे लगता है कि उत्तर और फॉलोअप उन सभी को सक्षम करेगा जो बाद में अपने मन बनाने के लिए इस पर ठोकर खाते हैं। +1।
पेका

3

मैं यहाँ तुम्हारे साथ हूँ। लेकिन PHP डिज़ाइनरों ने इससे बहुत अधिक गलतियां की हैं। किसी भी पढ़ने के लिए एक कस्टम फ़ंक्शन को परिभाषित करने का छोटा, इसके आसपास कोई रास्ता नहीं है।


1
isset () सामान। डिफ़ॉल्ट रूप से सबकुछ करने से बहुत सारी परेशानियों से बचा जा सकता है।
vava

2
और यह everything सब कुछ ’क्या है? यह PHP के लिए एक बर्बादी की तरह प्रतीत होगा, जिसमें प्रत्येक बोधगम्य चर नाम की कल्पना करनी होगी और प्रत्येक को NULL पर सेट करना होगा ताकि एक आलसी डेवलपर 5 वर्णों को लिखने से बच सके।
लोटस नोट्स

5
@ बायरन, देखो, यह वास्तव में सरल है, बहुत सारी अन्य भाषाएं, रूबी और पर्ल जैसे कुछ उदाहरण हैं। VM जानता है कि चर का उपयोग पहले किया गया था या नहीं, है ना? यह हमेशा त्रुटि संदेश के साथ या बिना असफल होने के बजाय अशक्त लौट सकता है। और यह घटिया 5 अक्षरों के बारे में नहीं है, यह कॉल के params["width"] = params["width"] || 5साथ उस बकवास के बजाय चूक को लिखने के लिए है isset()
वावा

3
एक पुराने धागे को फिर से जीवित करने के लिए क्षमा करें। PHP की दो सबसे बड़ी गलतियाँ थीं register_globalsऔर magic_quotes। तुलनात्मक रूप से ये फ़ॉस्टर अनैतिक रूप से भिन्न चर बनाते हैं।
स्टेटिक्सन

3

मैं इन कार्यों का उपयोग करता हूं

function load(&$var) { return isset($var) ? $var : null; }
function POST($var) { return isset($_POST[$var]) ? $_POST[$var] : null; }

उदाहरण

$y = load($x); // null, no notice

// this attitude is both readable and comfortable
if($login=POST("login") and $pass=POST("pass")) { // really =, not ==
  // executes only if both login and pass were in POST
  // stored in $login and $pass variables
  $authorized = $login=="root" && md5($pass)=="f65b2a087755c68586568531ad8288b4";
}

2
मैं इसका भी उपयोग करता हूं, लेकिन याद रखें कि किसी मामले में, आपके चर को स्वचालित रूप से आरंभ किया जाएगा: जैसे लोड ($ सरणी ['FOO']) $ सरणी में एक FOO कुंजी बनाएगा।
Mat

2

तालमेल ऑपरेटर को निष्क्रिय करने के लिए आपका स्वागत है (PHP> = 7.0.1):

$field = $_GET['field'] ?? null;

PHP का कहना है:

अशक्त coalescing संचालक (??) को isset () के साथ संयोजन में एक ternary का उपयोग करने की आवश्यकता के सामान्य मामले के लिए सिंथैटिक चीनी के रूप में जोड़ा गया है। यदि यह मौजूद है और NULL नहीं है तो यह अपना पहला ऑपरेंड लौटाता है; अन्यथा यह अपना दूसरा ऑपरेंड वापस करता है।


1

एक फ़ंक्शन बनाएं जो falseयदि सेट नहीं है, और यदि निर्दिष्ट है, falseतो खाली है। यदि मान्य है तो यह वैरिएबल लौटाता है। आप नीचे दिए गए कोड में देखे गए अधिक विकल्प जोड़ सकते हैं:

<?php
function isset_globals($method, $name, $option = "") {
    if (isset($method[$name])) {    // Check if such a variable
        if ($option === "empty" && empty($method[$name])) { return false; } // Check if empty 
        if ($option === "stringLength" && strlen($method[$name])) { return strlen($method[$name]); }    // Check length of string -- used when checking length of textareas
        return ($method[$name]);
    } else { return false; }
}

if (!isset_globals("$_post", "input_name", "empty")) {
    echo "invalid";
} else {
    /* You are safe to access the variable without worrying about errors! */
    echo "you uploaded: " . $_POST["input_name"];
}
?>

0

सॉफ्टवेयर भगवान की कृपा से जादुई रूप से नहीं चलता है। यदि आप किसी ऐसी चीज की उम्मीद कर रहे हैं जो गायब है, तो आपको इसे ठीक से संभालने की आवश्यकता है।

यदि आप इसे अनदेखा करते हैं, तो आप संभवतः अपने अनुप्रयोगों में सुरक्षा छेद बना रहे हैं। एक गैर-परिभाषित चर तक पहुंचने वाली स्थिर भाषाओं में यह संभव नहीं है। यदि यह अशक्त है तो यह बस आपके एप्लिकेशन को संकलित या क्रैश नहीं करेगा।

इसके अलावा, यह आपके आवेदन को अस्वीकार्य बनाता है, और जब अप्रत्याशित चीजें होती हैं तो आप पागल हो जाते हैं। भाषा की सख्ती डिजाइन के हिसाब से बहुत जरूरी है और PHP, कई पहलुओं में गलत है। यदि आप जागरूक नहीं हैं तो यह आपको एक बुरा प्रोग्रामर बना देगा।


मैं PHP की कमी से अच्छी तरह से वाकिफ हूं। जैसा कि मैंने सवाल में बताया है, मैं पुरानी परियोजनाओं के ओवरहालिंग के बारे में बात कर रहा हूं।
पेका

माना। एक लिंग-टाइम PHP डेवलपर होने के नाते मेरे लिए जावा जैसी नई भाषाओं में उद्यम करना काफी मुश्किल है, जहां आपको हर चीज की घोषणा करने की आवश्यकता है।
धूजनेत

0

मुझे यकीन नहीं है कि आपकी पठनीयता की परिभाषा क्या है, लेकिन रिक्त (), isset () और प्रयास / थ्रो / ब्लॉक्स का उचित उपयोग, पूरी प्रक्रिया के लिए बहुत महत्वपूर्ण है।

यदि आपका E_NOTICE $ _GET या $ _POST से आ रहा है, तो उन्हें खाली () के साथ-साथ अन्य सभी सुरक्षा जांचों के साथ चेक किया जाना चाहिए, जो डेटा पास होना चाहिए।

यदि यह बाहरी फ़ीड या लाइब्रेरी से आ रहा है, तो इसे कोशिश / पकड़ में लपेटा जाना चाहिए।

यदि यह डेटाबेस से आ रहा है, तो $ db_num_rows () या इसके समकक्ष की जाँच की जानी चाहिए।

यदि यह आंतरिक चर से आ रहा है, तो उन्हें ठीक से प्रारंभ किया जाना चाहिए। अक्सर, इस प्रकार के नोटिस एक फंक्शन की वापसी के लिए एक नया चर असाइन करने से आते हैं जो विफलता पर FALSE देता है। उन्हें एक परीक्षण में लपेटा जाना चाहिए जो विफलता की स्थिति में, चर को एक स्वीकार्य डिफ़ॉल्ट मान असाइन कर सकते हैं जिसे कोड संभाल सकता है, या अपवाद को फेंक सकता है जिसे कोड संभाल सकता है।

ये चीजें कोड को लंबा बनाती हैं, अतिरिक्त ब्लॉक जोड़ती हैं, और अतिरिक्त परीक्षण जोड़ती हैं, लेकिन मैं आपसे असहमत हूं कि मुझे लगता है कि वे निश्चित रूप से अतिरिक्त मूल्य प्राप्त करते हैं।


-2

@ऑपरेटर का उपयोग करने के बारे में क्या ?

उदाहरण के लिए:

if(@$foo) { /* Do something */ }

आप कह सकते हैं कि यह बुरा है क्योंकि आपके पास $ foo के अंदर "क्या होता है" का कोई नियंत्रण नहीं है (यदि यह एक फ़ंक्शन कॉल था जिसमें उदाहरण के लिए PHP त्रुटि है), लेकिन अगर आप केवल चर के लिए इस तकनीक का उपयोग करते हैं, तो यह इसके बराबर है:

if(isset($foo) && $foo) { /* ... */ }

if(isset($foo))वास्तव में पर्याप्त है TRUEयदि अभिव्यक्ति का मूल्यांकन करता है तो यह वापस आ जाएगी TRUE
धूजनेत '

2
@ ColorWP.com यह भी सही लौटेगा यदि अभिव्यक्ति झूठी का मूल्यांकन करती है।
जॉन हुल्का

आपको केवल उस कोड पर @ पैरामीटर (नोटिस को अनदेखा करना) का उपयोग करना चाहिए जो वास्तव में आगे के विकास के तहत नहीं है, या एक बार कोड या मौजूदा परियोजनाओं पर त्वरित-फिक्स है, जिसे आप किसी और को दिखाना नहीं चाहते हैं। लेकिन यह एक त्वरित हैक के लिए एक आम समाधान है।
rubo77
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.