2015-12-29 7 views
14

मैं इस त्रुटि हो रही है होना चाहिएPHP7 method_exists Uncaught त्रुटि:</p> <blockquote> <p>Fatal error: Uncaught Error: Function name must be a string in</p> </blockquote> <p>इस कोड के लिए:: समारोह नाम एक स्ट्रिंग

if (function_exists($item['function'])) { 
    $item['function']($item, $default); 
} elseif (method_exists($this, $item['function'])) { 
    $this->$item['function']($item, $default); 
} 

मुझे पता है कि

if (function_exists($item['function'])) { 
    $item['function']($item, $default); 
} elseif (method_exists($this,$item['function'])) { 
    $this->{$item['function']}($item, $default); 
} 
करने के लिए कोड को बदलने

उस त्रुटि को हल किया गया, लेकिन मेरा सवाल है, यह लाइन

01 होनी चाहिए
$item['function']($item, $default); 

भी

{$item['function']}($item, $default); 

लिए परिवर्तित किया जा या है जहां उसे छोड़ा जा सकता है?

+0

क्या आप वाकई इस आइटम फ़ंक्शन कुंजी सेट हैं और यह स्ट्रिंग है? इसका उपयोग करने से पहले चेक जोड़ें। – Svetoslav

उत्तर

-1

और इसके बजाय (बिना) सरणी का उपयोग करें।

@ स्वेतलियो, पुराने संस्करणों के लिए नहीं, बल्कि संगत के लिए!

लोग इसे गलत क्यों समझते हैं? आप सभी असाइनमेंट के लिए एक और पंक्ति लिखने के लिए बहुत आलसी हैं?

+2

पुराने PHP संस्करण में हाँ, लेकिन 7 में यह निश्चित रूप से आवश्यक नहीं है। – Svetoslav

21

यह अप्रत्यक्ष चर और तरीकों के प्रसंस्करण के लिए आदेश-की-मूल्यांकन में कारण incompatible changes है:

$item['function']($item, $default); 

क्योंकि:

Changes to the handling of indirect variables, properties, and methods

Indirect access to variables, properties, and methods will now be evaluated strictly in left-to-right order, as opposed to the previous mix of special cases. The table below shows how the order of evaluaiton has changed.

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

$this->$item['function']($item, $default); 

लिए:

लेकिन आप बदलना होगा जैसा कि आप पहले से ही सही ढंग से किया

$this->{$item['function']}($item, $default); 
     ↑     ↑ 
चूंकि आप इस table में देख सकते हैं

:

     Old and new evaluation of indirect expressions 
     Expression   PHP 5 interpretation   PHP 7 interpretation 
------------------------------------------------------------------------------- 
    $$foo['bar']['baz'] |  ${$foo['bar']['baz']} | ($$foo)['bar']['baz'] 
    $foo->$bar['baz'] |  $foo->{$bar['baz']} | ($foo->$bar)['baz'] 
    $foo->$bar['baz']() |  $foo->{$bar['baz']}() | ($foo->$bar)['baz']() 
    Foo::$bar['baz']() |  Foo::{$bar['baz']}() | (Foo::$bar)['baz']() 

पीएचपी 7 होगा मान लीजिए कि आप पहले किसी ऑब्जेक्ट प्रॉपर्टी तक पहुंचना चाहते हैं, और फिर आप उस से एक इंडेक्स एक्सेस करना चाहते हैं संपत्ति, और एक विधि (बाएं से दाएं क्रम) को कॉल करने के लिए विधि नाम के रूप में इसका मान उपयोग करें।

गुण नाम के रूप में चर और अनुक्रमणिका का उपयोग करने के लिए, आपको इंगित करने के लिए घुंघराले ब्रेसिज़ का उपयोग करना होगा।

संबंधित मुद्दे