আজকে আমরা জামালকে নিয়ে গল্প করবো। জামাল এমনিতে বেশ ভালো ছেলে। প্রেম ভালোবাসার দিক দিয়ে সে বেশ একটিভ। তার একটা বউ তো আছেই, সাথে একটা গার্লফ্রেন্ড আছে। তার উপর আবার একটা জাস্টফ্রেন্ড ও আছে।
বউ তার একান্তই নিজের। তাই ধরে নিচ্ছি বউ হলো তার প্রাইভেট প্রোপার্টি।
তার গার্লফ্রেন্ডও কিছুটা তার নিজেরই প্রোপার্টি। শত হলেও, গার্লফ্রেন্ড বলে কথা। কিন্তু সমস্যা হচ্ছে বিয়ে তো আর করে নাই। তাই তার গার্লফ্রেন্ড মাঝে মধ্যে জামালের বন্ধুদের সাথে একটু আধটু কথা বার্তা বলে আর কি। ধরে নিলাম গার্লফ্রেন্ড হচ্ছে প্রোটেকটেড প্রোপার্টি।
এইদিকে জামালের জাস্টফ্রেন্ড আবার সুপার স্মার্ট। সে শুধু জামালেরই জাস্টফ্রেন্ড না, তার নিজেরও আরো কিছু জাস্টফ্রেন্ড আছে। একদম ওয়ান টু মেনি রিলেশনশিপ যেটাকে বলে। যে কেউ চাইলেই তার সাথে কথা বলতে পারে। এটাকে আমরা পাবলিক প্রোপার্টি বলতেই পারি।
তো, এই বউ, গার্লফ্রেন্ড আর জাস্টফ্রেন্ড নিয়েই তার ক্লাস।
<?php /** * Project Reflection * Created by Rupok Chowdhury * Timestamp 6/24/21 10:27 AM **/ class Jamal { private $bou; protected $girlfriend; public $justfriend; /** * Jamal constructor. * @param $bou * @param $justfriend * @param $girlfriend */ public function __construct( $bou, $girlfriend, $justfriend ) { $this->bou = $bou; $this->girlfriend = $girlfriend; $this->justfriend = $justfriend; } }
এখন কোন একটা কারনে আপনার জামালের ক্লাসের এই তিনজন প্রোপার্টির নাম বের করতে হবে।
জামালের জাস্টফ্রেন্ড যেহেতু পাবলিক প্রোপার্টি, তাই তার নাম বের করা কোন সমস্যাই না। সমস্যা হলো তার বউ আর গার্লফ্রেন্ড এর নাম বের করা। যেহেতু জামাল চায় না তার ব্যক্তিগত বিষয়গুলো সবাই জানুক। তাই স্বাভাবিকভাবেই জামাল তার বউ আর গার্লফ্রেন্ড কে প্রাইভেট আর প্রোটেকটেড করে রেখেছে এবং যথারীতি কোন পাবলিক গেটার মেথড রাখে নাই । আপনি চাইলেই তো আর জামাল এর চরিত্র পরিবর্তন করে বউ আর গার্লফ্রেন্ড কে পাবলিক করে দিতে পারবেন না। এখন তাহলে কি করা যায়?
এরকম সিচুয়েশনে আপনার পাশের বাসার এক ভাবীর সাহায্য নিতে হবে যার নাম ReflectionClass . এই ভাবী আবার যে কারো ফেইসবুক প্রোফাইল ঘাটাঘাটি করেই বলে দিতে পারে কার সাথে কার রিলেশন। তার কাজই হচ্ছে অন্যদের তথ্য খুঁজে বের করে দেয়া। ভাবী আবার বেশ পরোপকারী। কিন্তু এই ভাবীর কাছে যদি জামালের তথ্য জানতে চান, সে জামালের চৌদ্দগুষ্ঠির ডেটা একবারে দিয়ে দিবে। আমাদের দরকার জামালের স্পেসিফিক কিছু ব্যক্তিগত তথ্য – তার গার্লফ্রেন্ড এবং জাস্টফ্রেন্ড এর নাম। তার পাবলিক প্রোপার্টির তথ্য জানার জন্য তো আর আমাদের অন্য কারো কাছে যাবার প্রয়োজন নাই।
সেই ক্ষেত্রে আমাদের ReflectionClass ভাবীর এক বান্ধবী ReflectionProperty এর কাছে যেতে হবে যাতে করে প্রোপার্টি স্পেসিফিক ডেটা গুলো আলাদা করে ফেলা যায়। ReflectionClass ভাবীর নাম শুনেই ReflectionProperty ভাবী আমাদের প্রোপার্টিগুলো দিয়ে দিলো। বললো শুক্রবার বিকালে তার বাসায় দাওয়াত।
শুক্রবার বিকালে নাহয় দাওয়াত খেতে ভাবীর বাসায় যাওয়াই যায়। কিন্তু সমস্যা হলো প্রোপার্টির ভ্যালু তো আপনি এখনো দেখতে পারছেন না কারন যেই প্যাকেট এর ভেতর জামাল এর গার্লফ্রেন্ড আর জাস্টফ্রেন্ড এর নাম লেখা আছে, সেই প্যাকেট টা সিলগালা করা।
সমস্যা রয়েই গেলো।
ঠিক তখন ReflectionProperty এর ছোটবোন এসে আপনাকে চুপি চুপি সাইডে ডেকে নিয়ে গেলো। বললো – “কি ভাইয়া, আপু আপনাকে সিলগালা করা প্যাকেট দিয়েছে? দিন, আমি খুলে দিচ্ছি, কিন্তু আমাকে ট্রিট দিতে হবে।”
আপনি বুঝে গেলেন ReflectionProperty ভাবীর এই setAccessible ছোটবোন কে দিয়েই কাজ হবে। তাই একটু ইলু বিলু করে আপনি তার খানিকটা প্রশংসা করলেন। বললেন – “উফ setAccessible, তুমি কি যে কিউট না। পরশুদিন বিকালে তোমাকে আইসক্রিম খাওয়াবো।”
শুনেই setAccessible একদম আইসক্রিম এর মত গলে গেলো এবং রাজি হয়ে true বলে দিলো। এবং একই সাথে আপনার কাজও হয়ে গেলো। প্যাকেট খুলেই দেখে ফেললেন জামালের গার্লফ্রেন্ড আর জাস্টফ্রেন্ড এর নাম।
ব্যাস। আপনাকে আর পায় কে। এবার এই ডেটা দিয়ে যা ইচ্ছা তাই করতে পারবেন। পুরোপুরি আপনার ব্যাপার।
দেখলেন তো, চাইলেই আসলে অনেক কিছু করা সম্ভব। যাস্ট একটু এদিক ওদিক খোঁজ খবর রাখতে হয় আর কি। কিন্তু এটাও মাথায় রাখতে হবে যে এরকম কাহিনি করে ডেটা বের করার কিন্তু অনেক রিস্ক। বুঝে শুনে না করলে ভবিষ্যতে ধরা খাবার সম্ভাবনা প্রচুর।
তাই যেখানে সম্ভব, জামালকেই রিকোয়েস্ট করুন যাতে তার চরিত্র পরিবর্তন করে এট লিস্ট একটা পাবলিক গেটার মেথড করে রাখে যাতে করে জরুরী প্রয়োজনে তার কিছুটা ব্যক্তিগত ডেটা তার কাছ থেকেই পাওয়া যায়। তাতে করে আর পাশের বাসার ভাবীর কাছে গিয়ে জামালকে নিয়ে কুটনামি করতে হবে না।
হ্যাপি কোডিং। আর হ্যাঁ, ভাবীর ছোটবোনকে কিন্তু আইসক্রিম খাওয়াতে ভুলবেন না 😉
<?php /** * Project Reflection * Created by Rupok Chowdhury * Timestamp 6/24/21 10:27 AM **/ class Jamal { private $bou; protected $girlfriend; public $justfriend; /** * Jamal constructor. * @param $bou * @param $justfriend * @param $girlfriend */ public function __construct( $bou, $girlfriend, $justfriend ) { $this->bou = $bou; $this->girlfriend = $girlfriend; $this->justfriend = $justfriend; } } $reflectionClass = new ReflectionClass( 'Jamal' ); $justfriendProperty = $reflectionClass->getProperty( 'justfriend' ); $girlfriendProperty = $reflectionClass->getProperty( 'girlfriend' ); $girlfriendProperty->setAccessible( true ); $bouProperty = $reflectionClass->getProperty( 'bou' ); $bouProperty->setAccessible( true ); $jamalTheGuy = new Jamal( 'nusrat', 'israt', 'ira' ); var_dump( $justfriendProperty->getValue( $jamalTheGuy ) ); var_dump( $girlfriendProperty->getValue( $jamalTheGuy ) ); var_dump( $bouProperty->getValue( $jamalTheGuy ) ); // Output: //string(3) "ira" //string(5) "israt" //string(6) "nusrat"