पूरी बात के साथ कुछ खेल के आसपास था। ऐसा लगता है कि ReflectionClass
के साथ संभावित रूप से आप जो कुछ भी कर सकते हैं वह मौजूदा विधि को प्रतिस्थापित करना है। लेकिन यह भी अप्रत्यक्ष रूप से होगा।
मैं वास्तव में किसी वर्ग-आधारित भाषा को नहीं जानता, जहां गतिशील वर्ग मौजूद हैं (फिर फिर, मेरा ज्ञान काफी सीमित है)। मैंने इसे प्रोटोटाइप-आधारित भाषाओं (जावास्क्रिप्ट, रूबी, स्मॉलटाक) में ही देखा है। इसके बजाय आप क्या कर सकते, पीएचपी 5.4 में, Closure
का उपयोग करें और एक को नए तरीके जोड़ मौजूदा ऑब्जेक्ट है।
class Container
{
protected $target;
protected $className;
protected $methods = [];
public function __construct($target)
{
$this->target = $target;
}
public function attach($name, $method)
{
if (!$this->className)
{
$this->className = get_class($this->target);
}
$binded = Closure::bind($method, $this->target, $this->className);
$this->methods[$name] = $binded;
}
public function __call($name, $arguments)
{
if (array_key_exists($name, $this->methods))
{
return call_user_func_array($this->methods[$name] , $arguments);
}
if (method_exists($this->target, $name))
{
return call_user_func_array(
array($this->target, $name),
$arguments
);
}
}
}
इस का उपयोग करने के लिए, यदि आप एक मौजूदा वस्तु के साथ निर्माता प्रदान करने के लिए है:
यहां कक्षा जो आप किसी भी वस्तु के लिए इस तरह विकृति प्रदर्शन करते हैं होता है। यहां उपयोग का छोटा उदाहरण दिया गया है:
class Foo
{
private $bar = 'payload';
};
$foobar = new Foo;
// you initial object
$instance = new Container($foobar);
$func = function ($param)
{
return 'Get ' . $this->bar . ' and ' . $param;
};
$instance->attach('test', $func);
// setting up the whole thing
echo $instance->test('lorem ipsum');
// 'Get payload and lorem ipsum'
बिल्कुल वही नहीं जो आप चाहते हैं, लेकिन AFAIK यह उतना करीब है जितना आप प्राप्त कर सकते हैं।
स्रोत
2012-06-14 19:11:21
बहुत बढ़िया। इस नई PHP फीचर्स को प्यार करें – Thomas
यहां __call विधि का बिंदु क्या है, यदि \ Closure :: बाइंड चीज़ करता है, और इसके विपरीत? – jayarjo
@Jayarjo '\ Closure :: बाइंड 'अज्ञात फ़ंक्शन के संदर्भ को बदलता है (इस मामले में, यह सुनिश्चित करता है कि, बंद होने के भीतर,' $ this' सही ऑब्जेक्ट को संदर्भित करता है)। हालांकि, यह उस कार्य को '$ इस 'की विधि में नहीं बनाता है। बाहरी कोड को बंद करने के लिए अनुमति देने के लिए हमें अभी भी '__call' की आवश्यकता है जैसे कि यह एक विधि थी। –