উত্তর
PHP (Hypertext Preprocessor) হলো একটি সার্ভার-সাইড স্ক্রিপ্টিং ল্যাঙ্গুয়েজ। এটি যেভাবে কাজ করে: ১. ইউজার ব্রাউজার থেকে কোনো .php ফাইলের জন্য রিকোয়েস্ট পাঠায়। ২. সার্ভার সেই ফাইলটি খুঁজে বের করে এবং PHP ইঞ্জিনকে প্রসেস করতে দেয়। ৩. PHP ইঞ্জিন কোডগুলো এক্সিকিউট করে এবং একটি HTML আউটপুট তৈরি করে। ৪. সার্ভার সেই HTML ব্রাউজারে ফেরত পাঠায়, যা ইউজার দেখতে পায়।
উত্তর
১. echo কোনো ভ্যালু রিটার্ন করে না, কিন্তু print সবসময় ১ রিটার্ন করে (যা এক্সপ্রেশনে ব্যবহার করা যায়)। ২. echo একই সাথে অনেকগুলো প্যারামিটার নিতে পারে (কমা দিয়ে), কিন্তু print শুধুমাত্র একটি আর্গুমেন্ট নিতে পারে। ৩. পারফরম্যান্সের দিক থেকে echo সামান্য দ্রুত কাজ করে।
উত্তর
PHP মূলত ৮টি ডাটা টাইপ সাপোর্ট করে: ১. String ২. Integer ৩. Float (Double) ৪. Boolean ৫. Array ৬. Object ৭. NULL ৮. Resource (যেমন: ডাটাবেস কানেকশন)।
উত্তর
PHP-তে দুটি পদ্ধতিতে কনস্ট্যান্ট ডিফাইন করা যায়: ১. `define('NAME', 'value');` (গ্লোবাল স্কোপে ব্যবহৃত হয়)। ২. `const NAME = 'value';` (ক্লাস লেভেলে বা কম্পাইল টাইমে ব্যবহৃত হয়)। কনস্ট্যান্টের আগে ডলার ($) চিহ্ন বসে না এবং একবার ডিক্লেয়ার করলে এর মান পরিবর্তন করা যায় না।
উত্তর
১. GET ডাটা ইউআরএল-এ কুয়েরি স্ট্রিং হিসেবে পাঠায়, POST ডাটা HTTP বডিতে পাঠিয়ে দেয়। ২. GET মেথডে পাঠানো ডাটা লিমিটেড (প্রায় ২০০০ ক্যারেক্টার), POST-এ বিশাল পরিমাণ ডাটা পাঠানো যায়। ৩. সিকিউরিটির ক্ষেত্রে POST অনেক বেশি নিরাপদ কারণ পাসওয়ার্ড বা সেনসিটিভ ডাটা ইউআরএল-এ দেখা যায় না।
উত্তর
১. isset() চেক করে একটি ভেরিয়েবল ডিক্লেয়ার করা হয়েছে কি না এবং এর মান NULL কি না। ২. empty() চেক করে ভেরিয়েবলের মান 'Falsy' কি না (যেমন: 0, '', null, false, empty array)। সহজ কথায়, ভেরিয়েবলটি খালি কি না তা চেক করতে empty() ব্যবহৃত হয়।
উত্তর
১. include: ফাইলটি খুঁজে না পেলে শুধুমাত্র একটি 'Warning' দেয়, কিন্তু স্ক্রিপ্ট রান হওয়া বন্ধ হয় না। ২. require: ফাইলটি খুঁজে না পেলে 'Fatal Error' দেয় এবং স্ক্রিপ্ট সাথে সাথে বন্ধ হয়ে যায়। গুরুত্বপূর্ণ ফাইল (যেমন ডাটাবেস কানেকশন) এর জন্য require ব্যবহার করা নিরাপদ।
উত্তর
১. সেশন সার্ভারে ডাটা স্টোর করে, কুকি ইউজারের ব্রাউজারে ডাটা স্টোর করে। ২. সেশন অনেক বেশি সিকিউর কারণ ইউজার সরাসরি ডাটা দেখতে বা এডিট করতে পারে না। ৩. কুকি একটি নির্দিষ্ট সময় পর্যন্ত সেভ থাকে, কিন্তু সেশন সাধারণত ব্রাউজার বন্ধ করলে মুছে যায়।
উত্তর
PHP-তে অ্যারে ৩ প্রকার: ১. Indexed Array: যেখানে ইনডেক্স নম্বর (0, 1, 2) থাকে। ২. Associative Array: যেখানে কি (Key) এবং ভ্যালু পেয়ার থাকে (যেমন: 'name' => 'John')। ৩. Multidimensional Array: অ্যারের ভেতর যখন এক বা একাধিক অ্যারে থাকে।
উত্তর
PHP-তে ভেরিয়েবল স্কোপ মূলত ৩ প্রকার: ১. Local: শুধুমাত্র একটি ফাংশনের ভেতরে অ্যাক্সেসযোগ্য। ২. Global: ফাংশনের বাইরে ডিক্লেয়ার করা হয় এবং ফাংশনের ভেতরে `global` কিওয়ার্ড দিয়ে অ্যাক্সেস করতে হয়। ৩. Static: ফাংশন শেষ হওয়ার পরেও মান ধরে রাখে।
উত্তর
foreach লুপ শুধুমাত্র অ্যারে বা অবজেক্টের ওপর লুপ চালানোর জন্য ব্যবহৃত হয়। সিনট্যাক্স: ```php foreach ($array as $value) { echo $value; } ``` এটি ইনডেক্স মেইনটেইন না করে সরাসরি প্রতিটি এলিমেন্ট নিয়ে কাজ করতে সুবিধা দেয়।
উত্তর
Class হলো একটি ব্লু-প্রিন্ট বা টেম্পলেট যেখানে প্রপার্টি এবং মেথড ডিফাইন করা থাকে। Object হলো সেই ক্লাসের একটি বাস্তব রূপ বা ইনস্ট্যান্স। উদাহরণ: 'Car' যদি একটি ক্লাস হয়, তবে 'Toyota' বা 'BMW' হলো তার অবজেক্ট।
উত্তর
১. __construct(): যখনই একটি অবজেক্ট তৈরি করা হয় (new কিওয়ার্ড দিয়ে), এই মেথডটি স্বয়ংক্রিয়ভাবে প্রথমে রান হয়। ২. __destruct(): যখন অবজেক্টের কাজ শেষ হয়ে যায় বা স্ক্রিপ্ট বন্ধ হয়, তখন এই মেথডটি শেষে রান হয়। এটি মেমোরি ক্লিনআপের জন্য ব্যবহৃত হয়।
উত্তর
১. public: যেকোনো জায়গা থেকে অ্যাক্সেস করা যায়। ২. private: শুধুমাত্র সেই ক্লাসের ভেতর থেকে অ্যাক্সেস করা যায়। ৩. protected: সেই ক্লাস এবং তার চাইল্ড (inherited) ক্লাস থেকে অ্যাক্সেস করা যায়।
উত্তর
Inheritance হলো এমন একটি মেকানিজম যেখানে একটি ক্লাস (Child) অন্য একটি ক্লাসের (Parent) প্রপার্টি এবং মেথডগুলো ব্যবহার করার অনুমতি পায়। এটি `extends` কিওয়ার্ড ব্যবহার করে করা হয়। এটি কোড রিইউজেবিলিটি বাড়ায়।
উত্তর
১. Interface-এ মেথডগুলোর কোনো বডি থাকে না, শুধুমাত্র ডিক্লারেশন থাকে। Abstract ক্লাসে কিছু মেথড বডিসহ থাকতে পারে। ২. একটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে, কিন্তু শুধুমাত্র একটি অ্যাবস্ট্রাক্ট ক্লাসকে এক্সটেন্ড করতে পারে। ৩. ইন্টারফেস মূলত একটি কন্ট্রাক্ট তৈরি করে।
উত্তর
PHP মাল্টিপল ইনহেরিটেন্স সাপোর্ট করে না। অর্থাৎ একটি চাইল্ড ক্লাস একাধিক প্যারেন্ট ক্লাসকে এক্সটেন্ড করতে পারে না। এই সীমাবদ্ধতা দূর করতে Traits ব্যবহার করা হয়, যা বিভিন্ন ক্লাসের মধ্যে মেথড শেয়ার করার সুবিধা দেয়।
উত্তর
SQL Injection হলো একটি সিকিউরিটি অ্যাটাক যেখানে হ্যাকার ডাটাবেস কুয়েরিতে ম্যালিসিয়াস কোড ইনজেক্ট করে ডাটা চুরি বা ডিলিট করে দেয়। প্রতিরোধ: ১. Prepared Statements এবং Parameterized Queries (PDO বা MySQLi) ব্যবহার করে। ২. ইউজার ইনপুট স্যানিটাইজ করে।
উত্তর
১. এটি ডাটাবেস অ্যাবস্ট্রাকশন লেয়ার হিসেবে কাজ করে (একই কোড দিয়ে একাধিক ডাটাবেসে কাজ করা যায়)। ২. এটি SQL Injection প্রতিরোধের জন্য প্রিপেয়ার্ড স্টেটমেন্ট সাপোর্ট করে। ৩. এটি অবজেক্ট ওরিয়েন্টেড স্টাইলে ডাটাবেস অপারেশন করতে সাহায্য করে।
উত্তর
১. json_encode(): PHP অ্যারে বা অবজেক্টকে JSON স্ট্রিং-এ রূপান্তর করে (API রেসপন্স তৈরির জন্য)। ২. json_decode(): JSON স্ট্রিংকে PHP অ্যারে বা অবজেক্টে রূপান্তর করে (API ডাটা রিড করার জন্য)।
উত্তর
সেশন হাইজ্যাকিং হলো এমন একটি প্রক্রিয়া যেখানে হ্যাকার কোনো বৈধ ইউজারের সেশন আইডি চুরি করে সেই ইউজারের একাউন্ট অ্যাক্সেস করে। এটি প্রতিরোধের জন্য `session_regenerate_id()` ব্যবহার করা এবং সেশনে আইপি চেক করা জরুরি।
উত্তর
Static মেথড বা প্রপার্টি হলো সেই মেথড যা ক্লাসের কোনো অবজেক্ট তৈরি না করেই সরাসরি ক্লাস থেকে কল করা যায় (`ClassName::method()`)। এটি মেমোরি বাঁচায় এবং ইউটিলিটি ফাংশন তৈরিতে ব্যবহৃত হয়।
উত্তর
Composer হলো PHP-র একটি ডিপেন্ডেন্সি ম্যানেজার। এটি ব্যবহার করে থার্ড-পার্টি লাইব্রেরি বা প্যাকেজ (যেমন: PHPMailer, Laravel packages) খুব সহজে প্রজেক্টে ইন্সটল এবং আপডেট করা যায়।
উত্তর
আসলে এদের মধ্যে কোনো ফাংশনাল পার্থক্য নেই। দুটিই বর্তমান স্ক্রিপ্ট এক্সিকিউশন সাথে সাথে বন্ধ করে দেয়। `die()` মূলত একটি এরর মেসেজ প্রিন্ট করে স্ক্রিপ্ট থামানোর জন্য বেশি ব্যবহৃত হয়।
উত্তর
Namespace ব্যবহার করা হয় কোডকে অর্গানাইজ করার জন্য এবং একই নামের দুটি আলাদা ক্লাসের মধ্যে কনফ্লিক্ট এড়ানোর জন্য। এটি বড় প্রজেক্টে বা বিভিন্ন প্যাকেজ ব্যবহারের সময় খুবই গুরুত্বপূর্ণ।
উত্তর
এটি ডেভেলপারকে স্ক্রিপ্টের সব ধরণের এরর, ওয়ার্নিং এবং নোটিস দেখানোর নির্দেশ দেয়। ডেভেলপমেন্ট ফেজে কোডের ভুলগুলো সহজে ধরার জন্য এটি খুবই কার্যকর।
উত্তর
১. যখন কোনো ক্লাসের আগে `final` বসে, তখন সেই ক্লাসকে আর ইনহেরিট (extend) করা যায় না। ২. যখন কোনো মেথডের আগে `final` বসে, তখন চাইল্ড ক্লাসে সেই মেথডকে ওভাররাইড করা যায় না।
উত্তর
১. `$this` বর্তমান অবজেক্টের মেম্বারদের রেফার করে (Non-static)। ২. `self` বর্তমান ক্লাসের মেম্বারদের রেফার করে (Static)। এটি কোড ম্যানেজমেন্টের জন্য খুবই গুরুত্বপূর্ণ।
উত্তর
১. array_merge(): দুই বা ততোধিক অ্যারের সব এলিমেন্টকে জোড়া দিয়ে একটি বড় অ্যারে তৈরি করে। ২. array_combine(): একটি অ্যারের ভ্যালুগুলোকে 'Key' হিসেবে এবং অন্য অ্যারের ভ্যালুগুলোকে 'Value' হিসেবে নিয়ে একটি অ্যাসোসিয়েটিভ অ্যারে তৈরি করে।
উত্তর
Autoloading হলো এমন একটি মেকানিজম যেখানে প্রতিটি ক্লাসের জন্য আলাদাভাবে `require` বা `include` না করে, যখনই কোনো ক্লাসের অবজেক্ট তৈরি করা হয়, তখন স্বয়ংক্রিয়ভাবে তার ফাইলটি লোড করে নেওয়া হয়। আধুনিককালে `spl_autoload_register()` এর জন্য ব্যবহৃত হয়।
উত্তর
Late Static Binding হলো এমন একটি ফিচার যা `static::` কিওয়ার্ড ব্যবহার করে রান-টাইমে ক্লাসের মেথড বা প্রপার্টি রেফার করতে সাহায্য করে। এটি ইনহেরিটেন্সের সময় প্যারেন্ট ক্লাস থেকে চাইল্ড ক্লাসের ওভাররাইড করা স্ট্যাটিক মেথড অ্যাক্সেস করতে ব্যবহৃত হয়।
উত্তর
PHP-তে একটি অবজেক্টকে কপি করতে `clone` কিওয়ার্ড ব্যবহৃত হয়। ডিফল্টভাবে এটি Shallow Copy করে। কিন্তু যদি কোনো অবজেক্টের ভেতরের প্রপার্টিগুলোকেও (যেমন অন্য কোনো অবজেক্ট) আলাদাভাবে কপি করতে হয়, তবে `__clone()` মেথডের ভেতরে সেই লজিক লিখে Deep Copy নিশ্চিত করা হয়।
উত্তর
PHP-তে এরর হ্যান্ডেল করার জন্য try, catch এবং finally ব্লক ব্যবহার করা হয়। - try: যেখানে এরর হওয়ার সম্ভাবনা আছে এমন কোড থাকে। - catch: এরর হলে কী ব্যবস্থা নেওয়া হবে তা এখানে থাকে। - finally: এরর হোক বা না হোক, যে কোডটি অবশ্যই রান করবে (যেমন: ডাটাবেস কানেকশন ক্লোজ করা)।
উত্তর
Match expression হলো switch statement-এর একটি আধুনিক রূপ। ১. এটি সরাসরি মান রিটার্ন করতে পারে। ২. এটি Strict Comparison (===) ব্যবহার করে। ৩. এতে `break` লেখার প্রয়োজন হয় না এবং কোড অনেক ক্লিন থাকে।
উত্তর
Generator হলো এমন একটি ফাংশন যা পুরো ডাটা সেট একবারে মেমোরিতে না নিয়ে `yield` কিওয়ার্ড ব্যবহার করে একেকটি ভ্যালু রিটার্ন করে। এটি বিশাল পরিমাণ ডাটা প্রসেস করার সময় মেমোরি লিমিট এরর থেকে কোডকে রক্ষা করে।
উত্তর
ফাংশনের প্যারামিটারে কোন টাইপের ডাটা আসবে (যেমন: array, string, int) এবং ফাংশনটি কী ধরণের ডাটা রিটার্ন করবে তা আগে থেকেই বলে দেওয়াকে Type Hinting বলে। এটি কোডকে আরও বেশি টাইপ-সেফ এবং বাগ-মুক্ত করে।
উত্তর
অ্যানোনিমাস ক্লাস হলো এমন একটি ক্লাস যার কোনো নাম থাকে না। এটি তখনই ব্যবহার করা হয় যখন একটি ছোট অবজেক্ট শুধুমাত্র একবারের জন্য প্রয়োজন হয় এবং সেটির জন্য আলাদা ফাইল বা নাম দেওয়ার দরকার নেই।
উত্তর
- Session Hijacking: হ্যাকার ইউজারের সেশন আইডি চুরি করে ইউজারের অ্যাকাউন্টে ঢুকে পড়ে। - Session Fixation: হ্যাকার নিজে একটি সেশন আইডি তৈরি করে ইউজারকে লিঙ্কের মাধ্যমে দেয় এবং ইউজার লগইন করলে সেই আইডিটি হ্যাকারের কাছে আগে থেকেই থাকে।
উত্তর
Variadic functions হলো এমন ফাংশন যা অনির্দিষ্ট সংখ্যক আর্গুমেন্ট গ্রহণ করতে পারে। এটি `...` (splat operator) ব্যবহার করে করা হয়। উদাহরণ: `function sum(...$numbers)`।
উত্তর
Anonymous function হলো নামবিহীন ফাংশন। আর Closure হলো সেই অ্যানোনিমাস ফাংশন যা তার বাইরের স্কোপের ভেরিয়েবলগুলোকে `use` কিওয়ার্ডের মাধ্যমে অ্যাক্সেস করতে পারে।
উত্তর
CSRF হলো এমন একটি অ্যাটাক যেখানে হ্যাকার ইউজারের অজান্তে ইউজারের ব্রাউজার থেকে কোনো রিকোয়েস্ট (যেমন: টাকা পাঠানো বা পাসওয়ার্ড চেঞ্জ) সার্ভারে পাঠায়। এটি রোধ করার জন্য ফর্মে ইউনিক 'CSRF Token' ব্যবহার করা হয়।
উত্তর
এটি PHP 8-এর একটি চমৎকার ফিচার যা দিয়ে ক্লাসের প্রপার্টি ডিক্লারেশন এবং অ্যাসাইনমেন্ট সরাসরি কনস্ট্রাক্টরের ভেতরেই করা যায়। এতে কোড অনেক ছোট এবং ক্লিন হয়।
উত্তর
এটি একটি ডিজাইন প্যাটার্ন যেখানে একটি ক্লাসের প্রয়োজনীয় অবজেক্ট বাইরে থেকে সরবরাহ করা হয়। এটি কোডকে মডুলার করে এবং ইউনিট টেস্টিং করা অনেক সহজ করে তোলে।
উত্তর
যদি অনেকগুলো ক্লাসের মধ্যে কিছু কমন কোড শেয়ার করতে হয়, তবে Abstract Class ব্যবহার করবেন। আর যদি শুধুমাত্র কিছু নির্দিষ্ট নিয়ম (Contract) সেট করতে হয় যা বিভিন্ন ক্লাসে ভিন্নভাবে কাজ করবে, তবে Interface ব্যবহার করবেন।
উত্তর
cURL (Client URL) ব্যবহার করা হয় এক সার্ভার থেকে অন্য সার্ভারে ডাটা রিকোয়েস্ট পাঠানোর জন্য। এটি মূলত থার্ড-পার্টি API থেকে ডাটা আনা বা পাঠানোর জন্য ব্যবহৃত হয়।
উত্তর
ম্যাজিক কনস্ট্যান্টগুলো কোডের অবস্থানের ওপর ভিত্তি করে পরিবর্তিত হয়। - `__LINE__`: বর্তমান লাইনের নম্বর দেয়। - `__FILE__`: ফাইলের ফুল পাথ দেয়। - `__DIR__`: ফাইলের ডিরেক্টরি পাথ দেয়।
উত্তর
এটি চেক করে বামের ভ্যালুটি null কি না। যদি null না হয় তবে সেটিই রিটার্ন করে, অন্যথায় ডানের ভ্যালুটি দেয়। এটি `isset()` চেক করার একটি শর্টকাট।
উত্তর
Trait-এর নিজস্ব কোনো অবজেক্ট তৈরি করা যায় না। এটি শুধুমাত্র কোড রিইউজ করার জন্য ব্যবহৃত হয়। এছাড়া অনেকগুলো ট্রেইট একসাথে ব্যবহার করলে মেথড নেমিং কনফ্লিক্ট হওয়ার সম্ভাবনা থাকে।
উত্তর
Output Buffering হলো এমন একটি টেকনিক যেখানে সার্ভার থেকে জেনারেট হওয়া ডাটা সাথে সাথে ব্রাউজারে না পাঠিয়ে মেমোরিতে (Buffer) জমা করে রাখা হয়। পরে প্রয়োজনমতো একবারে পাঠানো হয়, যা হেডার এরর এড়াতে সাহায্য করে।
উত্তর
Fibers হলো এসিনক্রোনাস (Asynchronous) কোড এক্সিকিউশন সহজ করার একটি মেকানিজম। এটি কোডের এক্সিকিউশন পজ এবং রেজ্যুম করতে সাহায্য করে, যা মূলত হাই-পারফরম্যান্স নেটওয়ার্কিং কাজের জন্য কার্যকর।
উত্তর
এটি নির্দেশ করে যে প্রতিটি ক্লাসের শুধুমাত্র একটি নির্দিষ্ট দায়িত্ব থাকা উচিত। এতে কোড মেইনটেইন করা এবং এরর খুঁজে বের করা অনেক সহজ হয়।
উত্তর
সবসময় `password_hash()` ফাংশন ব্যবহার করে পাসওয়ার্ড হ্যাশ করে ডাটাবেসে সেভ করা উচিত। কখনোই MD5 বা SHA1 ব্যবহার করা উচিত নয় কারণ সেগুলো এখন অনিরাপদ।
উত্তর
Reflection API রানটাইমে কোনো ক্লাসের প্রপার্টি, মেথড বা কনস্ট্রাক্টর সম্পর্কে বিস্তারিত তথ্য জানতে এবং প্রয়োজনে সেগুলোকে পরিবর্তন করতে ব্যবহৃত হয়। এটি মূলত বড় ফ্রেমওয়ার্ক বা লাইব্রেরি তৈরির সময় লাগে।
উত্তর
`declare(strict_types=1);` যোগ করলে PHP টাইপ কনভার্সন বন্ধ করে দেয়। অর্থাৎ ফাংশনে int চাইলে ভুল করে string পাঠালে সেটি অটোমেটিক কনভার্ট না করে এরর দেখাবে।
উত্তর
১. php.ini ফাইলে পরিবর্তন করে। ২. রানটাইমে `ini_set('memory_limit', '512M');` কোডটি ব্যবহার করে। ৩. .htaccess ফাইলের মাধ্যমে।
উত্তর
XSS হলো এমন একটি অ্যাটাক যেখানে হ্যাকার কোনো ফর্মে ম্যালিসিয়াস স্ক্রিপ্ট ইনজেক্ট করে যা ইউজারের ব্রাউজারে রান হয়। এটি রোধ করতে `htmlspecialchars()` ফাংশন দিয়ে আউটপুট স্যানিটাইজ করা উচিত।
উত্তর
যখন আপনি চান না যে আপনার ক্লাসটি অন্য কেউ ইনহেরিট (extend) করুক, তখন ক্লাসের আগে `final` বসানো হয়। এটি মূলত সিকিউরিটি এবং কোডের আর্কিটেকচার ঠিক রাখার জন্য ব্যবহৃত হয়।
উত্তর
এটি SQL কুয়েরিকে ইউজার ইনপুট থেকে আলাদা রাখে। ফলে হ্যাকার যদি ইনপুটে কোনো SQL কোড দেয়, তবে ডাটাবেস সেটি কোড হিসেবে না দেখে শুধুমাত্র একটি স্ট্রিং হিসেবে দেখে। এটি SQL Injection প্রতিরোধের সেরা উপায়।
উত্তর
স্ট্যাটিক মেথডগুলো ইউনিট টেস্টিং করা কঠিন করে তোলে কারণ এগুলো গ্লোবাল স্টেটের মতো আচরণ করে এবং অবজেক্ট ওরিয়েন্টেড ডিজাইন প্রিন্সিপাল (যেমন: Dependency Injection) অনেক সময় বাধাগ্রস্ত করে।
উত্তর
এই ফাইলটি প্রজেক্টের প্রতিটি প্যাকেজের একদম সুনির্দিষ্ট ভার্সনটি লক করে রাখে। এতে নিশ্চিত হওয়া যায় যে টিমের প্রতিটি ডেভেলপার বা সার্ভার একদম একই ভার্সনের প্যাকেজ ব্যবহার করছে।
উত্তর
Service Container হলো একটি টুল যা ক্লাসের ডিপেন্ডেন্সিগুলো ম্যানেজ করে। যখন আমরা কোনো ক্লাসের অবজেক্ট চাই, কন্টেইনার স্বয়ংক্রিয়ভাবে তার প্রয়োজনীয় সব ডিপেন্ডেন্সি ইনজেক্ট করে দেয়। এটি মূলত ইনভারশন অফ কন্ট্রোল (IoC) প্রিন্সিপাল মেনে চলে।
উত্তর
যখন সরাসরি 'new' কিওয়ার্ড ব্যবহার করে অবজেক্ট তৈরি করলে কোড অনেক বেশি ইন্টার-ডিপেন্ডেন্ট হয়ে যায়, তখন Factory Pattern ব্যবহৃত হয়। এটি অবজেক্ট তৈরির লজিককে একটি আলাদা ক্লাসে রাখে, ফলে রান-টাইমে কন্ডিশন অনুযায়ী ভিন্ন ভিন্ন অবজেক্ট তৈরি করা সহজ হয়।
উত্তর
self:: সবসময় সেই ক্লাসকে রেফার করে যেখানে কোডটি লেখা হয়েছে। অন্যদিকে static:: রান-টাইমে চেক করে কোন ক্লাস থেকে মেথডটি কল করা হয়েছে (Late Binding)। ইনহেরিটেন্সের সময় চাইল্ড ক্লাসের ওভাররাইড করা মেথড বা প্রপার্টি পেতে static:: ব্যবহার করা জরুরি।
উত্তর
একটি ক্লাসকে readonly হিসেবে ডিক্লেয়ার করলে তার সব প্রপার্টি অটোমেটিক রিড-অনলি হয়ে যায়। একবার মান সেট করার পর তা আর পরিবর্তন করা যায় না। এটি ইমিউটেবল অবজেক্ট (Data Transfer Objects) তৈরির জন্য অত্যন্ত কার্যকর।
উত্তর
PHP মূলত 'Reference Counting' মেকানিজম ব্যবহার করে। যখন কোনো ভেরিয়েবলের রেফারেন্স শূন্য হয়ে যায়, তখন মেমোরি ফ্রি করে দেওয়া হয়। এছাড়া 'Circular Reference' (যখন দুটি অবজেক্ট একে অপরকে রেফার করে) হ্যান্ডেল করার জন্য আলাদা একটি সাইকেল কালেক্টর অ্যালগরিদম থাকে।
উত্তর
১. এটি ইউনিট টেস্টিং করা কঠিন করে তোলে কারণ এটি গ্লোবাল স্টেট তৈরি করে। ২. এটি ক্লাসের মধ্যে টাইটলি কাপলিং তৈরি করে। ৩. মাল্টি-থ্রেডেড এনভায়রনমেন্টে এটি অনেক সময় রেস কন্ডিশন তৈরি করতে পারে।
উত্তর
সার্ভার থেকে `header('Access-Control-Allow-Origin: *');` বা নির্দিষ্ট ডোমেইন উল্লেখ করে এই সমস্যা সমাধান করা হয়। এটি ব্রাউজারকে অনুমতি দেয় যে অন্য কোনো ডোমেইন থেকে এই সার্ভারের এপিআই কল করা যাবে।
উত্তর
Zend Engine হলো PHP-র হার্ট। এটি PHP সোর্স কোডকে পার্স করে অপকোড (Opcode)-এ রূপান্তর করে এবং সেই অপকোড এক্সিকিউট করে আউটপুট তৈরি করে। PHP 8-এ এতে JIT কম্পাইলার যুক্ত করা হয়েছে।
উত্তর
Attributes হলো কোডের মেটাডাটা যা আগে কমেন্ট হিসেবে (Docblocks) লেখা হতো। এখন এটি নেটিভ সিনট্যাক্স হিসেবে কোডেই লেখা যায়, যা ফ্রেমওয়ার্ক বা লাইব্রেরির জন্য কনফিগারেশন রিড করা অনেক ফাস্ট এবং রিডেবল করে।
উত্তর
OpCache কম্পাইল করা বাইটকোড মেমোরিতে সেভ করে রাখে। ফলে প্রতিবার রিকোয়েস্টে PHP ফাইল নতুন করে পার্স করার প্রয়োজন হয় না। এটি প্রোডাকশন সার্ভারে পারফরম্যান্স কয়েকগুণ বাড়িয়ে দেয়।
উত্তর
রান-টাইমে কোনো ক্লাসের ডিফল্ট মেথড বা বিহেভিয়ার পরিবর্তন করাকে মাঙ্কি প্যাচিং বলে। PHP-তে এটি সরাসরি করা কঠিন হলেও `runkit` বা `uopz` এক্সটেনশন দিয়ে করা যায়, তবে এটি বড় প্রজেক্টের জন্য অত্যন্ত ঝুঁকিপূর্ণ।
উত্তর
এটি ডাটা এনক্রিপশন, ডিক্রিপশন, এবং ডিজিটাল সিগনেচার তৈরির জন্য ব্যবহৃত হয়। সেনসিটিভ ডাটা (যেমন: ক্রেডিট কার্ড ইনফো) ডাটাবেসে সেভ করার আগে এটি দিয়ে এনক্রিপ্ট করা অত্যন্ত জরুরি।
উত্তর
সাধারণ অ্যারে মূলত একটি হ্যাশ ম্যাপ, যা মেমোরি বেশি নেয়। SplFixedArray ফিক্সড সাইজের হয় এবং এটি শুধুমাত্র ইনডেক্স ব্যবহার করে, ফলে বিশাল ডাটা হ্যান্ডেল করার সময় এটি অনেক বেশি ফাস্ট এবং মেমোরি সেভ করে।
উত্তর
যদি দুটি ট্রেইটে একই নামের মেথড থাকে, তবে `insteadof` কিওয়ার্ড ব্যবহার করে একটিকে প্রাধান্য দেওয়া হয়। অথবা `as` কিওয়ার্ড দিয়ে মেথডের নাম পরিবর্তন (Aliasing) করে কনফ্লিক্ট মেটানো যায়।
উত্তর
- Symmetric: একই কি (Key) দিয়ে এনক্রিপ্ট এবং ডিক্রিপ্ট করা হয় (যেমন: AES)। - Asymmetric: দুটি আলাদা কি থাকে—Public Key (এনক্রিপ্টের জন্য) এবং Private Key (ডিক্রিপ্টের জন্য, যেমন: RSA)।
উত্তর
এটি দিয়ে একটি Closure বা অ্যানোনিমাস ফাংশনকে অন্য একটি অবজেক্টের স্কোপের সাথে যুক্ত করা যায়। ফলে ফাংশনটি সেই অবজেক্টের প্রাইভেট প্রপার্টিগুলোও অ্যাক্সেস করতে পারে।
উত্তর
আগে কোনো স্ট্রিং ভ্যালিড JSON কি না তা চেক করতে `json_decode` করতে হতো যা অনেক মেমোরি নিত। `json_validate()` কোনো মেমোরি খরচ না করে শুধুমাত্র সিনট্যাক্স চেক করে জানায় স্ট্রিংটি ভ্যালিড কি না।
উত্তর
WeakMap এমন একটি ম্যাপ যেখানে অবজেক্টকে 'কি' (Key) হিসেবে রাখা যায়। যদি সেই অবজেক্টের অন্য কোনো রেফারেন্স না থাকে, তবে গারবেজ কালেক্টর তাকে মেমোরি থেকে মুছে ফেলে, যা মেমোরি লিক রোধে সাহায্য করে।
উত্তর
Middleware হলো একটি লেয়ার যা রিকোয়েস্ট সার্ভারে পৌঁছানোর আগে বা রেসপন্স যাওয়ার পরে কোনো কাজ সম্পন্ন করে। যেমন: ইউজার লগইন করা আছে কি না তা চেক করা (Authentication)।
উত্তর
এটি প্রসেস কন্ট্রোল করার জন্য ব্যবহৃত হয়। এর মাধ্যমে মাল্টি-প্রসেসিং বা একটি প্রসেস থেকে চাইল্ড প্রসেস (Forking) তৈরি করা যায়, যা মূলত CLI টুলস বা লং-রানিং স্ক্রিপ্টের জন্য কার্যকর।
উত্তর
যখন কোনো অবজেক্টের এমন কোনো প্রপার্টি অ্যাক্সেস বা সেট করার চেষ্টা করা হয় যা ডিফাইন করা নেই বা প্রাইভেট, তখন স্বয়ংক্রিয়ভাবে এই মেথডগুলো কল হয়। এটি ডাইনামিক প্রপার্টি হ্যান্ডেল করতে সাহায্য করে।
উত্তর
- Active Record: একটি মডেল অবজেক্ট সরাসরি ডাটাবেস টেবিলের একটি রো রিপ্রেজেন্ট করে (যেমন: Laravel Eloquent)। - Data Mapper: মডেল এবং ডাটাবেস সম্পূর্ণ আলাদা থাকে, একটি ম্যাপার লেয়ার তাদের মধ্যে সমন্বয় করে (যেমন: Doctrine)।
উত্তর
FPM (FastCGI Process Manager) হলো একটি পিএইচপি ইমপ্লিমেন্টেশন যা হাই-ট্রাফিক ওয়েবসাইটের জন্য ডিজাইন করা হয়েছে। এটি অনেকগুলো পিএইচপি প্রসেস একসাথে ম্যানেজ করে সার্ভার পারফরম্যান্স বহুগুণ বাড়িয়ে দেয়।
উত্তর
ইমিউটেবল অবজেক্টের স্টেট একবার সেট করলে আর পরিবর্তন করা যায় না। PHP-তে `readonly` প্রপার্টি বা ক্লাসের মাধ্যমে এটি করা যায়। এটি কোডকে থ্রেড-সেফ এবং প্রেডিক্টেবল রাখে।
উত্তর
- Union Types (int|string): যেকোনো একটি টাইপ হতে পারে। - Intersection Types (Iterator&Countable): ভ্যালুটিকে একই সাথে সবকয়টি টাইপ বা ইন্টারফেসের বৈশিষ্ট্য ধারণ করতে হবে।
উত্তর
একাধিক ট্যাব বা উইন্ডোতে কাজ করার সময় সেশন ডাটা ওভাররাইট হওয়া ঠেকাতে `session_start(['read_and_close' => true])` ব্যবহার করা যায় অথবা লকিং মেকানিজম ফলো করা হয়।
উত্তর
এটি নিশ্চিত করে যে আপনার লোকাল পিসি, টেস্টিং এনভায়রনমেন্ট এবং প্রোডাকশন সার্ভার—সবখানে পিএইচপি এবং তার ডিপেন্ডেন্সিগুলোর ভার্সন একদম একই থাকবে। এতে 'It works on my machine' সমস্যা দূর হয়।
উত্তর
এটি ফাংশনে আর্গুমেন্ট পাঠানোর সময় প্যারামিটারের নাম উল্লেখ করার সুযোগ দেয়। ফলে প্যারামিটারের অর্ডারের ওপর নির্ভর করতে হয় না এবং অপশনাল প্যারামিটারগুলো স্কিপ করা সহজ হয়।
উত্তর
মাইগ্রেশন হলো ডাটাবেসের ভার্সন কন্ট্রোল। এটি টিমের প্রতিটি ডেভেলপারকে একই ডাটাবেস স্ট্রাকচার বজায় রাখতে সাহায্য করে এবং প্রোডাকশন সার্ভারে কোনো ম্যানুয়াল কুয়েরি ছাড়াই স্ট্রাকচার আপডেট করার সুযোগ দেয়।
উত্তর
এটি এমন একটি ডিজাইন যেখানে একটি বড় অ্যাপ্লিকেশনকে ছোট ছোট স্বাধীন সার্ভিসে ভাগ করা হয়। প্রতিটি সার্ভিস নির্দিষ্ট কাজ করে এবং এপিআই-এর মাধ্যমে একে অপরের সাথে কথা বলে। এটি স্কেলিং করা অনেক সহজ করে।
উত্তর
এর ফলে রিটার্ন টাইপ আরও সুনির্দিষ্ট করা যায়। যেমন: একটি ফাংশন যদি শুধুমাত্র false রিটার্ন করে তবে আপনি `function action(): false` লিখতে পারেন, যা কোড রিডাবিলিটি বাড়ায়।
উত্তর
রেফারেন্স ব্যবহার করলে কোড অনেক সময় আনপ্রেডিক্টেবল হয়ে যায় এবং এটি গারবেজ কালেকশন প্রসেসকে কিছুটা স্লো করতে পারে। মডার্ন পিএইচপি-তে মেমোরি ম্যানেজমেন্ট এমনিতেই ভালো, তাই খুব প্রয়োজন না হলে রেফারেন্স এড়িয়ে চলা উচিত।
উত্তর
এটি ডাটাবেস লজিক এবং বিজনেস লজিকের মধ্যে একটি লেয়ার হিসেবে কাজ করে। এর ফলে আপনি যদি ভবিষ্যতে ডাটাবেস পরিবর্তন করেন (যেমন: MySQL থেকে MongoDB), তবে বিজনেস লজিকে কোনো পরিবর্তন করতে হয় না।
উত্তর
এটি একটি ভেরিয়েবলের ভ্যালুকে অন্য একটি ভেরিয়েবলের নাম হিসেবে ব্যবহার করতে দেয়। এটি কোডকে খুব ডাইনামিক বানালেও এটি সিকিউরিটি রিস্ক তৈরি করে এবং কোড ডিব্যাগ করা প্রায় অসম্ভব করে তোলে।
উত্তর
`composer dump-autoload -o` বা `--optimize` কমান্ডটি ব্যবহৃত হয়। এটি সব ক্লাসের একটি ম্যাপ তৈরি করে ফাইল লোডিং স্পিড অনেক বাড়িয়ে দেয়।
উত্তর
কখনোই ইউজার থেকে আসা ডাটা সরাসরি `unserialize()` করা উচিত নয়। এর বদলে JSON ফরম্যাট ব্যবহার করা এবং ডাটা ভ্যালিডেট করা অনেক বেশি নিরাপদ।
উত্তর
আগে ক্লাসের উপরে প্রপার্টি ডিক্লেয়ার করে আবার কনস্ট্রাক্টরের ভেতরে অ্যাসাইন করতে হতো। এখন কনস্ট্রাক্টরের প্যারামিটারেই `public/private` কিওয়ার্ড দিয়ে সরাসরি প্রপার্টি ডিক্লেয়ার এবং অ্যাসাইন করা যায়।
উত্তর
এটি বলে যে একটি প্যারেন্ট ক্লাসের অবজেক্টকে তার চাইল্ড ক্লাসের অবজেক্ট দিয়ে রিপ্লেস করলেও অ্যাপ্লিকেশনের লজিক বা বিহেভিয়্যারে কোনো এরর হওয়া উচিত নয়।
উত্তর
PHP অটোমেটিক্যালি একটি ডাটা টাইপকে অন্য টাইপে রূপান্তর করে (যেমন: '5' + 10 = 15)। একেই টাইপ জাগলিং বলে। এটি কোডকে ফ্লেক্সিবল করলেও অনেক সময় লজিক্যাল এরর তৈরি করে।
উত্তর
ORM ডেভেলপারকে SQL কুয়েরি না লিখে সরাসরি পিএইচপি অবজেক্ট ও মেথডের মাধ্যমে ডাটাবেস অপারেশন করার সুযোগ দেয়। এটি ডেভেলপমেন্ট ফাস্ট করে এবং কোড অনেক ক্লিন রাখে।