Categories
Bangla PHP

পিএইচপি ৫.৫ – নতুন কি এলো?

গত ২০শে জুন পিএইচপি ৫.৫ রিলিজ পেলেও আপগ্রেড করা হয়ে ওঠেনি । আজ একটু আগে আপগ্রেড করেই ভাবলাম নতুন ফিচারগুলো সম্বন্ধে লিখে ফেলি । তো আসুন দেখে নেই উল্লেখযোগ্য নতুন ফিচারগুলো কি কি ।

#১ – জেনারেটর

আমরা পিএইচপিতে আইটারেটর ব্যবহার করার জন্য এতদিন Iterator ইন্টারফেইস ব্যবহার করে এসেছি । কিন্তু নতুন আসা জেনারেটর সিনট্যাক্স ব্যবহার করে আমরা আইটারেশনটা আরো সহজে হ্যান্ডল করতে পারবো ।

জেনারেটর আসলে কি? জেনারেটর হচ্ছে ফাংশনের মতই কিন্তু ফাংশন একবার মাত্র ভ্যালু রিটার্ন করতে পারে কিন্তু জেনারেটর যতবার খুশি ভ্যালু রিটার্ন করতে পারে yield কিওয়ার্ডটি ব্যবহার করে । জেনারেটর থেকে রিটার্ন করা সব ভ্যালু একটি সিকুয়েন্স হিসেবে থাকে যেটি কিনা আইটারেট করা যায় অন্যসব আইটারেটর (যেমন: এ্যারে) এর মত করেই (যেমন: foreach ব্যবহার করে) । জেনারেটর যেহেতু একটি একটি করে ভ্যালু রিটার্ন করে, সেহেতু সব ডাটা এক সাথে এ্যারে তে রাখার প্রয়োজন পড়ে না । ফলে মোমোরী সেইভ করা সম্ভব । যেমন, range(0,1000000) ব্যবহার করে যদি আমরা একটি এ্যারে তৈরি করি এক মিলিয়ন সংখ্যার, তাহলে তার জন্য আমাদের প্রায় ১০০ মেগাবাইট মেমোরী প্রয়োজন হবে । একই কাজ যদি জেনারেটর ব্যবহার করে করি তবে থিওরেটিক্যালি কখনোই ১ কিলোবাইট এর বেশী মেমোরী ব্যবহারের প্রয়োজন পড়বে না ।

চলুন জেনারেটরের কোড এক্সাম্পল দেখি –

আউটপুট:

#২ – finally ব্লক

পিএইচপিতে আমরা এক্সেপশন হ্যান্ডলিং এর জন্য এতদিন try..catch ব্লক ব্যবহার করে এসেছি । এবার আমরা সেই সাথে পাচ্ছি আরেকটি নতুন ব্লক – finally । এই ব্লক সব সময়ই রান করবে । অর্থাৎ এক্সেপশন থাকুক বা নাই থাকুক এই ব্লক পিএইচপি চোখ বুজে এক্সিকিউট করবে । এই ব্লকের সুবিধাটা কি? ধরুন আপনি try ব্লকে একটি ডাটাবেইজ কানেকশন ওপেন করেছিলেন । এরপর পেলেন একটি এক্সেপশন এবং সেটিকে হ্যান্ডল করলেন কিন্তু ঐ ডাটাবেইজ কানেকশন? ওটা তো বন্ধ করা দরকার, তাই না? এই সুযোগটাই আপনি পাচ্ছেন finally ব্লকে ।

পিএইচপি ম্যানুয়াল থেকেই কোড স্যাম্পল তুলে দেই –

#৩ – পাসওয়ার্ড হ্যাশিং এপিআই

পাসওয়ার্ড হ্যাশিং সহজ করার জন্য এই ভার্সনে এসেছে – password_hash() এবং password_verify() । password_hash ফাংশনটি দুইটি প্যারামিটার নিয়ে কাজ করে – টেক্সট পাসওয়ার্ড, এবং হ্যাশিং এ্যালগরিদম (অনেকগুলো প্রিডিফাইন্ড কনস্টান্ট আছে) ।

