PHP घातक त्रुटि: वस्तु संदर्भ में नहीं होने पर $ का उपयोग करना


137

मेरे साथ एक समस्या हो गई है:

मैं एक नया WebApp बिना फ्रेमवर्क के लिख रहा हूं।

अपने index.php में मैं उपयोग कर रहा हूँ:require_once('load.php');

और load.php में मैं require_once('class.php');अपने class.php को लोड करने के लिए उपयोग कर रहा हूं ।

मेरे class.php में मुझे यह त्रुटि मिली है:

घातक त्रुटि: वर्ग में ऑब्जेक्ट संदर्भ में नहीं होने पर $ का उपयोग करना। ऑन लाइन ... (इस उदाहरण में यह 11 होगा)

एक उदाहरण कि मेरा class.php कैसे लिखा जाता है:

class foobar {

    public $foo;

    public function __construct() {
        global $foo;

        $this->foo = $foo;
    }

    public function foobarfunc() {
        return $this->foo();
    }

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

अपने index.php में मैं शायद foobarfunc()इस तरह लोड कर रहा हूँ :

foobar::foobarfunc();

लेकिन यह भी हो सकता है

$foobar = new foobar;
$foobar->foobarfunc();

त्रुटि क्यों आ रही है?


2
संयोग से मैं कल लगभग 3 घंटे के लिए इस त्रुटि से जूझ रहा था! :)
जैक

जवाबों:


184

मेरे index.php में मैं शायद इस तरह से foobarfunc () लोड कर रहा हूं:

 foobar::foobarfunc();  // Wrong, it is not static method

लेकिन यह भी हो सकता है

$foobar = new foobar;  // correct
$foobar->foobarfunc();

आप इस तरीके को लागू नहीं कर सकते क्योंकि यह स्थैतिक विधि नहीं है।

foobar::foobarfunc();

आपको इसके बजाय उपयोग करना चाहिए:

foobar->foobarfunc();

हालांकि अगर आपने एक स्थिर विधि बनाई है जैसे:

static $foo; // your top variable set as static

public static function foo() {
    return self::$foo;
}

तो आप इस का उपयोग कर सकते हैं:

foobar::foobarfunc();

1
समान नाम वाले चर कोई समस्या नहीं है। $this->fooएक क्लास मेंबर है, जबकि $fooफंक्शन स्कोप (ग्लोबल स्कोप से इम्पोर्ट किया हुआ) में सिर्फ एक वेरिएबल है। एक सदस्य के रूप में एक ही नाम के साथ फ़ंक्शन नाम भी कोई समस्या नहीं है।
गॉर्डन

157
आप $thisएक स्थिर विधि में उपयोग नहीं कर सकते ।
याकूबे

5
यह हास्यास्पद है कि कैसे पूरी तरह से गलत जवाब फिर भी अपवित्र हो जाता है। $ यह वर्ग के संदर्भ में उपलब्ध नहीं है। ओपी को उपरोक्त उदाहरण से वही त्रुटि मिलेगी।
गॉर्डन

4
@ सरफराज कोई अपराध नहीं है, लेकिन यह अभी भी गलत है। आप एक इंस्टेंस विधि के साथ कॉल कर सकते हैं ::। यह विरुद्ध है E_STRICT, लेकिन यह तब तक काम करता है जब तक कि विधि बॉडी उदाहरण स्कोप का संदर्भ नहीं देती है, उदाहरण के लिए $this। इसके अलावा, self::fooयह इंगित नहीं करेगा $this->foo। यह एक वर्ग स्थिरांक का संदर्भ देता है । दोनों, self::fooऔर self::$fooएक घातक त्रुटि बढ़ाएंगे।
गॉर्डन

3
@ सरफराज अब बेहतर है। आपको क्षमा करने के लिए क्षमा करें, लेकिन जैसा कि यह स्वीकृत उत्तर बन गया है, मैंने इन बातों को इंगित करना आवश्यक समझा :) आपके धैर्य के लिए धन्यवाद।
गॉर्डन

27

आप एक गैर स्थैतिक विधि कह रहे हैं:

public function foobarfunc() {
    return $this->foo();
}

स्थैतिक-कॉल का उपयोग करना:

foobar::foobarfunc();

स्टैटिक-कॉल का उपयोग करते समय, फ़ंक्शन को बुलाया जाएगा (भले ही घोषित नहीं किया गया हो static) , लेकिन, जैसा कि ऑब्जेक्ट का कोई उदाहरण नहीं है, कोई भी नहीं है $this

इसलिए :

  • आपको गैर-स्थिर विधियों के लिए स्थिर कॉल का उपयोग नहीं करना चाहिए
  • आपके स्टैटिक मेथड्स (या स्टैटिकली-मेथड मेथड्स) $ का उपयोग नहीं कर सकते हैं, जो आम तौर पर क्लास के वर्तमान उदाहरण को इंगित करता है, क्योंकि जब आप स्टैटिक-कॉल का उपयोग कर रहे हैं तो कोई क्लास इंस्टेंस नहीं है।


यहां, आपकी कक्षा के तरीके कक्षा की वर्तमान आवृत्ति का उपयोग कर रहे हैं, क्योंकि उन्हें कक्षा की $fooसंपत्ति तक पहुंचने की आवश्यकता है ।

इसका मतलब है कि आपके तरीकों को कक्षा के एक उदाहरण की आवश्यकता है - जिसका अर्थ है कि वे स्थिर नहीं हो सकते।

