2010-09-15 16 views
11

मैं किसी ऑब्जेक्ट के किसी निजी चर को बंद करने के भीतर संदर्भित करने का प्रयास कर रहा हूं। नीचे दिया गया कोड काम करेगा, लेकिन यह Fatal error: Cannot access self:: when no class scope is active in test.php on line 12 और Fatal error: Using $this when not in object context in test.php on line 20 शिकायत करता है।बंद होने के भीतर से निजी चरों तक पहुंच

कोई विचार अलग-अलग चर को बनाए रखते हुए और सहायक कार्यों के बिना (एक निजी चर के पूरे विचार को हराकर) बंद करने का उपयोग करके एक ही परिणाम को पूरा करने के लिए। ध्यान दें

class MyClass 
{ 

    static private $_var1; 
    private $_var2; 

    static function setVar1($value) 
    { 
     $closure = function() use ($value) { 
      self::$_var1 = $value; 
     }; 
     $closure(); 
    } 

    function setVar2($value) 
    { 
     $closure = function() use ($value) { 
      $this->_var2 = $value; 
     }; 
     $closure(); 
    } 

} 

MyClass::setVar1("hello"); //doesn't work 

$myclass = new MyClass; 
$myclass->setVar2("hello"); //doesn't work 

उत्तर

14

संपादित करने के लिए, इस उत्तर मूल रूप से PHP5.3 के लिए चाहिए था और इससे पहले, यह अब संभव है। वर्तमान जानकारी के लिए, this answer देखें।


यह सीधे संभव नहीं है। विशेष रूप से, बंद होने का कोई गुंजाइश नहीं है, इसलिए वे निजी और संरक्षित सदस्यों तक नहीं पहुंच सकते हैं।

हालांकि, आप उपयोग कर सकते हैं संदर्भ:

<?php 
class MyClass 
{ 

    static private $_var1; 
    private $_var2; 

    static function setVar1($value) 
    { 
     $field =& self::$_var1; 
     $closure = function() use ($value, &$field) { 
      $field = $value; 
     }; 
     $closure(); 
    } 

    function setVar2($value) 
    { 
     $field =& $this->_var2; 
     $closure = function() use ($value, &$field) { 
      $field = $value; 
     }; 
     $closure(); 
    } 

} 

MyClass::setVar1("hello"); 

$myclass = new MyClass; 
$myclass->setVar2("hello"); 
+0

हे में शुरू संभव है - नकल ;-) – DMI

+0

@Dave मैं वास्तव में यह लिख रहा था इससे पहले कि मैं अपने जवाब पढ़ें। वैसे भी, निपटारे के रूप में आपके लिए +1: पी – Artefacto

+0

हे। शीघ्र समानांतर विकास। +1 के लिए धन्यवाद, और जैसा कि आपने मुझसे कहीं अधिक प्रयास किया है, वैसे ही लौट आया! :-) – DMI

2

क्लोजर $this या self की धारणा नहीं - वे है कि रास्ते में वस्तुओं से जुड़ा नहीं है। इसका मतलब है आप use खंड के माध्यम से चर पारित करने के लिए होता है कि ... की तरह कुछ:

$_var1 =& self::$_var1; 
$closure = function() use ($value, &$_var1) { 
    $_var1 = $value; 
}; 

$_var2 =& $this->_var2; 
$closure = function() use ($value, &$_var2) { 
    $_var2 = $value; 
}; 

मैं ऊपर कोड का परीक्षण नहीं किया है, लेकिन मेरा मानना ​​है कि यह सही होने के लिए।

+0

यह सही नहीं है, कम से कम 5.4 में नहीं। देखें: http://php.net/manual/en/closure.bindto.php – GuyPaddock

4

यह पीएचपी 5.4.0

class test { 
    function testMe() { 
     $test = new test; 
     $func = function() use ($test) { 
      $test->findMe();  // Can see protected method 
      $test::findMeStatically(); // Can see static protected method 
     }; 
     $func(); 
     return $func; 
    } 

    protected function findMe() { 
     echo " [find Me] \n"; 
    } 

    protected static function findMeStatically() { 
     echo " [find Me Statically] \n"; 
    } 
} 

$test = new test; 
$func = $test->testMe(); 
$func();  // Can call from another context as long as 
      // the closure was created in the proper context. 
+1

बस स्पष्टीकरण के लिए, क्या यह 'निजी फ़ंक्शन findMe() 'के लिए भी काम करेगा? –

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