लिखने के संदर्भ में विधि वापसी मूल्य का उपयोग नहीं कर सकते


465

मुझे लगता है कि निम्नलिखित कोड को काम करना चाहिए, लेकिन यह नहीं होता है (संपादित: अब PHP 5.5+ में काम करता है) :

if (!empty($r->getError()))

कहाँ getError()बस है:

public function getError()
{
    return $this->error;
}

फिर भी मैं इस त्रुटि को समाप्त करता हूं:

लिखने के संदर्भ में विधि वापसी मूल्य का उपयोग नहीं कर सकते

इसका क्या मतलब है? क्या यह सिर्फ एक पढ़ने के लिए नहीं है?


2
संभवतः PHP 5.5 में आपको अभिव्यक्ति पास करने की अनुमति होगी empty: wiki.php.net/rfc/empty_isset_exprs
कार्लोस कैंपडरो जूल


ठीक है, मैं लगता है porneL के उत्तर भी यह मेरा कोड सही if ( !$e->find('div') ) है कि जाँच करता है, तो वर्तमान HTML डोम तत्व खाली है या नहीं कर रहे हैं। मैं इसे लूप के अंदर का उपयोग करता हूं ताकि इसके अंदर के अंदरूनी डिव के बिना केवल एक डिव का प्रिंट आउट ले सके।
सलेम

जवाबों:


769

empty() संदर्भ द्वारा मान को एक्सेस करने की आवश्यकता है (यह जाँचने के लिए कि क्या वह संदर्भ कुछ मौजूद है), और 5.5 से पहले PHP ने कार्यों से लौटे अस्थायी मूल्यों के संदर्भों का समर्थन नहीं किया।

हालाँकि, आपके पास असली समस्या यह है कि आप empty()बिल्कुल भी गलत तरीके से यह मानते हैं कि "खाली" मान "असत्य" से अलग है।

खाली बस एक उर्फ ​​के लिए है !isset($thing) || !$thing। जब आप जिस चीज की जांच कर रहे हैं वह हमेशा मौजूद होती है (फ़ंक्शन कॉल के PHP परिणाम हमेशा मौजूद होते हैं), empty()फ़ंक्शन एक नकार ऑपरेटर के अलावा कुछ भी नहीं है

PHP में रिक्तता की अवधारणा नहीं है । वे मूल्य जो असत्य का मूल्यांकन करते हैं, वे रिक्त हैं, जो सत्य का मूल्यांकन करते हैं वे गैर-रिक्त हैं। एक ही बात है। यह कोड:

$x = something();
if (empty($x)) 

और इस:

$x = something();
if (!$x) 

है हमेशा एक ही परिणाम, सभी मामलों में, सभी डेटाटाइप्स के लिए (क्योंकि $xपरिभाषित किया गया है empty()निरर्थक है)।

विधि से वापसी मान हमेशा मौजूद होता है (भले ही आपके पास returnबयान न हो , वापसी मूल्य मौजूद है और इसमें शामिल है null)। इसलिए:

if (!empty($r->getError()))

तार्किक रूप से इसके समकक्ष है:

if ($r->getError())

29
वर्तमान में चयनित की तुलना में यह बहुत बेहतर उत्तर है।
SystemParadox

20
@gcb: नहीं, PHP मैनुअल स्पष्ट रूप से कहता है कि यह समान है: "रिक्त () इसके विपरीत है (boolean) var, सिवाय इसके कि कोई चेतावनी उत्पन्न नहीं होती है जब चर सेट नहीं किया जाता है।"
कोर्नेल

16
चेतावनी वाला भाग न उत्पन्न करना बहुत महत्वपूर्ण है ... यदि यह 0, '', सरणी (), NULL, या परिभाषित नहीं है तो खाली ($ var) सत्य हो जाएगा। यह अच्छा अभ्यास है, विशेष रूप से इसलिए आप फ़ाइलों को भरने के बिना अपनी वास्तविक चेतावनियों को लॉग कर सकते हैं
लैंड्स

3
ठीक है, महान जवाब, लेकिन इससे बचने का सही तरीका क्या है, क्या कोई जानता है?
जवतार

3
सामान्य रूप में @EugenMihailescu ठीक है कि है, लेकिन यह, खाली करने के लिए बराबर () सख्ती से नहीं है क्योंकि "", 0आदि "खाली" हैं, लेकिन नहीं अशक्त।
कोर्नेल

330

नोट: यह एक उच्च दृश्यता के साथ एक बहुत ही उच्च मतदान जवाब है, लेकिन कृपया ध्यान दें कि यह खराब, अनावश्यक कोडिंग प्रथाओं को बढ़ावा देता है! सही तरीके के लिए @ कोर्नेल का जवाब देखें ।