इसका मतलब है कि आपको स्थैतिक कॉल का उपयोग नहीं करना चाहिए: आपको कक्षा को स्थापित करना चाहिए, और विधियों को कॉल करने के लिए ऑब्जेक्ट का उपयोग करना चाहिए, जैसे आपने अपने कोड के अंतिम भाग में किया था:

$foobar = new foobar();
$foobar->foobarfunc();


अधिक जानकारी के लिए, PHP मैनुअल में पढ़ने में संकोच न करें:


यह भी ध्यान दें कि शायद आपको इस __constructविधि की आवश्यकता नहीं है :

global $foo;

globalकीवर्ड का उपयोग करने से $fooवैरिएबल, सभी कार्यों और कक्षाओं के बाहर घोषित किया जाएगा , उस विधि के अंदर से दृश्यमान ... और आपके पास शायद ऐसा कोई $fooवैरिएबल नहीं है ।

$foo वर्ग-संपत्ति तक पहुंचने के लिए , आपको केवल उपयोग करने की आवश्यकता है $this->foo, जैसे आपने किया था।


11

यदि आप रिज़ॉल्यूशन स्कोप ऑपरेटर ( ) के foobarfuncसाथ इनवाइट कर रहे हैं , तो आप इसे स्टेटिकली कॉल कर रहे हैं , जैसे कि इंस्टेंस लेवल के बजाय क्लास लेवल पर, इस प्रकार आप तब इस्तेमाल कर रहे हैं, जब ऑब्जेक्ट रेफरेंस में नहीं । वर्ग के संदर्भ में मौजूद नहीं है।::$this$this

यदि आप सक्षम करते हैं E_STRICT, तो PHP इस बारे में एक सूचना जुटाएगा:

Strict Standards: 
Non-static method foobar::foobarfunc() should not be called statically

इसके बजाय ऐसा करें

$fb = new foobar;
echo $fb->foobarfunc();

एक विचार के आधार पर, मेरा सुझाव है कि globalअपनी कक्षाओं के अंदर उपयोग न करें । यदि आपको अपनी कक्षा के अंदर बाहर से कुछ चाहिए, तो उसे कंस्ट्रक्टर के माध्यम से पास करें। इसे डिपेंडेंसी इंजेक्शन कहा जाता है और यह आपके कोड को बहुत अधिक बनाए रखने योग्य और बाहर की चीजों पर कम निर्भर करेगा।


6

पहले आप एक बात समझ लें, यह एक वर्ग के अंदर $ वर्तमान वस्तु को दर्शाता है
वह यह है कि आप क्लास फंक्शन या वैरिएबल को कॉल करने के लिए क्लास के बाहर बने हैं।

इसलिए जब आप अपने क्लास फंक्शन को foobar :: foobarfunc () की तरह बुला रहे हैं, तो ऑब्जेक्ट नहीं बनता है। लेकिन उस फ़ंक्शन के अंदर आपने $ $ लिखा है-> फू ()। अब यहाँ $ यह कुछ भी नहीं है। ऐसा क्यों कहा जाता है $ का उपयोग करते जब यह class.php में ऑब्जेक्ट संदर्भ में नहीं है

समाधान:

  1. ऑब्जेक्ट बनाएं और फ़ॉबरफ़नक () कॉल करें।

  2. फोबारफुन्क () के अंदर वर्ग नाम का उपयोग करके फू () कॉल करें।


2
या सिर्फ स्वयं का उपयोग करें :: $ के बजाय
मोटासमेक एमके

4

जब आप फ़ंक्शन को स्थैतिक संदर्भ में कहते हैं, तो $thisबस मौजूद नहीं होता है।

आपको this::xyz()इसके बजाय उपयोग करना होगा ।

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


4

तेज़ विधि: (नया फ़ॉबोरर ()) -> फ़ॉबरफ़नक ();

आपको अपनी कक्षा को लोड करने की आवश्यकता है:

foobar::foobarfunc();

द्वारा :

(new foobar())->foobarfunc();

या:

$Foobar = new foobar();
$Foobar->foobarfunc();

या उपयोग करने के लिए स्थिर कार्य करें foobar::

class foobar {
    //...

    static function foobarfunc() {
        return $this->foo();
    }
}

0

$foobar = new foobar;$ फोब्बर में वर्ग फोबोरर रखो , वस्तु नहीं । ऑब्जेक्ट प्राप्त करने के लिए, आपको कोष्ठक जोड़ना होगा:$foobar = new foobar();

आपकी त्रुटि बस यह है कि आप किसी वर्ग को एक विधि कहते हैं, इसलिए केवल वस्तुओं में मौजूद होने के $thisबाद से ऐसा नहीं है $this


0

यह मुझे PHP में एक बग होने लगता है। त्रुटि

'घातक त्रुटि: बिना त्रुटि के: वस्तु संदर्भ में नहीं होने पर $ का उपयोग करना'

उपयोग करने वाले फ़ंक्शन में दिखाई देता है $this, लेकिन त्रुटि यह है कि कॉलिंग फ़ंक्शन एक स्टेटिक के रूप में गैर-स्थिर फ़ंक्शन का उपयोग कर रहा है। अर्थात:

Class_Name
{
    function foo()
    {
        $this->do_something(); // The error appears there.
    }
    function do_something()
    {
        ///
    }
}

जबकि त्रुटि यहाँ है:

Class_Name::foo();

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