যখনই কোনও প্লাগইন একটি তৈরি করে new MyClass();
, এটি এটি একটি অনন্যরূপযুক্ত ভেরিয়েবলের জন্য নির্ধারণ করা উচিত। এইভাবে, ক্লাসের উদাহরণটি অ্যাক্সেসযোগ্য।
সুতরাং যদি তিনি কাজ করে থাকেন $myclass = new MyClass();
তবে আপনি এটি করতে পারতেন:
global $myclass;
remove_action( 'wp_footer', array( $myclass, 'my_action' ) );
এটি কাজ করে কারণ প্লাগইনগুলি বিশ্বব্যাপী নেমস্পেসের অন্তর্ভুক্ত, সুতরাং একটি প্লাগইনের মূল অংশে অন্তর্নিহিত পরিবর্তনশীল ঘোষণাগুলি হ'ল বৈশ্বিক চলক।
প্লাগইন যদি নতুন শ্রেণীর সনাক্তকারীকে কোথাও সংরক্ষণ না করে তবে প্রযুক্তিগতভাবে, এটি একটি বাগ। অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের সাধারণ নীতিগুলির মধ্যে একটি হ'ল যে বিষয়গুলি কোথাও কিছু পরিবর্তনশীল দ্বারা রেফারেন্স করা হচ্ছে না সেগুলি পরিষ্কার বা নির্মূলকরণের সাপেক্ষে।
এখন, বিশেষত পিএইচপি এই জাভা যেমন করে না, কারণ পিএইচপি অর্ধ-আর্সড ওওপি বাস্তবায়নকে সাজিয়ে তোলে। উদাহরণস্বরূপ ভেরিয়েবলগুলি কেবলমাত্র স্ট্রিংগুলির মধ্যে স্বতন্ত্র অবজেক্টের নাম, সাজানোর মতো জিনিস। ->
অপারেটরটির সাথে ভেরিয়েবল ফাংশন নামের ইন্টারঅ্যাকশন যেভাবে কাজ করে সে কারণে তারা কেবল কাজ করে । সুতরাং ঠিক করা new class()
সত্যিই নিখুঁতভাবে কাজ করতে পারে, কেবল বোকাভাবে। :)
সুতরাং, নীচের লাইন, কখনও না new class();
। কি $var = new class();
এবং যে $ Var অন্যান্য বিট এটা উল্লেখ করার জন্য কিছু উপায় অ্যাক্সেসযোগ্য করে।
সম্পাদনা করুন: বছর পরে
একটি জিনিস যা আমি প্রচুর প্লাগইনগুলি দেখেছি তা হ'ল "সিঙ্গেলটন" প্যাটার্নের অনুরূপ কিছু ব্যবহার করা। তারা ক্লাসের একক উদাহরণ পেতে একটি getInstance () পদ্ধতি তৈরি করে। এটি সম্ভবত আমি দেখেছি সেরা সমাধান। উদাহরণ প্লাগইন:
class ExamplePlugin
{
protected static $instance = NULL;
public static function getInstance() {
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
}
প্রথমবার getInstance () বলা হয়, এটি ক্লাসটি ইনস্ট্যান্ট করে এবং এর পয়েন্টারটি সংরক্ষণ করে। আপনি এটিকে কাজে ব্যবহার করতে পারেন।
এর সাথে একটি সমস্যা হ'ল আপনি যদি এই জাতীয় জিনিস ব্যবহার করেন তবে আপনি কনস্ট্রাক্টরের অভ্যন্তরে getInstance () ব্যবহার করতে পারবেন না। এটি কারণ new উদাহরণ স্থাপনের আগে নতুন কনস্ট্রাক্টরকে কল করে, সুতরাং কনস্ট্রাক্টরের কাছ থেকে getInstance () কল করা একটি অসীম লুপের দিকে নিয়ে যায় এবং সমস্ত কিছু ভেঙে দেয়।
একটি কাজ হ'ল কনস্ট্রাক্টর ব্যবহার না করা (বা কমপক্ষে, এর মধ্যে getInstance () ব্যবহার না করা), তবে ক্লাসে স্পষ্টভাবে একটি "init" ফাংশন আপনার ক্রিয়াকলাপ এবং এই জাতীয় সেট আপ করার জন্য। এটার মত:
public static function init() {
add_action( 'wp_footer', array( ExamplePlugin::getInstance(), 'my_action' ) );
}
এই জাতীয় কিছু দিয়ে, ফাইলের শেষে, ক্লাসটি সমস্ত সংজ্ঞায়িত করার পরে এবং এর পরে, প্লাগইন ইনস্ট্যান্ট করা এত সহজ হয়ে যায়:
ExamplePlugin::init();
ইনিশ আপনার ক্রিয়াগুলি যুক্ত করা শুরু করে এবং এর ফলে এটি getInstance () বলে। আপনার যদি দীক্ষা ফাংশন না থাকে তবে ক্লাসটি শুরুতে ইনস্ট্যান্ট করার পরিবর্তে আপনি এটি করবেন:
ExamplePlugin::getInstance();
মূল প্রশ্নের সমাধানের জন্য, বাইরে থেকে ক্রিয়া হুক অপসারণ (ওরফে, অন্য প্লাগইনে) এর পরে এটি করা যেতে পারে:
remove_action( 'wp_footer', array( ExamplePlugin::getInstance(), 'my_action' ) );
plugins_loaded
অ্যাকশন হুককে এমন কিছু দিয়ে দিন যা মূল প্লাগইন দ্বারা ক্রমটিকে পূর্বাবস্থায় ফিরিয়ে আনবে।