উদাহরণ:

আউটপুট:

#৪ – ডিরেফারেন্সিং

এবার এ্যারে এবং স্ট্রিং লিটারেলের বেলায়ও ডিরেফারেন্সিং ফিচার যোগ করা হয়েছে –

#৫ – ক্লাস নেইম রেজুলেশন

ধরুন আপনি কোন একটি নেইমস্পেইস থেকে একটি ক্লাস ইম্পোর্ট করেছেন । এখন যদি আপনার প্রয়োজন হয় ঐ ক্লাস এর নেইমস্পেইস সহ পুরো নামের, তখন কি করবেন? আর বিশেষ করে যদি use…as ব্যবহার করে ক্লাসটিকে অন্য নামে ইম্পোর্ট করা হয় তবে ব্যাপারটি আরো জটিল হয়ে দাড়ায় । এই সমস্যার সহজ সমাধান নিয়ে এসেছে ক্লাস নেইম রেজুলেশন । যেকোনো ক্লাসে class কিওয়ার্ড ব্যবহার করে ফুল নেইম পাওয়া যাবে এভাবে – MyClass::class

আউটপুট:

অন্যান্য পরিবর্তন

অন্যান্য পরিবর্তনের মধ্য আছে –

# foreach লুপে list() ব্যবহার করা যায়
# foreach লুপে নন-স্ক্যালার (স্ট্রিং বা নাম্বার বাদের অন্য টাইপের ভ্যালু) ব্যবহার করা যায়
# OpCache এর মাধ্যমে পার্ফরমেন্স এ ইম্প্রুভমেন্ট

Categories
Bangla

এমভিসি (মডেল-ভিউ-কন্ট্রোলার) প্যাটার্ণ

এমভিসি বা মডেল-ভিউ-কন্ট্রোলার খুবই জনপ্রিয় একটি প্যাটার্ন । বিশেষ করে যদি আপনি ওয়েব নিয়ে কাজ করেন তাহলে হয়তো ইতোমধ্যে এমভিসি শব্দটির সাথে পরিচিত হয়েছেন । Trygve Reenskaug নামের এক ভদ্রলোক এই প্যাটার্নটির জনক। ভদ্রলোকের নামের বানানটি যতটা না জটিল, তার আইডিয়াটা ঠিক ততটাই সহজবোধ্য । এমভিসি প্যাটার্নের মূল বক্তব্য হলো এই প্যাটার্নে তিনটি কম্পোনেন্ট থাকবে – একটি মডেল যেটি ডাটা নিয়ে কাজ করবে, একটি ভিউ যেটার কাজ হবে মডেলকে ভিজ্যুয়ালাইজ করা এবং একটি কন্ট্রোলার যেটি ব্যবহারকারী এবং সিস্টেমের মধ্য সমন্বয়কারী হিসেবে কাজ করে । Reenskaug এমভিসি প্যাটার্নের উপর একটি ওয়েব পেইজ মেইনটেইন করেন যেখানে এমভিসি এর উপরে বিশদ বর্ননা পাওয়া যাবে – http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html

আমরা যদি এমভিসি কম্পোনেন্টগুলোর দিকে নজর দেই তাহলে দেখবো –

মডেল: মডেলের কাজই হলো ডাটা নিয়ে কাজ করা । মডেল হতে পারে একটি অবজেক্ট কিংবা অনেকগুলো অবজেক্ট এর একটি স্ট্রাকচার । একটি সিস্টেমের সব ধরণের নলেজ বা ডাটা মডেল দিয়ে রিপ্রেজেন্ট করা যায় । ক্ষেত্রবিশেষে মডেল তার অবস্থা পরিবর্তন হলে (যেমন: কোন ভ্যালুর মান পাল্টে গেলে) কন্ট্রোলার বা ভিউকে নোটিফাই করে যাতে প্রয়োজনীয় প্রসেসিং করা সম্ভব হয় । ওয়েবে সাধারণত এ ধরণের নোটিফিকেশন এর সুযোগ থাকে না ।

