DEV Community

Ruhul Amin Sujon
Ruhul Amin Sujon

Posted on

PHP IQ - Part 01

প্রশ্ন ১ঃ php তে method overloading & method overriding কী এবং এটি কেন ব্যবহার করা হয়?

Answer:

🔹 Method Overloading:

সংজ্ঞা:

PHP-তে traditional sense-এ method overloading নেই, কারণ PHP statically typed language নয়। তবে, Magic Method (যেমন __call(), __get(), __set()) ব্যবহার করে method overloading-এর মতো আচরণ করা যায়।

কাজ:
যখন কোনও class-এ এমন কোনও method call করা হয় যা ডিফাইন করা নেই, তখন __call() method trigger হয়।

উদাহরণ:

class OverloadExample {
    public function __call($name, $arguments) {
        echo "Calling method '$name' with arguments: " . implode(', ', $arguments);
    }
}

$obj = new OverloadExample();
$obj->show("Hello", "World"); // show method নেই, তাই __call trigger হবে
Enter fullscreen mode Exit fullscreen mode

কেন ব্যবহার করা হয়:

  • Dynamic method handling-এর জন্য
  • Flexible interface design করার জন্য
  • Optional বা variable number of method support করার জন্য

🔹 Method Overriding:

সংজ্ঞা:
Method overriding হচ্ছে parent class-এর একটি method কে child class-এ same name, parameters সহ আবার define করা, যাতে child class-এর method override করে parent-এরটি।

উদাহরণ:

class ParentClass {
    public function greet() {
        echo "Hello from Parent";
    }
}

class ChildClass extends ParentClass {
    public function greet() {
        echo "Hello from Child";
    }
}

$obj = new ChildClass();
$obj->greet(); // Output: Hello from Child
Enter fullscreen mode Exit fullscreen mode

কেন ব্যবহার করা হয়:

  • Inheritance structure-এ subclass গুলোকে তাদের নিজস্ব behavior define করতে দেওয়া হয়
  • Polymorphism achieve করার জন্য
  • Code reuse এবং customization সহজ করতে

প্রশ্ন 2: php তে trait কী এবং এটি কেন ব্যবহার করা হয়?

Answer:

🔹 Trait কী?

Trait হলো PHP-এর একটি code reuse mechanism যা multiple classes-এ common functionality share করার জন্য ব্যবহৃত হয়। এটি multiple inheritance এর সীমাবদ্ধতা কাটিয়ে ওঠার জন্য তৈরি করা হয়েছে।

PHP-তে একাধিক class inherit করা যায় না (single inheritance supported), কিন্তু একাধিক trait ব্যবহার করে সেই সমস্যা সমাধান করা যায়।


🔹 Trait এর Basic Syntax:

trait Logger {
    public function log($message) {
        echo "Log: " . $message;
    }
}

class User {
    use Logger;
}

$obj = new User();
$obj->log("User created."); // Output: Log: User created.
Enter fullscreen mode Exit fullscreen mode

