গত ২০শে জুন পিএইচপি ৫.৫ রিলিজ পেলেও আপগ্রেড করা হয়ে ওঠেনি । আজ একটু আগে আপগ্রেড করেই ভাবলাম নতুন ফিচারগুলো সম্বন্ধে লিখে ফেলি । তো আসুন দেখে নেই উল্লেখযোগ্য নতুন ফিচারগুলো কি কি ।
#১ – জেনারেটর
আমরা পিএইচপিতে আইটারেটর ব্যবহার করার জন্য এতদিন Iterator ইন্টারফেইস ব্যবহার করে এসেছি । কিন্তু নতুন আসা জেনারেটর সিনট্যাক্স ব্যবহার করে আমরা আইটারেশনটা আরো সহজে হ্যান্ডল করতে পারবো ।
জেনারেটর আসলে কি? জেনারেটর হচ্ছে ফাংশনের মতই কিন্তু ফাংশন একবার মাত্র ভ্যালু রিটার্ন করতে পারে কিন্তু জেনারেটর যতবার খুশি ভ্যালু রিটার্ন করতে পারে yield কিওয়ার্ডটি ব্যবহার করে । জেনারেটর থেকে রিটার্ন করা সব ভ্যালু একটি সিকুয়েন্স হিসেবে থাকে যেটি কিনা আইটারেট করা যায় অন্যসব আইটারেটর (যেমন: এ্যারে) এর মত করেই (যেমন: foreach ব্যবহার করে) । জেনারেটর যেহেতু একটি একটি করে ভ্যালু রিটার্ন করে, সেহেতু সব ডাটা এক সাথে এ্যারে তে রাখার প্রয়োজন পড়ে না । ফলে মোমোরী সেইভ করা সম্ভব । যেমন, range(0,1000000) ব্যবহার করে যদি আমরা একটি এ্যারে তৈরি করি এক মিলিয়ন সংখ্যার, তাহলে তার জন্য আমাদের প্রায় ১০০ মেগাবাইট মেমোরী প্রয়োজন হবে । একই কাজ যদি জেনারেটর ব্যবহার করে করি তবে থিওরেটিক্যালি কখনোই ১ কিলোবাইট এর বেশী মেমোরী ব্যবহারের প্রয়োজন পড়বে না ।
চলুন জেনারেটরের কোড এক্সাম্পল দেখি –
|
<?php function generateOdds($ceiling) { for ($i = 0; $i < $ceiling; $i++) { if (($i % 2) != 0) { yield $i; } } } foreach (generateOdds(10) as $number) { echo $number . PHP_EOL; } |
আউটপুট:
|
Lighthouse: ~/Codes/php/55 → php generators.php 1 3 5 7 9 |
#২ – finally ব্লক
পিএইচপিতে আমরা এক্সেপশন হ্যান্ডলিং এর জন্য এতদিন try..catch ব্লক ব্যবহার করে এসেছি । এবার আমরা সেই সাথে পাচ্ছি আরেকটি নতুন ব্লক – finally । এই ব্লক সব সময়ই রান করবে । অর্থাৎ এক্সেপশন থাকুক বা নাই থাকুক এই ব্লক পিএইচপি চোখ বুজে এক্সিকিউট করবে । এই ব্লকের সুবিধাটা কি? ধরুন আপনি try ব্লকে একটি ডাটাবেইজ কানেকশন ওপেন করেছিলেন । এরপর পেলেন একটি এক্সেপশন এবং সেটিকে হ্যান্ডল করলেন কিন্তু ঐ ডাটাবেইজ কানেকশন? ওটা তো বন্ধ করা দরকার, তাই না? এই সুযোগটাই আপনি পাচ্ছেন finally ব্লকে ।
পিএইচপি ম্যানুয়াল থেকেই কোড স্যাম্পল তুলে দেই –
|
function inverse($x) { if (!$x) { throw new Exception('Division by zero.'); } return 1/$x; } try { echo inverse(5) . "\n"; } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } finally { echo "First finally.\n"; } |
#৩ – পাসওয়ার্ড হ্যাশিং এপিআই
পাসওয়ার্ড হ্যাশিং সহজ করার জন্য এই ভার্সনে এসেছে – password_hash() এবং password_verify() । password_hash ফাংশনটি দুইটি প্যারামিটার নিয়ে কাজ করে – টেক্সট পাসওয়ার্ড, এবং হ্যাশিং এ্যালগরিদম (অনেকগুলো প্রিডিফাইন্ড কনস্টান্ট আছে) ।
উদাহরণ:
|
<?php $password = "ohmypwd"; $hash = password_hash($password, PASSWORD_DEFAULT); var_dump($hash); var_dump(password_verify($password, $hash)); |
আউটপুট:
|
Lighthouse: ~/Codes/php/55 → php password.php string(60) "$2y$10$tjGVQcE0TofEAJdgzlpJAO.BNZQ3L.aUHNnGYyZbhT8GHAnBml.qS" bool(true) |
#৪ – ডিরেফারেন্সিং
এবার এ্যারে এবং স্ট্রিং লিটারেলের বেলায়ও ডিরেফারেন্সিং ফিচার যোগ করা হয়েছে –
|
<?php echo 'Array dereferencing:'; echo [4,5,6][0]; echo "\n"; echo 'String dereferencing:'; echo 'HELLO'[0]; echo "\n"; |
#৫ – ক্লাস নেইম রেজুলেশন
ধরুন আপনি কোন একটি নেইমস্পেইস থেকে একটি ক্লাস ইম্পোর্ট করেছেন । এখন যদি আপনার প্রয়োজন হয় ঐ ক্লাস এর নেইমস্পেইস সহ পুরো নামের, তখন কি করবেন? আর বিশেষ করে যদি use…as ব্যবহার করে ক্লাসটিকে অন্য নামে ইম্পোর্ট করা হয় তবে ব্যাপারটি আরো জটিল হয়ে দাড়ায় । এই সমস্যার সহজ সমাধান নিয়ে এসেছে ক্লাস নেইম রেজুলেশন । যেকোনো ক্লাসে class কিওয়ার্ড ব্যবহার করে ফুল নেইম পাওয়া যাবে এভাবে – MyClass::class
|
<?php namespace Test; class MyClass { } namespace TestOutput; use Test\MyClass as ThatClass; echo ThatClass::class; |
আউটপুট:
|
ighthouse: ~/Codes/php/55 → php classnameres.php Test\MyClass |
অন্যান্য পরিবর্তন
অন্যান্য পরিবর্তনের মধ্য আছে –
# foreach লুপে list() ব্যবহার করা যায়
# foreach লুপে নন-স্ক্যালার (স্ট্রিং বা নাম্বার বাদের অন্য টাইপের ভ্যালু) ব্যবহার করা যায়
# OpCache এর মাধ্যমে পার্ফরমেন্স এ ইম্প্রুভমেন্ট