जब भी एक प्लगइन एक बनाता है new MyClass();
, यह इसे विशिष्ट नाम वाले चर को असाइन करना चाहिए। इस तरह, कक्षा का उदाहरण सुलभ है।
तो अगर वह कर रहा था $myclass = new MyClass();
, तो आप ऐसा कर सकते हैं:
global $myclass;
remove_action( 'wp_footer', array( $myclass, 'my_action' ) );
यह काम करता है क्योंकि प्लगइन्स वैश्विक नामस्थान में शामिल हैं, इसलिए प्लगइन के मुख्य निकाय में निहित परिवर्तनीय घोषणाएं वैश्विक चर हैं।
यदि प्लगइन नए वर्ग के पहचानकर्ता को कहीं नहीं बचाता है , तो तकनीकी रूप से, यह एक बग है। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के सामान्य सिद्धांतों में से एक यह है कि जिन वस्तुओं को कुछ चर द्वारा संदर्भित नहीं किया जा रहा है वे कहीं न कहीं सफाई या उन्मूलन के अधीन हैं।
अब, विशेष रूप से PHP ऐसा नहीं करेगा जैसे कि Java करेगा, क्योंकि PHP एक अर्ध-शापित OOP कार्यान्वयन है। उदाहरण चर केवल उन में अद्वितीय वस्तु नामों के साथ तार होते हैं, जैसे चीज़। वे केवल उसी तरह से काम करते हैं जिस तरह से चर फ़ंक्शन नाम इंटरैक्शन ->
ऑपरेटर के साथ काम करता है । तो बस कर new class()
वास्तव में पूरी तरह से काम कर सकते हैं, बस मूर्खतापूर्ण। :)
तो, नीचे पंक्ति, कभी नहीं new class();
। क्या $var = new class();
और है कि $ वर अन्य बिट्स यह संदर्भ के लिए के लिए किसी तरह से सुलभ बनाने के।
संपादित करें: वर्षों के बाद
एक चीज जिसे मैंने बहुत सारे प्लगइन्स में देखा है, वह है "सिंगलटन" पैटर्न के समान कुछ का उपयोग करना। वे वर्ग का एकल उदाहरण प्राप्त करने के लिए एक getInstance () विधि बनाते हैं। यह शायद मैंने देखा सबसे अच्छा समाधान है। उदाहरण प्लगइन:
class ExamplePlugin
{
protected static $instance = NULL;
public static function getInstance() {
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
}
पहली बार getInstance () कहा जाता है, यह क्लास को इंस्टेंट करता है और अपने पॉइंटर को बचाता है। आप कार्यों में हुक करने के लिए इसका उपयोग कर सकते हैं।
इसके साथ एक समस्या यह है कि यदि आप ऐसी चीज का उपयोग करते हैं तो आप कंस्ट्रक्टर के अंदर getInstance () का उपयोग नहीं कर सकते हैं। ऐसा इसलिए है क्योंकि नया $ इंस्टाल करने से पहले कंस्ट्रक्टर को कॉल करता है, इसलिए कंस्ट्रक्टर से getInstance () कॉल करने से अनंत लूप हो जाता है और सब कुछ टूट जाता है।
एक समाधान यह है कि कंस्ट्रक्टर (या कम से कम, इसके भीतर getInstance () का उपयोग न करने के लिए) का उपयोग न करें, लेकिन स्पष्ट रूप से आपके कार्यों और इस तरह की स्थापना के लिए कक्षा में एक "init" फ़ंक्शन है। ऐशे ही:
public static function init() {
add_action( 'wp_footer', array( ExamplePlugin::getInstance(), 'my_action' ) );
}
इस तरह से कुछ के साथ, फ़ाइल के अंत में, कक्षा को सभी परिभाषित करने के बाद और इस तरह, प्लगइन को इंस्टेंट करने के रूप में निम्नानुसार हो जाता है:
ExamplePlugin::init();
Init आपके कार्यों को जोड़ना शुरू कर देता है, और ऐसा करने में वह getInstance () को कॉल करता है, जो क्लास को इंस्टेंट करता है और सुनिश्चित करता है कि उनमें से केवल एक ही मौजूद है। यदि आपके पास एक init फ़ंक्शन नहीं है, तो आप इसके बजाय कक्षा को प्रारंभ में तुरंत करने के लिए ऐसा करेंगे:
ExamplePlugin::getInstance();
मूल प्रश्न को संबोधित करने के लिए, उस कार्रवाई हुक को बाहर (उर्फ, दूसरे प्लगइन में) से हटाकर फिर ऐसा किया जा सकता है:
remove_action( 'wp_footer', array( ExamplePlugin::getInstance(), 'my_action' ) );
रखो कि कुछ plugins_loaded
कार्रवाई हुक करने के लिए झुका और यह मूल प्लगइन द्वारा कार्रवाई की जा रही पूर्ववत करेंगे।