🔹 কেন Trait ব্যবহার করা হয়?
1.Code Reuse:
একই function অনেকগুলো class-এ লাগলে বারবার না লিখে trait এ একবার লিখে use করা যায়।
2.Multiple Trait Support:
একাধিক trait একসাথে use করা যায় (যা multiple inheritance-এর বিকল্প)।
3.Clean Architecture:
Trait ব্যবহার করে code-organizing structure অনেক পরিষ্কার রাখা যায়।
4.Avoid Duplication:
DRY (Don't Repeat Yourself) principle বজায় রাখতে সাহায্য করে।


🔹 একাধিক Trait ব্যবহার:

trait Logger {
    public function log($msg) {
        echo "Logging: $msg\n";
    }
}

trait Notifier {
    public function notify($msg) {
        echo "Notifying: $msg\n";
    }
}

class Admin {
    use Logger, Notifier;
}

$a = new Admin();
$a->log("Admin logged in");
$a->notify("New user registered");
Enter fullscreen mode Exit fullscreen mode

🔹 যখন একই method নাম থাকে:

trait A {
    public function hello() {
        echo "Hello from A";
    }
}

trait B {
    public function hello() {
        echo "Hello from B";
    }
}

class MyClass {
    use A, B {
        B::hello insteadof A; // B এর method override করবে A কে
        A::hello as helloFromA; // A এর method alias হিসেবে থাকবে
    }
}
Enter fullscreen mode Exit fullscreen mode

🔚 উপসংহার:

প্রশ্ন ৩ঃ Method Overriding & Method Overloading কী এবং এটি কেন ব্যবহার করা হয়?

Answer:

🔹 Method Overriding:
📌 সংজ্ঞা:

Method Overriding হলো Parent class-এর method কে Child class-এ একই নামে (same signature) আবার define করা, যাতে child class নিজের মতো করে behavior change করতে পারে।

💻 উদাহরণ:

class Animal {
    public function sound() {
        echo "Animal makes sound";
    }
}

class Dog extends Animal {
    public function sound() {
        echo "Dog barks";
    }
}

$obj = new Dog();
$obj->sound(); // Output: Dog barks
Enter fullscreen mode Exit fullscreen mode

🎯 কেন ব্যবহার করা হয়:

  • Parent behavior modify/customize করতে
  • Runtime Polymorphism implement করতে
  • Clean & flexible OOP design করার জন্য

🔹 Method Overloading:
📌 সংজ্ঞা:

Method Overloading বলতে বুঝায় একই method name কিন্তু different parameters দিয়ে multiple method তৈরি করা।

👉 তবে PHP-তে traditional overloading নেই, তাই Magic Method (__call) দিয়ে simulate করা হয়।

💻 উদাহরণ:

class MathOperation {
    public function __call($name, $arguments) {
        if ($name == 'add') {
            return array_sum($arguments);
        }
    }
}

$obj = new MathOperation();
echo $obj->add(2, 3);        // 5
echo $obj->add(2, 3, 4);     // 9
Enter fullscreen mode Exit fullscreen mode

🎯 কেন ব্যবহার করা হয়:

  • Flexible function call handle করতে
  • Variable number of arguments support করতে
  • Dynamic behavior implement করতে 🔥 মূল পার্থক্য (Interview Ready):


🔚 Short Professional Answer (Interview):

👉
Method Overriding হলো inheritance-এ parent class-এর method কে child class-এ redefine করে behavior change করা।
আর Method Overloading হলো একই method name ব্যবহার করে different parameters handle করা, যা PHP-তে magic method (__call) দিয়ে achieve করা হয়।

👉 এগুলো ব্যবহার করা হয় polymorphism, code reusability, এবং flexible design implement করার জন্য।

প্রশ্ন ৪ঃ PHP-তে OOP (Object-Oriented Programming) এর principles গুলো ব্যাখ্যা করো

PHP-তে OOP মূলত ৪টি প্রধান principle এর উপর ভিত্তি করে:


🔹 ১. Encapsulation (এনক্যাপসুলেশন)
📌 সংজ্ঞা:

Data (properties) এবং method (functions) কে একসাথে একটি class-এর মধ্যে রাখা এবং access control (public, private, protected) ব্যবহার করে data hide করা।

💻 উদাহরণ:

class User {
    private $name;

    public function setName($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}
Enter fullscreen mode Exit fullscreen mode

🎯 কেন ব্যবহার করা হয়:

  • Data নিরাপদ রাখতে
  • Controlled access দিতে
  • Code maintainability বাড়াতে

🔹 ২. Inheritance (ইনহেরিটেন্স)
📌 সংজ্ঞা:

একটি class (child) অন্য একটি class (parent) এর properties ও methods inherit করে।

💻 উদাহরণ:

class Animal {
    public function eat() {
        echo "Eating...";
    }
}

class Dog extends Animal {
    public function bark() {
        echo "Barking...";
    }
}
Enter fullscreen mode Exit fullscreen mode

🎯 কেন ব্যবহার করা হয়:

  • Code reuse করার জন্য
  • Hierarchical relationship তৈরি করতে
  • Duplicate code কমাতে

🔹 ৩. Polymorphism (পলিমরফিজম)
📌 সংজ্ঞা:

একই method নাম, কিন্তু ভিন্ন ভিন্ন behavior (different implementation) — সাধারণত method overriding এর মাধ্যমে হয়।

💻 উদাহরণ:

class Shape {
    public function draw() {
        echo "Drawing shape";
    }
}

class Circle extends Shape {
    public function draw() {
        echo "Drawing circle";
    }
}
Enter fullscreen mode Exit fullscreen mode

🎯 কেন ব্যবহার করা হয়:

  • Flexible ও scalable code design করতে
  • Same interface দিয়ে different কাজ করতে

🔹 ৪. Abstraction (অ্যাবস্ট্রাকশন)
📌 সংজ্ঞা:

শুধু প্রয়োজনীয় তথ্য দেখানো এবং implementation details hide করা — সাধারণত abstract class বা interface দিয়ে করা হয়।

💻 উদাহরণ:

abstract class Vehicle {
    abstract public function start();
}

class Car extends Vehicle {
    public function start() {
        echo "Car starting...";
    }
}
Enter fullscreen mode Exit fullscreen mode

🎯 কেন ব্যবহার করা হয়:

  • Complex system simplify করতে
  • Standard structure enforce করতে
  • Loose coupling তৈরি করতে 🔥 সংক্ষেপে (Interview Table):


🎯 Short Professional Answer (Interview):

👉
PHP OOP-এর ৪টি মূল principle হলো Encapsulation, Inheritance, Polymorphism, এবং Abstraction।
Encapsulation data hide করে, Inheritance code reuse করে, Polymorphism একই method দিয়ে ভিন্ন behavior দেয়, এবং Abstraction complex logic hide করে simple interface দেয়।

প্রশ্ন ৫ঃ PHP-তে Abstract, Interface, Trait, Namespace কী, কেন ও কোথায় ব্যবহার করা হয়? (উদাহরণসহ)

Answer:

🔹 ১. Abstract Class
📌 কী:

Abstract class হলো এমন একটি class যেটি directly object create করা যায় না, বরং অন্য class এটিকে extend করে ব্যবহার করে। এতে abstract (body ছাড়া) এবং normal method দুটোই থাকতে পারে।

💻 উদাহরণ:

abstract class Animal {
    abstract public function sound();

    public function eat() {
        echo "Eating...";
    }
}

class Dog extends Animal {
    public function sound() {
        echo "Dog barks";
    }
}
Enter fullscreen mode Exit fullscreen mode

🎯 কেন ও কোথায় ব্যবহার:

  • Common base structure define করতে
  • Partial implementation দিতে
  • যখন কিছু method অবশ্যই child class-এ implement করতে হবে

🔹 ২. Interface
📌 কী:

Interface হলো একটি contract, যেখানে শুধু method declaration থাকে (body থাকে না)। Class-কে বাধ্য করে সব method implement করতে।

💻 উদাহরণ:

interface Payment {
    public function pay($amount);
}

class BkashPayment implements Payment {
    public function pay($amount) {
        echo "Paid via bKash: $amount";
    }
}
Enter fullscreen mode Exit fullscreen mode

🎯 কেন ও কোথায় ব্যবহার:

  • Standard structure enforce করতে
  • Multiple interface implement করা যায়
  • Loose coupling ও scalable architecture-এ

🔹 ৩. Trait
📌 কী:

Trait হলো code reuse mechanism, যা multiple class-এ common method share করতে ব্যবহৃত হয়।

💻 উদাহরণ:

trait Logger {
    public function log($msg) {
        echo "Log: $msg";
    }
}

class User {
    use Logger;
}
Enter fullscreen mode Exit fullscreen mode

🎯 কেন ও কোথায় ব্যবহার:

  • Duplicate code avoid করতে
  • Multiple inheritance limitation কাটাতে
  • Helper/common functionality share করতে

🔹 ৪. Namespace
📌 কী:

Namespace হলো code organize করার একটি উপায়, যাতে same class name conflict এড়ানো যায়।

💻 উদাহরণ:

namespace App\Models;

class User {
    public function info() {
        echo "User Model";
    }
}
Enter fullscreen mode Exit fullscreen mode

ব্যবহার:

use App\Models\User;

$obj = new User();
Enter fullscreen mode Exit fullscreen mode

🎯 কেন ও কোথায় ব্যবহার:

  • Large project-এ code organize করতে
  • Class name conflict avoid করতে
  • PSR standard maintain করতে (Laravel-এ খুব গুরুত্বপূর্ণ)

🔥 সংক্ষেপে পার্থক্য:

🎯 Short Professional Answer (Interview):

👉
Abstract class base structure দেয়,
Interface contract enforce করে,
Trait code reuse করে,
আর Namespace code organize করে এবং naming conflict এড়ায়।

👉 এগুলো ব্যবহার করা হয় clean, scalable, maintainable architecture তৈরি করার জন্য।

Explain with a real Laravel project example (Repository pattern, Service layer, etc.)

🚀 Real Laravel Example (Repository + Service Pattern)

ধরি আমরা একটি User Management System বানাচ্ছি।

📁 Project Structure

app/
 ├── Interfaces/
 │    └── UserRepositoryInterface.php
 ├── Repositories/
 │    └── UserRepository.php
 ├── Services/
 │    └── UserService.php
 ├── Traits/
 │    └── ApiResponseTrait.php
 ├── Models/
 │    └── User.php
 └── Http/Controllers/
      └── UserController.php
Enter fullscreen mode Exit fullscreen mode

🔹 ১. Interface (Contract define)

👉 app/Interfaces/UserRepositoryInterface.php

namespace App\Interfaces;

interface UserRepositoryInterface {
    public function getAll();
    public function findById($id);
    public function create(array $data);
}
Enter fullscreen mode Exit fullscreen mode

🎯 কেন:

  • সব repository একই structure follow করবে
  • Loose coupling (Controller → Interface, not concrete class)

🔹 ২. Repository (Implementation)

👉 app/Repositories/UserRepository.php

namespace App\Repositories;

use App\Interfaces\UserRepositoryInterface;
use App\Models\User;

class UserRepository implements UserRepositoryInterface {

    public function getAll() {
        return User::all();
    }

    public function findById($id) {
        return User::findOrFail($id);
    }

    public function create(array $data) {
        return User::create($data);
    }
}
Enter fullscreen mode Exit fullscreen mode

🎯 কেন:

  • Database logic আলাদা রাখা
  • Easily switch করা যায় (MySQL → API → অন্য source)

🔹 ৩. Service Layer (Business Logic)

👉 app/Services/UserService.php

namespace App\Services;

use App\Interfaces\UserRepositoryInterface;

class UserService {

    protected $userRepo;

    public function __construct(UserRepositoryInterface $userRepo) {
        $this->userRepo = $userRepo;
    }

    public function getUsers() {
        return $this->userRepo->getAll();
    }

    public function createUser($data) {
        // business logic
        $data['name'] = strtoupper($data['name']);
        return $this->userRepo->create($data);
    }
}
Enter fullscreen mode Exit fullscreen mode

🎯 কেন:

  • Business logic isolate করা
  • Controller slim রাখা

🔹 ৪. Trait (Reusable Logic)

👉 app/Traits/ApiResponseTrait.php

namespace App\Traits;

trait ApiResponseTrait {

    public function success($data, $message = "Success") {
        return response()->json([
            'status' => true,
            'message' => $message,
            'data' => $data
        ]);
    }
}
Enter fullscreen mode Exit fullscreen mode

🎯 কেন:

  • বারবার response format না লিখে reuse করা

🔹 ৫. Controller (সব একসাথে ব্যবহার)

👉 app/Http/Controllers/UserController.php

namespace App\Http\Controllers;

use App\Services\UserService;
use App\Traits\ApiResponseTrait;

class UserController extends Controller {

    use ApiResponseTrait;

    protected $userService;

    public function __construct(UserService $userService) {
        $this->userService = $userService;
    }

    public function index() {
        $users = $this->userService->getUsers();
        return $this->success($users);
    }
}
Enter fullscreen mode Exit fullscreen mode

🔹 ৬. Service Container Binding

👉 AppServiceProvider.php

use App\Interfaces\UserRepositoryInterface;
use App\Repositories\UserRepository;

public function register() {
    $this->app->bind(UserRepositoryInterface::class, UserRepository::class);
}
Enter fullscreen mode Exit fullscreen mode

🔥 এখানে কোথায় কী ব্যবহার হলো?

🎯 Interview Ready Explanation:

👉
“In Laravel project, I use Interface + Repository pattern to decouple database logic, Service layer for business logic, Trait for reusable functionalities like API response, and Namespace to organize code properly. This makes the application scalable, testable, and maintainable.”

💡 যদি তুমি এটা interview-তে এভাবে explain করো + structure draw করো, তুমি easily standout করবে 🔥

প্রশ্ন 6: What is reqire & include in php?

Answer:

PHP-তে require এবং include হলো এমন দুইটি স্টেটমেন্ট, যেগুলো দিয়ে এক ফাইলের কোড অন্য ফাইলে ব্যবহার করা হয়।


1️⃣ include কী?

include দিয়ে কোনো PHP ফাইল যুক্ত (add) করা হয়।
যদি ফাইলটি না পাওয়া যায়, তাহলে warning দেখায়, কিন্তু স্ক্রিপ্ট চালু থাকে।

উদাহরণ:

include "header.php";
Enter fullscreen mode Exit fullscreen mode

বৈশিষ্ট্য:

  • ফাইল না থাকলে → Warning দেখাবে
  • বাকি কোড এক্সিকিউট হবে
  • কম গুরুত্বপূর্ণ ফাইলের জন্য ব্যবহার করা হয়

2️⃣ require কী?

require দিয়েও ফাইল যুক্ত করা হয়।
কিন্তু ফাইল না পাওয়া গেলে fatal error দেখায় এবং স্ক্রিপ্ট বন্ধ হয়ে যায়।

উদাহরণ:

require "config.php";
Enter fullscreen mode Exit fullscreen mode

বৈশিষ্ট্য:

  • ফাইল না থাকলে → Fatal Error
  • পুরো স্ক্রিপ্ট বন্ধ হয়ে যায়
  • খুব গুরুত্বপূর্ণ ফাইলের জন্য ব্যবহার করা হয়

🔑 include vs require পার্থক্য

3️⃣ include_once ও require_once

একই ফাইল বারবার লোড হওয়া থেকে বাঁচাতে ব্যবহার করা হয়।

include_once "header.php";
require_once "config.php";
Enter fullscreen mode Exit fullscreen mode

✔ ফাইল একবারই লোড হবে
✔ function / class redeclare error এড়ানো যায়


📌 কখন কোনটা ব্যবহার করবেন?

  • Database config / security filerequire / require_once
  • Header, footer, templateinclude / include_once

Top comments (0)