नोट # 2: मैं @ कोर्नेल के उत्तर का उपयोग करने के सुझावों का समर्थन करता हूं । जब मैंने तीन साल पहले यह उत्तर लिखा था, तो मेरा मतलब केवल त्रुटि की प्रकृति की व्याख्या करना था, जरूरी नहीं कि विकल्प का समर्थन किया जाए। नीचे दिए गए कोड स्निपेट की अनुशंसा नहीं की जाती है।


यह 5.5 से नीचे PHP संस्करणों में खाली () की सीमा है ।

नोट: खाली () केवल चरों की जाँच करता है क्योंकि कुछ और परिणाम पार्स त्रुटि के रूप में होगा। दूसरे शब्दों में, निम्नलिखित काम नहीं करेगा: खाली (ट्रिम ($ नाम))।

आपको इसे बदलना होगा

// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))

156
यह पागलपनपूर्ण है।
डेविड मर्डोक

47
नोट: वही सच है isset()। यानी: isset($this->foo->getBar())एक ही मुद्दे में परिणाम होगा।
पकड़

7
PorneL का उत्तर इसे और अधिक विस्तार से बताता है, एक बेहतर समाधान के साथ
SystemParadox

5
@SystemParadox - "बेहतर" से आपका क्या अर्थ है, इस पर निर्भर करता है। porneL का उत्तर यकीनन "क्लीनर" समाधान के साथ पूरी तरह से अधिक है, लेकिन यह वास्तव में त्रुटि की उत्पत्ति की व्याख्या नहीं करता है।
पीटर बेली

4
क्योंकि यह गलत नहीं है, @deceze। यह सबसे अच्छा जवाब नहीं है, आपको मुझसे कोई तर्क नहीं मिलेगा। मैंने खुद पोर्नलेक को भी वोट दिया। यह बहुत पुराना उत्तर है लेकिन यह गलत नहीं है । उच्च मतों के बारे में: याद रखें, पोर्नएलएल इस एक के लगभग पूरे 17 महीने बाद पहुंचा।
पीटर बेली

37

PHP डॉक्स के अनुसार :

खाली () केवल चरों की जाँच करता है क्योंकि कुछ और परिणाम एक पार्स त्रुटि होगी

आप empty()किसी फ़ंक्शन के रिटर्न मान पर सीधे उपयोग नहीं कर सकते । इसके बजाय, getError()एक चर से वापसी सेट करें और चर empty()पर चलाएं ।


19

मैं आमतौर पर इस मुद्दे के आसपास जाने के लिए is_empty () नामक एक वैश्विक फ़ंक्शन बनाता हूं

function is_empty($var)
{ 
 return empty($var);
}

तब कहीं भी मैं सामान्य रूप से खाली () का उपयोग करता था (मैं सिर्फ is_empty () का उपयोग करता हूं


2
यह बेहतर है कि ऐसा न करें और मानकों के अनुसार रहें (जैसा कि वे हो सकता है उतना कष्टप्रद)।
tonyhb

1
@dynamism आप समझा सकते हैं कि क्यों नहीं?
जैनिस वेनबर्ग्स

1
क्योंकि सुविधा कार्यों में किसी और के कोड में पढ़ने के लिए दर्द हो सकता है। इसके अलावा, एक MVC / HMVC वास्तुकला में यह आपकी संरचना को गड़बड़ कर सकता है। दिन के अंत में, PHP कोडर्स को पता होना चाहिए कि यह सीमाएं हैं और सुविधा कार्यों के बिना छोटे वर्कअराउंड को समझने में सक्षम हैं।
tonyhb

14
वाह, आपने अभी-अभी एक नकार कार्य का आविष्कार किया है । आप जानते हैं कि PHP के पास इसके लिए !ऑपरेटर है? :)
कोर्नेल

4

जैसा कि दूसरों ने बताया है, यह खाली () की एक (अजीब) सीमा है।

अधिकांश purproses के लिए, ऐसा करना खाली कॉल करने के बराबर है, लेकिन यह काम करता है:

if ($r->getError() != '')

5
यह सच नहीं है - empty()सिर्फ एक रिक्त स्ट्रिंग की तुलना में कई अधिक संभावनाएं शामिल हैं
रोबी एवरिल

3
इसलिए यह " अधिकांश उद्देश्यों के लिए" कहता है , सभी
जानी हार्टिकेनन

2

मुद्दा यह है, आप जानना चाहते हैं कि क्या त्रुटि खाली नहीं है।

public function getError() {
    return $this->error;
}

कोई विधि जोड़ने से EErrorSet () समस्या हल हो जाएगी।

public function isErrorSet() {
    if (isset($this->error) && !empty($this->error)) {
        return true;
    } else {
        return false;
    }
}

अब यह बिना किसी नोटिस के इस कोड के साथ काम करेगा।

if (!($x->isErrorSet())) {
    echo $x->getError();
}

-3

सरणी खाली है या नहीं, यह जांचने का वैकल्पिक तरीका:

count($array)>0

यह मेरे लिए उस त्रुटि के बिना काम करता है

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