ভিউ: ভিউ এর কাজ হচ্ছে মডেলকে ব্যবহারকারীর সামনে তুলে ধরা । সাধারণত ভিউ মডেল থেকে ডাটা নিয়ে সেটাকে ব্যবহারকারীর কাছে সহজবোধ্য রূপে তুলে ধরে ।

কন্ট্রোলার: কন্ট্রোলার ব্যবহারকারীর কাছ থেকে তথ্য সংগ্রহ করে আবার ব্যবহারকারীর প্রয়োজনমত ভিউ উপস্থাপন করে । কন্ট্রোলারই বলে দেয় ভিউ কোন মডেল থেকে ডাটা নিয়ে কিভাবে উপস্থাপন করবে । এছাড়াও কন্ট্রোলার মডেলে নানা ধরণের পরিবর্তন করতে পারে প্রয়োজনমত ।

এই প্যাটার্নটি অনেক ধরণের সফটওয়্যার ডিজাইন করার ক্ষেত্রেই ব্যবহারযোগ্য । ডেস্কটপ, মোবাইল কিংবা ওয়েব এ্যাপ্লিকেশন – সব জায়গাতেই এই প্যাটার্নটি কমবেশী প্রচলিত । তবে অন্যান্য প্ল্যাটফর্মের চাইতে ওয়েবে বোধহয় একটু বেশীই পরিচিত ।

উদাহরণ হিসেবে আমরা যদি একটি সাদামাটা স্ট্যাটিক ওয়েব পেইজের কথা চিন্তা করি তাহলে দেখবো –

# মডেল: এইচটিএমএল এখানে মডেল হিসেবে কাজ করছে । ওয়েব পেইজের সকল তথ্য কিন্তু এইচটিএমএল হিসেবেই থাকছে ।
# ভিউ: এই এইচটিএমএল ট্যাগগুলোকে কিভাবে ব্যবহারকারীর সামনে তুলে ধরতে হবে সেটা নির্দেশ করার জন্য আমরা সিএসএস ব্যবহার করি ।
# কন্ট্রোলার: জাভাস্ক্রীপ্ট ব্যবহার করে আমরা নতুন নতুন এইচটিএমএল যেমন যোগ করতে পারি তেমনি পারি সিএসএস পরিবর্তন করতে ।

তাহলে এখানেও সেই এমভিসি প্যাটার্নের দেখা মিলছে । এবার দেখা যাক একটি ডাইনামিক ওয়েব এ্যাপ্লিকেশন এর ক্ষেত্রে কি হতে পারে । মনে করি একটি ওয়েব এ্যাপ্লিকেশন যেটির কাজ হচ্ছে একটি ক্লাসের স্টুডেন্টদের তালিকা প্রদশর্ন করা । তাহলে –

# মডেল: সকল স্টুডেন্টদের তথ্য । সম্ভবত এই তথ্য একত্রে একটি ডাটাবেইজে সংরক্ষিত থাকবে এবং মডেল ব্যবহার করে আমরা এই তথ্য এ্যাক্সেস করতে পারবো ।
# ভিউ: স্টুডেন্টদের তালিকা যেটি কিনা এইচটিএমএল হিসেবে একটি সুন্দর টেবিলে রোল নম্বরের ক্রমানুযায়ী প্রদর্শিত হবে ।
# কন্ট্রোলার: কন্ট্রোলার জানবে কোন মডেল থেকে স্টুডেন্টদের ডাটা সংগ্রহ করতে হবে, রোল নম্বর অনুযায়ী কিভাবে সাজাতে হবে অতপর কিভাবে এই ডাটা থেকে ব্রাউজারে প্রদর্শনযোগ্য এইচটিএমএল কোড আউটপুট করা যাবে ।

