अजीब PHP त्रुटि: 'लेखन संदर्भ में फ़ंक्शन रिटर्न मान का उपयोग नहीं कर सकते'


178

मुझे यह त्रुटि मिल रही है और मैं इसका सिर या पूंछ नहीं बना सकता।

सटीक त्रुटि संदेश है:

घातक त्रुटि: पंक्ति 48 में /home/curricle/public_html/descarga/index.php में संदर्भ के संदर्भ में फ़ंक्शन रिटर्न मान का उपयोग नहीं कर सकते

लाइन 48 है:

if (isset($_POST('sms_code') == TRUE ) {

यहां क्या हो सकता है?

यहां देखें पूरा फंक्शन:

function validate_sms_code() {

    $state = NOTHING_SUBMITED;

    if (isset($_POST('sms_code') == TRUE ) {
        $sms_code = clean_up($_POST('sms_code'));
        $return_code = get_sepomo_code($sms_code);

        switch($return_code) {

          case 1:
            //no error
            $state = CORRECT_CODE;
            break;

          case 2:
            // code already used
            $state = CODE_ALREADY_USED;
            break;

          case 3:
            // wrong code
            $state = WRONG_CODE;
            break;

          case 4:
            // generic error
            $state = UNKNOWN_SEPOMO_CODE;
            break;

          default:
            // unknown error
            $state = UNKNOWN_SEPOMO_CODE;
            throw new Exception('Unknown sepomo code: ' . $return_code);
            break;
        }

    } else {
        $state = NOTHING_SUBMITED;
    }
    dispatch_on_state($state);
}

22
$ _POST ('sms_code') वैसे $ _POST ['sms_code'] होना चाहिए।
davidtbernal

इसके अलावा, अगर बयान पर अन्य खंड की जरूरत नहीं है। $stateसंशोधित नहीं किया जाएगा, NOTHING_SUBMITEDअगर यह पहले से ही उस मूल्य के लिए इसे रीसेट करने की कोई आवश्यकता नहीं है ।
ग्लेन डेटन

भविष्य के लोग, क्या कोई यह बता सकता है कि वास्तव में संदेश का मतलब क्या है?
ओगझा

जवाबों:


111

तुम्हारा मतलब है

if (isset($_POST['sms_code']) == TRUE ) {

हालांकि संयोग से आप वास्तव में मतलब है

if (isset($_POST['sms_code'])) {

3
... या if (isset($_POST['sms_code']) === TRUE ) {:-)
कीबोर्डसमैश

मुझे उस समस्या का हल भी मिला जो मैं झेल रहा था, इसलिए FYI करें - यह $ _REQUEST (पृष्ठ के URL में पैरामीटर) के लिए भी जाता है।
theCuBeMan

5
मुझे लगता है कि मैं इसके लिए सुपर लेट हूँ, लेकिन यह PHP संस्करण पर भी निर्भर है, है ना? मुझे पूरा यकीन है कि बाद के PHP संस्करणों में कानूनी है जैसे 5.6, लेकिन मुझे लगता है कि यह 5.3 में नहीं है
UnsettlingTrend

490

फ़ंक्शन वापसी पर खाली का उपयोग करते समय भी ऐसा होता है:

!empty(trim($someText)) and doSomething()

क्योंकि खाली कोई फ़ंक्शन नहीं है, लेकिन एक भाषा निर्माण (सुनिश्चित नहीं है), और यह केवल चर लेता है:

सही:

empty($someVar)

गलत:

empty(someFunc())

PHP 5.5 के बाद से, यह चर से अधिक का समर्थन करता है। लेकिन अगर आपको 5.5 से पहले इसकी आवश्यकता है, तो उपयोग करें trim($name) == false। से खाली प्रलेखन


डांग, मुझे सिर्फ यह त्रुटि मिली है, आपका सटीक उदाहरण (खाली के अंदर ट्रिम करना)। धन्यवाद x3 क्या अजीब त्रुटि है .. मैं अभी भी पूरी तरह से समझ नहीं पा रहा हूँ: / खाली () एक स्ट्रिंग ले सकता है .. और ट्रिम () एक स्ट्रिंग लौटाता है .. तो wth?
निक रोलैंडो

15
@ श्रेडर - क्योंकि empty()यह वास्तव में एक कार्य नहीं है; यह एक भाषा निर्माण है, जैसे echo। PHP पार्सर भाषा निर्माण को अलग तरीके से संभालता है। के मामले में empty, यह पैरामीटर को एक चर के रूप में देखता है, न कि कुछ का मूल्यांकन किया जाना है, इसलिए यदि आप किसी फ़ंक्शन को पारित करने का प्रयास करते हैं, तो यह टूट जाता है। कम से कम मेरी यह समझ तो है। अधिक जानकारी यहाँ और यहाँ
अनुदान

1
यह ठीक वैसी ही त्रुटि है जैसे मैं भाग गया। यह शीर्ष उत्तर क्यों नहीं है !?
एडम एफ

2
जब मैं नहीं था तब मेरे सहयोगी को यह त्रुटि हो रही थी। जब तक मैंने डॉक्स की जाँच नहीं की, तब तक भ्रम की स्थिति रही - PHP 5.5 के रूप में, खाली () एक फ़ंक्शन से रिटर्न के साथ-साथ एक चर भी स्वीकार करेगा। us3.php.net/empty
जेम्स

1
5.5 के लिए होरे! जब तक आप अपग्रेड नहीं करते, आप कुछ इस तरह से फेंक सकते हैं कि आपके मुख्य कार्य में फ़ाइल शामिल हो:function mTEE($val){ return empty($val); }
TecBrat

22
if (isset($_POST('sms_code') == TRUE ) {

इस लाइन को बदल दें

if (isset($_POST['sms_code']) == TRUE ) {

आप के लिए parentheseis () का उपयोग कर रहे हैं $_POST लेकिन आप वर्ग कोष्ठक चाहते थे []

:)

या

if (isset($_POST['sms_code']) && $_POST['sms_code']) { 
//this lets in this block only if $_POST['sms_code'] has some value 

1
नहीं, आप "लिख नहीं सकते हैं (अगर ($ _ POST ['sms_code'] == TRUE) {", एक लापता है ")"।

1
+ कई अरब शांत अंक के लिए 'आप कोष्ठक का उपयोग कर रहे हैं ... लेकिन आप वर्ग कोष्ठक चाहते थे', जो मेरी समस्या थी (जो मुझे इस प्रश्न की ओर ले गई)
केविन हॉर्न

1
भई, थॅंक्स मैन! अब, अगर पार्सर कहेगा "मुझे एक सरणी चर के नाम, डुह!" के बाद वर्ग कोष्ठक की अपेक्षा है, तो यह "संदर्भ में फ़ंक्शन रिटर्न वैल्यू का उपयोग नहीं कर सकता" की तुलना में बहुत अधिक अच्छा लगेगा। मैं सुझाव के रूप में PHP के लोगों को प्रस्तुत कर सकता हूं।
जो वोल्कर

13

के लिए WordPress के :

के बजाय:

if (empty(get_option('smth')))

होना चाहिए:

if (!get_option('smth'))

11

सही सिंटैक्स (आपके पास अंत में एक गुम कोष्ठक था):

if (isset($_POST['sms_code']) == TRUE ) {
                            ^

ps आपको == TRUE भाग की आवश्यकता नहीं है , क्योंकि BOOLEAN (सच्चा / गलत) पहले ही वापस आ गया है।


4

यह एक से अधिक परिदृश्यों में हो सकता है, नीचे प्रसिद्ध परिदृश्यों की सूची दी गई है:

// calling empty on a function 
empty(myFunction($myVariable)); // the return value of myFunction should be saved into a variable
// then you can use empty on your variable

// किसी एरे के तत्व को एक्सेस करने के लिए कोष्ठक का उपयोग करते हुए कोष्ठक का उपयोग फंक्शन को कॉल करने के लिए किया जाता है

if (isset($_POST('sms_code') == TRUE ) { ...
// that should be if(isset($_POST['sms_code']) == TRUE)

जब हम नीचे दिए गए फ़ंक्शन के परिणाम को बढ़ाने का प्रयास करते हैं तो यह भी ट्रिगर किया जा सकता है:

$myCounter = '356';

$myCounter = intVal($myCounter)++; // we try to increment the result of the intVal...
// like the first case, the ++ needs to be called on a variable, a variable should hold the the return of the function then we can call ++ operator on it.

क्या आप बग प्राप्त करना चाहते हैं? क्योंकि इसी से आपको कीड़े मिलते हैं। नहीं, लेकिन गंभीरता से, यह कभी मत करो। ऐसा करना if(i++), यह काउंटर को बढ़ाने और उसके मूल्य का मूल्यांकन करने की तुलना में कम लग सकता है, लेकिन अगर यह कभी भी बाहर निकलता है तो यह आपके लिए सिरदर्द पैदा करेगा। संपादित करें: Im यह अर्थ नहीं है कि आप इसे करते हैं, बस इसे नए प्रोग्रामर को इंगित करते हुए उत्तर पढ़ते हैं और सोचते हैं कि यह एक साफ-सुथरी चीज है, जो कि वृद्धि की जा रही है या मूल्यांकन करते समय मूल्यों को बढ़ाते हैं।
विक्टर डी।

@VictorD। मैं सिर्फ यह कह रहा हूं कि उस स्थिति में त्रुटि हो सकती है इसका मतलब है कि यह करना अच्छा नहीं है।
मेहदी करमोसली 23

क्या मैं एक और सुझाव दे सकता हूं? यदि आप एक बयान में =इसके बजाय करते हैं ==
योशिय्याह

मेरे लिए यह PHP संस्करण था, 7.0 पर अपग्रेड करें :)
nodws

3

समस्या ()आप में है जाने के लिए[]

if (isset($_POST('sms_code') == TRUE)

द्वारा

if (isset($_POST['sms_code'] == TRUE)

3

मुझे भी तुम्हारी जैसी ही समस्या थी। समस्या यह है कि आप एक पुराने php संस्करण का उपयोग कर रहे हैं। मैंने PHP 5.6 में अपग्रेड किया है और समस्या अब मौजूद नहीं है।


1

एक अन्य परिदृश्य जहां इस त्रुटि को सिंटैक्स त्रुटि के कारण ट्रिगर किया गया है:

ucwords($variable) = $string;

1
क्या इसलिए कि ucwordsएक स्ट्रिंग वापस आती है और कॉलिंग का संदर्भ गलत है, यदि आप उदाहरण के लिए प्रयास करते हैं $Test = ''; ${ucwords('test')} = 'String new !'; echo $Test;, तो आपको निर्दिष्ट नया मान दिखाएगा।
किप

0

मैं भी सिंटैक्स त्रुटि के कारण इस समस्या में भाग गया। सरणी सूचकांक में "[" के बजाय "" का उपयोग करना:

   foreach($arr_parameters as $arr_key=>$arr_value) {
        $arr_named_parameters(":$arr_key") = $arr_value;
    }

0

यह त्रुटि काफी सही है और एक संदर्भ वाक्यविन्यास मुद्दे को उजागर करती है। किसी भी प्रकार के "गैर-असाइन करने योग्य" सिंटैक्स का प्रदर्शन करके पुन: पेश किया जा सकता है। उदाहरण के लिए:

फ़ंक्शन सिंटैक्स ($ हैलो) {.... फिर फ़ंक्शन को एक संपत्ति के रूप में कॉल करने का प्रयास करते हैं और एक मूल्य प्रदान करते हैं .... $ इस-> सिंटैक्स ('हैलो') = 'दुनिया';

उपर्युक्त त्रुटि को फेंक दिया जाएगा क्योंकि वाक्यविन्यास कथन गलत है। आपके द्वारा उपयोग किए गए संदर्भ में 'वर्ल्ड' का सही असाइनमेंट नहीं लिखा जा सकता है (यानी इस संदर्भ के लिए वाक्यविन्यास गलत है)। 'फ़ंक्शन रिटर्न वैल्यू का उपयोग नहीं कर सकता है या यह पढ़ सकता है' फ़ंक्शन को राइट-हैंड मान असाइन नहीं कर सकता क्योंकि इसका केवल-पढ़ने के लिए '

ओपीएस कोड में विशिष्ट त्रुटि को हाइलाइट किया गया है, वर्ग कोष्ठक के बजाय कोष्ठक का उपयोग करना।


-2

गलत ऑपरेटर के कारण हो सकता है, =, जब यह == होना चाहिए

if(mysql_num_rows($result) = 1)
    return $result;
else
    return false;

यह कोड इस त्रुटि को फेंकता है

ध्यान दें कि = असाइनमेंट ऑपरेटर है और ऑपरेटर की तुलना नहीं है। फिक्स को = से == बदलना है।

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