से विधि के रूप में बंद करने को परिभाषित करता है मैं php5.3 और बंद करने के साथ खेलने की कोशिश कर रहा हूं।कक्षा
मैं यहां देखता हूं (लिस्टिंग 7. किसी ऑब्जेक्ट के अंदर बंद करें: http://www.ibm.com/developerworks/opensource/library/os-php-5.3new2/index.html) कि कॉलबैक फ़ंक्शन में $ $ का उपयोग करना संभव है, लेकिन ऐसा नहीं है। इसलिए मैं के रूप में उपयोग चर इस $ देने की कोशिश:
$self = $this;
$foo = function() use($self) { //do something with $self }
तो इसी उदाहरण के लिए:
class Dog
{
private $_name;
protected $_color;
public function __construct($name, $color)
{
$this->_name = $name;
$this->_color = $color;
}
public function greet($greeting)
{
$self = $this;
return function() use ($greeting, $self) {
echo "$greeting, I am a {$self->_color} dog named {$self->_name}.";
};
}
}
$dog = new Dog("Rover","red");
$dog->greet("Hello");
Output:
Hello, I am a red dog named Rover.
यह सब उदाहरण के पहले स्ट्रिंग मुद्रित नहीं करता, लेकिन समारोह लौटने के लिए, लेकिन वह नहीं है मेरी समस्या।
दूसरा, मैं निजी या संरक्षित तक नहीं पहुंच सकता, क्योंकि कॉलबैक फ़ंक्शन एक वैश्विक कार्य है और कुत्ते ऑब्जेक्ट के संदर्भ में नहीं। मेरी समस्या नहीं है। यह रूप में एक ही है:
function greet($greeting, $object) {
echo "$greeting, I am a {$self->_color} dog named {$self->_name}.";
}
और मैं चाहता हूँ:
public function greet($greeting) {
echo "$greeting, I am a {$self->_color} dog named {$self->_name}.";
}
कौन सा कुत्ता से है और वैश्विक नहीं।
नहीं, मैं समझ में नहीं आया कि आप क्या चाहते। यदि बधाई एक विधि है, दृश्यता जनता के लिए defauls, तो आपके दो अंतिम कोड ब्लॉक बराबर हैं। – Artefacto
PHP 5.3 जारी होने से पहले क्लोजर में '$ this' का जादू इंजेक्शन गिरा दिया गया है। दरअसल, इसे PHP के आने वाले संस्करण के लिए स्थगित कर दिया गया था। कुछ क्लोजर :: बाइंडो 'जैसी कुछ चीजें होंगी जो कि वस्तुओं को बाम्बाडा के संदर्भ के रूप में बाध्य करने के लिए उपयोग कर सकती हैं। –