আমরা যদি হালের জনপ্রিয় পিএইচপি ফ্রেমওয়ার্ক লারাভেলের মত করে চিন্তা করি তাহলে দেখবো –

# মডেল অবজেক্টগুলো সরাসরি ডাটাবেইজের টেবিলকে রিপ্রেজেন্ট করে । একেকটি মডেল ব্যবহার করে আমরা একেক টেবিল থেকে ডাটা এ্যাক্সেস করতে পারি ।
# ভিউ থাকে এইচটিএমএল এর মত বিশেষ টেম্প্লেট যেটা জানে কিভাবে এইচটিএমএল কোড আউটপুট করতে হবে ।
# কন্ট্রোলার অবজেক্টগুলো ব্যবহারকারীর ইচ্ছামত প্রয়োজনীয় মডেল থেকে ডাটা এনে ভিউ তৈরি করে দেয় ।

যেমন: যখন একজন ব্যবহারকারী /students/all – এই ঠিকানা ভিজিট করবেন তখন সব স্টুডেন্টদের তালিকা দেখাতে হবে । যখনই ওয়েব এ্যাপ্লিকশেন এই রিকোয়েস্টটি পায় তখন সে কন্ট্রোলারকে জানায় যে ব্যবহারকারী সব স্টুডেন্টদের তালিকা দেখতে চাচ্ছে । কন্ট্রোলার তখন ঝটপট Student মডেল এর কাছ থেকে সব স্টুডেন্ট এর তথ্য সংগ্রহ করে নেয় । এরপর সেগুলোকে রোল অনুযায়ী সাজিয়ে পাঠিয়ে দেয় ভিউ এর কাছে । ভিউ তখন মডেল হতে পাওয়া ডাটা সুন্দর করে এইচটিএমএল হিসেবে আউটপুট দিয়ে দেয় ।

কি করে বুঝবেন যে আপনার এ্যাপ্লিকেশনটি সঠিকভাবে এমভিসি প্যাটার্ন অনুসরণ করছে? নিজেকে জিজ্ঞাসা করুন এই এ্যাপ্লিকেশনটি থীমেবল কিনা । অর্থাৎ চাইলেই আপনি এটির জন্য অনেকগুলো থীম তৈরি করে ডাইনামিকালি থীম পরিবর্তন করতে পারছেন কিনা । যদি সেটা সম্ভব হয় তবে সম্ভবত আপনি সঠিকভাবেই এমভিসি ফলো করেছেন আর যদি সম্ভব না হয় তবে আপনি এমভিসি কম্পোনেন্টগুলোকে আলাদা করতে পারেননি ঠিকমতো ।

Categories
Bangla PHP

ডিজাইন প্যাটার্ন – ফ্যাক্টরি মেথড

আপডেট:

রিফাত ভাইয়ের সাজেশন অনুসারে দুটো জিনিস যোগ করলাম –

# namespace এর ব্যবহার
# instanceof ব্যাবহার করে নিশ্চিত হওয়া যে রিকোয়েস্ট করা ক্লাস আসলে মিডিয়া ইন্টারফেইস ইম্প্লিমেন্ট করে ।

এমরান ভাইয়ের পরামর্শ অনুসারে ডিজাইন বাই কন্ট্র্যাক্ট এর রেফারেন্স যোগ করলাম ।


