সুতরাং আসুন আমরা পর্যবেক্ষক প্যাটার্নটি চান না বলে বলি কারণ এটির প্রয়োজন শোনার কাজটি পরিচালনা করার জন্য আপনার শ্রেণি পদ্ধতিগুলি পরিবর্তন করা এবং জেনেরিক কিছু চান। এবং যাক আপনি extends
উত্তরাধিকার ব্যবহার করতে চান না কারণ আপনি ইতিমধ্যে অন্য কোনও শ্রেণি থেকে আপনার ক্লাসে উত্তরাধিকারী হয়ে উঠতে পারেন। অনেক প্রচেষ্টা ছাড়াই যে কোনও ক্লাস প্লাগেবল করার জেনেরিক উপায় থাকা কি দুর্দান্ত হবে না ? এখানে কীভাবে:
<?php
////////////////////
// PART 1
////////////////////
class Plugin {
private $_RefObject;
private $_Class = '';
public function __construct(&$RefObject) {
$this->_Class = get_class(&$RefObject);
$this->_RefObject = $RefObject;
}
public function __set($sProperty,$mixed) {
$sPlugin = $this->_Class . '_' . $sProperty . '_setEvent';
if (is_callable($sPlugin)) {
$mixed = call_user_func_array($sPlugin, $mixed);
}
$this->_RefObject->$sProperty = $mixed;
}
public function __get($sProperty) {
$asItems = (array) $this->_RefObject;
$mixed = $asItems[$sProperty];
$sPlugin = $this->_Class . '_' . $sProperty . '_getEvent';
if (is_callable($sPlugin)) {
$mixed = call_user_func_array($sPlugin, $mixed);
}
return $mixed;
}
public function __call($sMethod,$mixed) {
$sPlugin = $this->_Class . '_' . $sMethod . '_beforeEvent';
if (is_callable($sPlugin)) {
$mixed = call_user_func_array($sPlugin, $mixed);
}
if ($mixed != 'BLOCK_EVENT') {
call_user_func_array(array(&$this->_RefObject, $sMethod), $mixed);
$sPlugin = $this->_Class . '_' . $sMethod . '_afterEvent';
if (is_callable($sPlugin)) {
call_user_func_array($sPlugin, $mixed);
}
}
}
} //end class Plugin
class Pluggable extends Plugin {
} //end class Pluggable
////////////////////
// PART 2
////////////////////
class Dog {
public $Name = '';
public function bark(&$sHow) {
echo "$sHow<br />\n";
}
public function sayName() {
echo "<br />\nMy Name is: " . $this->Name . "<br />\n";
}
} //end class Dog
$Dog = new Dog();
////////////////////
// PART 3
////////////////////
$PDog = new Pluggable($Dog);
function Dog_bark_beforeEvent(&$mixed) {
$mixed = 'Woof'; // Override saying 'meow' with 'Woof'
//$mixed = 'BLOCK_EVENT'; // if you want to block the event
return $mixed;
}
function Dog_bark_afterEvent(&$mixed) {
echo $mixed; // show the override
}
function Dog_Name_setEvent(&$mixed) {
$mixed = 'Coco'; // override 'Fido' with 'Coco'
return $mixed;
}
function Dog_Name_getEvent(&$mixed) {
$mixed = 'Different'; // override 'Coco' with 'Different'
return $mixed;
}
////////////////////
// PART 4
////////////////////
$PDog->Name = 'Fido';
$PDog->Bark('meow');
$PDog->SayName();
echo 'My New Name is: ' . $PDog->Name;
পর্ব 1 এ, আপনি এ এর সাথে অন্তর্ভুক্ত থাকতে পারেন require_once()
এটিই আপনার পিএইচপি স্ক্রিপ্টের শীর্ষে কল । প্লাগযোগ্য কিছু করার জন্য এটি ক্লাসগুলি লোড করে।
পার্ট 2 এ, যেখানে আমরা একটি ক্লাস লোড করি। দ্রষ্টব্য আমাকে ক্লাসের জন্য বিশেষ কিছু করতে হবে না, যা পর্যবেক্ষক নিদর্শনের তুলনায় উল্লেখযোগ্যভাবে আলাদা।
পার্ট 3 এ, যেখানে আমরা আমাদের ক্লাসটিকে "প্লাগেবল" হিসাবে রূপান্তরিত করি (যা প্লাগইন সমর্থন করে যা আমাদের শ্রেণি পদ্ধতি এবং বৈশিষ্ট্যগুলিকে ওভাররাইড করতে দেয়)। সুতরাং, উদাহরণস্বরূপ, আপনার কাছে একটি ওয়েব অ্যাপ্লিকেশন থাকলে আপনার একটি প্লাগইন রেজিস্ট্রি থাকতে পারে এবং আপনি এখানে প্লাগইনগুলি সক্রিয় করতে পারেন। Dog_bark_beforeEvent()
ফাংশনটিও লক্ষ্য করুন । যদি আমি $mixed = 'BLOCK_EVENT'
ফেরতের বিবৃতি দেওয়ার আগে সেট করে রাখি তবে এটি কুকুরটিকে ছাঁটাই থেকে আটকাবে এবং কুকুর_বার্ক_পরেও আটকে দেবে কারণ কোনও ইভেন্ট হবে না।
পার্ট 4 এ, এটি সাধারণ অপারেশন কোড, তবে লক্ষ্য করুন যে আপনি যা চালাবেন বলে মনে হয় তা তেমন চালায় না। উদাহরণস্বরূপ, কুকুরটি এর নাম 'ফিদো' নয়, তবে 'কোকো' হিসাবে ঘোষণা করে। কুকুরটি 'মীও' বলে না, তবে 'ওওফ' বলে। এবং পরে আপনি কুকুরটির নামটি দেখতে চাইলে দেখতে পাবেন এটি 'কোকো' এর পরিবর্তে 'ভিন্ন'। এই সমস্ত ওভাররাইডগুলি পার্ট 3 এ সরবরাহ করা হয়েছিল।
তাহলে এটা কিভাবে কাজ করে? ঠিক আছে, আসুন বাতিল করা যাক eval()
(যা প্রত্যেকে "মন্দ" বলে মনে করেন) এবং রায় দিন যে এটি কোনও পর্যবেক্ষক ধরণ নয়। সুতরাং, এটি যেভাবে কাজ করে তা হ'ল প্লাগেবল নামে লুক্কায়িত খালি ক্লাস, এতে কুকুর শ্রেণি দ্বারা ব্যবহৃত পদ্ধতি এবং বৈশিষ্ট্য নেই। সুতরাং, যেহেতু এটি ঘটে, যাদু পদ্ধতিগুলি আমাদের জন্য জড়িত। সে কারণেই 3 এবং 4 অংশে আমরা প্লাগেবল ক্লাস থেকে প্রাপ্ত বস্তুর সাথে গোলমাল করি, কুকুরের ক্লাস নিজেই নয়। পরিবর্তে, আমরা প্লাগিন ক্লাসটি আমাদের জন্য কুকুর অবজেক্টটিতে "স্পর্শ" করতে দিন। (যদি এটি কোনও ধরণের ডিজাইনের প্যাটার্ন আমি জানি না তবে - দয়া করে আমাকে জানান))