2009-12-24 16 views
18
में एक स्थिर समारोह के अंदर एक निजी सदस्य का उपयोग कैसे

मैं पीएचपीपीएचपी

class MyClass 
{ 
    // How to declare MyMember here? It needs to be private 
    public static function MyFunction() 
    { 
    // How to access MyMember here? 
    } 
} 

में निम्नलिखित वर्ग मैं पूरी तरह उलझन में हूँ जो सिंटैक्स के बारे में

$MyMember = 0; और echo $MyMember

उपयोग करने के लिए या

private $MyMember = 0; और echo $MyMember

या

$this->MyMember = 0; और echo $this->MyMember

कोई मुझे बता सकते हैं कि यह कैसे करना है?

मैं ओओपीएस में मजबूत नहीं हूं।

क्या आप इसे पहले स्थान पर कर सकते हैं?

यदि नहीं, तो मुझे सदस्य को कैसे घोषित करना चाहिए ताकि मैं इसे स्थिर कार्यों के भीतर एक्सेस कर सकूं?

+0

संबंधित: [? स्थिर कर सकता सदस्यों nonstatic सदस्यों का उपयोग और इसके विपरीत] (http://stackoverflow.com/q/2204128/367456) – hakre

उत्तर

54
class MyClass 
{ 
    private static $MyMember = 99; 

    public static function MyFunction() 
    { 
    echo self::$MyMember; 
    } 
} 

MyClass::MyFunction(); 

php मैनुअल की oop5 अध्याय में Visibility और Scope Resolution Operator (::) देखते हैं।

+0

+1 - मैं स्वयं कीवर्ड के बारे में पता नहीं था । आपका कोड काम करता है! धन्यवाद :) –

1

स्थैतिक तरीकों के भीतर, आप $this का उपयोग करके चर कॉल नहीं कर सकते हैं क्योंकि स्थैतिक विधियों को "इंस्टेंस संदर्भ" के बाहर बुलाया जाता है।

यह PHP doc में स्पष्ट रूप से बताया गया है।

1
<?php 
    class MyClass 
    { 
     // A) 
     // private $MyMember = 0; 

     // B) 
     private static $MyMember = 0; 

     public static function MyFunction() 
     { 
      // using A) // Fatal error: Access to undeclared static property: 
      //    MyClass::$MyMember 
      // echo MyClass::$MyMember; 

      // using A) // Fatal error: Using $this when not in object context 
      // echo $this->MyMember; 

      // using A) or B) 
      // echo $MyMember; // local scope 

      // correct, B) 
      echo MyClass::$MyMember; 
     } 
    } 

    $m = new MyClass; 
    echo $m->MyFunction(); 
    // or better ... 
    MyClass::MyFunction(); 

?> 
+0

क्या आप '$ m-> MyFunction() को कॉल कर सकते हैं; 'जैसे कि फ़ंक्शन स्थिर है? –

+0

हाँ आप कर सकते हैं, लेकिन हो सकता है कि आपको इस तथ्य को अस्पष्ट नहीं करना चाहिए, कि फ़ंक्शन ऑब्जेक्ट-बाउंड है .. – miku

+0

अजीब। मैंने सोचा कि आप क्लासनाम :: फंक्शननाम द्वारा स्थिर फ़ंक्शंस को कॉल कर सकते हैं और तुरंत नहीं कर सकते हैं। वैसे भी, मुझे यह संदेह है -> यदि आप वैरिएबल को ए मामले में घोषित करते हैं) और इसे 'echo $ MyMember'' का उपयोग करें, तो यह मेरे लिए काम नहीं कर रहा है। यह सही काम नहीं करना चाहिए? मैं आपकी टिप्पणी - '// स्थानीय' को समझने में असमर्थ हूं। –

6

यह एक सुपर देर प्रतिक्रिया है, लेकिन यह किसी की मदद कर सकते हैं ..

class MyClass 
{ 
    private $MyMember; 

    public static function MyFunction($class) 
    { 
    $class->MyMember = 0; 
    } 
} 

काम करता है। आप उस तरह के निजी सदस्य तक पहुंच सकते हैं, लेकिन यदि आपके पास $ कक्षा थी तो आपको केवल माईफंक्शन को कक्षा का एक तरीका बनाना चाहिए, क्योंकि आप केवल $ वर्ग-> MyFunction() को कॉल करेंगे। हालांकि आपके पास एक स्थिर सरणी हो सकती है कि प्रत्येक इंस्टेंस को क्लास कन्स्ट्रक्टर में जोड़ा जाता है, जो इस स्थिर फ़ंक्शन को सभी उदाहरणों को अपडेट करने, फिर से पहुंचने और पुन: सक्रिय करने के लिए पुन: प्रयास कर सकता है। यानी ..

class MyClass 
{ 
    private $MyMember; 
    private static $MyClasses; 

    public function __construct() 
    { 
    MyClass::$MyClasses[] = $this; 
    } 

    public static function MyFunction() 
    { 
    foreach(MyClass::$MyClasses as $class) 
    { 
     $class->MyMember = 0; 
    } 
    } 
}