ফ্যাক্টরি মেথড প্যাটার্ন এর কাজ তার নাম থেকেই সহজে অনুমান করা যায় । এই প্যাটার্নে একটি ফ্যাক্টরি অবজেক্ট এ একটি মেথড থাকে যার কাজ হচ্ছে আমাদের প্রয়োজনমত অবজেক্ট তৈরি করে দেওয়া । এই অবজেক্টগুলো সাধারণত একই ধরণের হয়ে থাকে । উদাহরণ হিসেবে আমরা ভাবতে পারি একটি কন্টেন্ট ম্যানেজমেন্ট সলিউশন এর কথা (যেমন: ওয়ার্ডপ্রেস, জুমলা কিংবা দ্রুপাল) যেখানে নানা ধরণের কন্টেন্ট থাকে । থাকতে পারে অডিও, ভিডিও কিংবা ফটো । এগুলোকে এক সাথে আমরা মিডিয়া হিসেবে চিন্তা করতে পারি । আবার দেখুন, এই মিডিয়াগুলোর কিছু সাধারণ বৈশিষ্ট্য থাকতে পারে, যেমন: সব মিডিয়ারই একটি পাবলিক URL থাকে, সার্ভারে লোকেশন বোঝানোর জন্য ফাইল পাথ থাকে, মিডিয়ার ফাইল সাইজ থাকে, সেই সাথে থাকে কোনটি কোন টাইপের মিডিয়া । এরকম ক্ষেত্রে আমরা একটি মিডিয়া ইন্টারফেইস তৈরি করে নিবো এবং আমাদের স্বতন্ত্র মিডিয়াগুলো এই ইন্টারফেইস ইম্প্লিমেন্ট করবে । ইন্টারফেইস ব্যবহার করে আমরা অবজেক্টগুলোর সাধারণ আচরণ নির্দিষ্ট করে দিতে পারি । যেমন আমরা সব গুলো অবজেক্টকে বাধ্য করতে পারি একটি getType() মেথড ইম্প্লিমেন্ট করতে যেটা আমাদের বলে দিবে ঐ অবজেক্টটি কোন টাইপের মিডিয়া । ইন্টারফেইসের মাধ্যমে ফরমাল একটি স্ট্রাকচার দাড় করানোর কনসেপ্টটি ডিজাইন বাই কন্ট্র্যাক্ট হিসেবে পরিচিত ।

এরপর আমরা একটি মিডিয়া ফ্যাক্টরি ক্লাস ডিজাইন করবো যার একটি স্ট্যাটিক মেথড থাকবে factory() নামে । এই মেথডে আমরা টাইপ পাস করে দিলে সে আমাদের ঐ টাইপের অবজেক্ট দিবে । স্ট্যাটিক মেথড ব্যবহার করবো যাতে নতুন অবজেক্ট তৈরি করার জন্য ফ্যাক্টরি অবজেক্ট এর কোন ইনস্ট্যান্স তৈরি করা না লাগে । আমরা যাতে সরাসরি MediaFactory::factory() কল করতে পারি সেজন্যই স্ট্যাটিক মেথড ।

আমরা এখন খুব সাধারণ একটি উদাহরণ দেখবো পিএইচপি তে –

এখানে দেখুন, আমাদের একটি Media ইন্টারফেইস আছে যেটি একটি পাবলিক মেথড ডিফাইন করেছে getType() । আমাদের Audio, Video এবং Photo ক্লাস এই ইন্টারফেইসকে ইম্প্লিমেন্ট করেছে নিজের মত করে । MediaFactory ক্লাসের factory() আমাদের কাছে $type প্যারামিটার চায় । টাইপ বলে দিলে সে সেই টাইপের অবজেক্ট তৈরি করে রিটার্ন করে ।

এবার আমরা দেখি কিভাবে আমাদের কোডে এই ফ্যাক্টরি মেথড প্যাটার্ন ব্যবহার করবো –

এখানে আমরা প্রতিবার MediaFactory এর কাছ থেকে আমাদের প্রয়োজনীয় টাইপের অবজেক্ট চেয়ে নিচ্ছি । এই কোডের আউটপুটটা কেমন হবে? আসুন দেখে নেই –

তো, এটাই হলো ফ্যাক্টরি প্যাটার্ন যেখানে একটি ফ্যাক্টরি মেথড আমাদের ফরমায়েশ মত অবজেক্ট তৈরি করে দেয় 🙂