পিএইচপি এসকিউএল ওয়ার্ডপ্রেস জাভাস্ক্রিপ্ট জেকুয়েরি এইচটিএমএল
ফোরাম
×

পিএইচপি টিউটোরিয়াল

হোম-HOME পরিচিতি-Introduction ইনস্টল-Install গঠনপ্রনালী-Syntax চলক-Variable পিএইচপি Echo / Print তথ্যের ধরণ-Data Types কনস্ট্যান্ট-Constant অপারেটর-Operator ফাংশন-Function সুপারগ্লোভাল-Superglobal

কন্ট্রোল স্টেটমেন্ট

if স্টেটমেন্ট if...Else স্টেটমেন্ট Switch স্টেটমেন্ট While লুপ DO...While লুপ For লুপ

পিএইচপি এ্যারে এবং স্ট্রিং

এ্যারে-Array এ্যারে সর্টিং -Array Sorting মাল্টি এ্যারে-Multi Array স্ট্রিং-String

পিএইচপি এডভান্স

তারিখ এবং সময় পিএইচপি include ফাইল হ্যান্ডলিং-File Handling ফাইল খোলা/পড়া ফাইল তৈরি/লিখা ফাইল আপলোড ফাইল ডাউনলোড কুকি-Cookie সেশন-Session ফিল্টার-Filter এডভান্স ফিল্টার-Advance Filter এঁরর হ্যান্ডলিং-Error Handling এক্সেপশন হ্যান্ডেলিং-Exception Handling

পিএইচপি ফরম

ফরম হ্যান্ডলিং ফরম ভ্যালিডেশন আবশ্যক ফরম ফিল্ড ফরম URL/E-mail সম্পূর্ণ ফরম

MySQL ডেটাবেজ

MySQL ডেটাবেজ MySQL ডেটাবেজ সংযোগ MySQL ডেটাবেজ তৈরী MySQL টেবিল তৈরী MySQL তথ্য ইনসার্ট MySQL শেষ আইডি পান MySQL একাধিক তথ্য ইনসার্ট MySQL প্রিপেয়ার্ড স্টেটমেন্ট MySQL তথ্য সিলেক্ট MySQL তথ্য ডিলিট MySQL তথ্য আপডেট MySQL সীমিত তথ্য সিলেক্ট

পিএইচপি- এক্সএমএল

PHP XML Parser PHP SimpleXML Parser PHP XML Parser PHP SimpleXML - Get PHP XML Expat PHP XML Dom

পিএইচপি - এজাক্স

পিএইচপি AJAX পরিচিতি AJAX পিএইচপি AJAX ডেটাবেজ AJAX এক্সএমএল AJAX সারাসরি সার্চ AJAX RSS রির্ডার AJAX Poll

পিএইচপি অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং(OOP)

OOP পরিচিতি OOP class তৈরী OOP objects তৈরী OOP $this কিওয়ার্ড OOP মেথড এবং প্রোপার্টি চেইনিং OOP অ্যাক্সেস মোডিফায়ার OOP ম্যাজিক মেথড এবং কন্সটেন্ট OOP ইনহেরিটেন্স OOP Abstract class এবং method OOP ইন্টারফেস OOP পলিমরফিজম OOP টাইপ হিন্টিং() OOP টাইপ হিন্টিনং ইন্টারফেস OOP স্ট্যাটিক মেথোড এবং প্রোপার্টি

 

পিএইচপি ইনহেরিটেন্স

অবজেক্ট অরিয়েন্টেড পিএইচপির আরো একটি বড় সুবিধা হলো কোড ইনহেরিটেন্স(inheritance)। অর্থাৎ একটি ক্লাস তার উত্তরাধিকার বা চাইল্ড ক্লাস এর সাথে কোড ডুপ্লিকেশনের ক্ষমতা রাখে।

উদাহরণস্বরূপঃ সন্তান যেমন পিতা-মাতার সম্পত্তির মালিক হয়। আরো সহজ করে বললেঃ সন্তান যেমন পিতা-মাতার সম্পত্তি ব্যবহার করতে পারে ঠিক তেমনি একটি চাইল্ড ক্লাস তার প্যারেন্ট ক্লাসের সকল প্রোপার্টি এবং মেথড সমুহকে অ্যাক্সেস করতে পারে। এক্ষেত্রে আমরা প্যারেন্ট ক্লাসে কোড গুলো একবার লিখে চাইল্ড ক্লাস থেকে যতবার ইচ্ছা ব্যবহার করতে পারি। এটি প্রোগ্রামের মডুলারিটি(modularity) অনেক বাড়িয়ে দেয়।


চাইল্ড ক্লাস তৈরি

আমরা কোনো কোড প্যারেন্ট ক্লাসে একবার লিখে ইনহেরিটেন্স(inheritance) ব্যবহার করে ঐ কোডকে প্যারেন্ট এবং চাইল্ড উভই ক্লাস থেকেই ব্যবহার করতে পারবো।

একটি প্যারেন্ট ক্লাসের চাইল্ড ক্লাস তৈরি করার জন্য extends কীওয়ার্ড ব্যবহার করা হয়।

চাইল্ড ক্লাস তৈরির সিনট্যাক্স

নিম্নে চাইল্ড ক্লাস তৈরির সিনট্যাক্স দেখানো হলোঃ

<?php
 class Parent{
    // Parent ক্লাসের কোড গুলো এখানে থাকবে।
 }

 class Child extends Parent{
    // Parent ক্লাসের কোড গুলো এখান থেকে ব্যবহার করা যাবে।
 }
?>

একটি চাইল্ড ক্লাস তার প্যারেন্ট ক্লাসের সকল non-private মেথড এবং প্রোপার্টিসমূহ অ্যাক্সেস করতে পারে।

উদাহরণ
<?php
 class Greeting{

   private $name;
   public function __construct($name){
      $this->name = $name;
    	  }
   public function getHello(){
   	echo "Hello ". $this->name . ".";
   }
 }
 // প্যারেন্ট ক্লাসের চাইল্ড ক্লাস তৈরি
 class Hello extends Greeting{
	 // Greeting ক্লাসের কোড গুলো এখান থেকে ব্যবহার করা যাবে
 }

 $hello = new Hello("Tamjid");
 $hello->getHello();

?>

ফলাফল
Hello Tamjid.

উদাহরণের ব্যাখ্যা

  • উপরের উদাহরণে প্রথমে Greeting ক্লাস তৈরি করা হয়েছে।
  • Greeting ক্লাস এর একটি চাইল্ড ক্লাস Hello তৈরি করা হয়েছে।
  • Hello ক্লাস এর একটি অব্জেক্ট hello তৈরি করা হয়েছে।
    বিঃদ্রঃ Greeting ক্লাসের private ব্যাতিত সকল মেথড এবং প্রোপার্টিসমূহ Hello ক্লাসের মাধ্যমে ব্যবহার করা যাবে। __construct() এবং getHello() মেথড এর স্কোপ পাবলিক হওয়ায় প্যারেন্ট ক্লাসে থাকা সত্ত্বেও প্যারেন্ট এবং চাইল্ড উভয় ক্লাস থেকেই অ্যাক্সেস করা যাবে।

  • চাইল্ড ক্লাসের নিজস্ব প্রোপার্টি এবং মেথড

    একটি চাইল্ড ক্লাস যে শুধুমাত্র প্যারেন্ট ক্লাসের প্রোপার্টি এবং মেথড ব্যবহার করে তা নয়। বরং একটি চাইল্ড ক্লাসেরও কিছু নিজস্ব প্রোপার্টি এবং মেথড থাকতে পারে। একটি চাইল্ড ক্লাস প্যারেন্ট ক্লাসের সকল প্রোপার্টি এবং মেথড ব্যবহার করতে পারলেও প্যারেন্ট ক্লাস কখনোই চাইল্ড ক্লাসের প্রোপার্টি এবং মেথড ব্যবহার করতে পারে না।

    নিম্নের উদাহরণে আমরা চাইল্ড ক্লাসের মধ্যে একটি প্রোপার্টি এবং একটি মেথড ডিফাইন করবোঃ

    উদাহরণ
    <?php
     class Greeting{
    
       private $name;
       public function __construct($name){
          $this->name = $name;
        	  }
       public function getHello(){
       	echo "Hello ". $this->name . ". ";
       }
     }
    
     class Hello extends Greeting{
    	 private $message = "How's your day!";
    
    	 public function welcomeMsg(){
    		 echo $this->getHello() . $this->message;
    	 }
     }
    
     $hello = new Hello("Tamjid");
     $hello->welcomeMsg();
    
    ?>

    ফলাফল
    Hello Tamjid. How's your day!

    protected অ্যাক্সেস মডিফায়ার

    আমরা যেকোনো প্রোপার্টি অথবা মেথডকে protected ঘোষনা করতে পারি। এই পদ্ধতি অবলম্বন করে আমরা প্যারেন্ট ক্লাসের প্রোপার্টি এবং মেথডসমূহকে প্যারেন্ট এবং চাইল্ড উভয় ক্লাস থেকেই অ্যাক্সেস করতে পারি।

    পূর্ববর্তী অধ্যায়ে আমরা দেখেছিলাম, public কীওয়ার্ড ব্যবহার করে কিভাবে প্রোপার্টি এবং মেথড সমুহকে ক্লাসের ভিতরে এবং বাইরে থেকে অ্যাক্সেস করা যায় এবং private কীওয়ার্ড ব্যবহার করে কিভাবে ক্লাসের অভন্তরেই প্রোপার্টি এবং মেথডসমুহকে অ্যাক্সেস করতে হয়।

    এই টিউটোরিয়ালে আমরা তৃতীয় একটি মডিফায়ার অর্থাৎ protected মডিফায়ার সম্পর্কে জানবো। যা প্যারেন্ট এবং চাইল্ড উভয় ক্লাসের মধ্যে অ্যাক্সেস যোগ্য। কিন্তু ক্লাসের বাইরে থেকে এটিকে অ্যাক্সেস করা সম্ভব নয়।

    উপরের উদাহরণে আমরা $name প্রোপার্টিকে private ডিক্লেয়ার করেছিলাম। চলুন দেখাযাক, এই প্রোপার্টিকে চাইল্ড ক্লাস থেকে অ্যাক্সেস করলে কি ঘটেঃ

    উদাহরণ
    <?php
     class Greeting{
    
       private $name;
       public function __construct($name){
          $this->name = $name;
        	  }
     }
    
     class Hello extends Greeting{
    	 public function getHello(){
       	    echo "Hello ". $this->name . ". ";
       }
     }
    
     $hello = new Hello("Tamjid");
     $hello->getHello();
    
    ?>

    ফলাফল
    Notice: Undefined property: Hello::$name

    আমরা একটি error এর সম্মুখীন হলাম। কারণ $name একটি private প্রোপার্টি। তাই আমরা এটিকে চাইল্ড ক্লাস থেকে অ্যাক্সেস করতে পারবো না।

    এই সমস্যাটি সমাধান করতে আমরা protected কীওয়ার্ড ব্যবহার করবো।

    উদাহরণ
    <?php
     class Greeting{
    
       protected $name;
       public function __construct($name){
          $this->name = $name;
        	  }
     }
    
     class Hello extends Greeting{
    
    	 public function getHello(){
       	  echo "Hello ". $this->name . ".";
       	    }
     }
    
     $hello = new Hello("Tamjid");
     $hello->getHello();
    
    ?>

    ফলাফল
    Hello Tamjid.

    এইবার এটি ঠিকমত কাজ করেছে। কারণ, প্যারেন্ট ক্লাসের protected প্রোপার্টি চাইল্ড ক্লাস থেকেও অ্যাক্সেস করা যায়।


    চাইল্ড ক্লাস থেকে প্যারেন্ট ক্লাসের প্রোপার্টি এবং মেথড ওভার-রাইড

    যে পদ্ধতিতে চাইল্ড ক্লাসের নিজস্ব প্রোপার্টি বা মেথডসমূহ ঘোষণা(declare) করা হয় ঠিক একই পদ্ধতিতে চাইল্ড ক্লাস থেকে প্যারেন্ট ক্লাসের প্রোপার্টি বা মেথডসমুহকে ওভার-রাইড করা হয়। প্যারেন্ট ক্লাসে ডিফাইনকৃত মেথড বা প্রোপার্টিকে চাইল্ড ক্লাসে ভিন্ন মান দ্বারা পূনরায় ডিফাইন করলেই এগুলো ওভার-রাইড(Override) হয়ে যাবে।

    নিম্নের উদাহরণে আমরা প্যারেন্ট ক্লাসের getHello() মেথডকে চাইল্ড ক্লাসে ওভার-রাইড করবোঃ

    উদাহরণ
    <?php
     class Greeting{
    
      protected $name;
      public function __construct($name){
          $this->name = $name;
        	  }
    	public function getHello(){
      	  echo "Hello ". $this->name . ".";
      	    }
     }
    
     class Hello extends Greeting{
    
    	public function getHello(){
       	  echo "Welcome ". $this->name . ".";
       	    }
     }
    
     $hello = new Hello("Tamjid");
     $hello->getHello();
    
    ?>

    ফলাফল
    Welcome Tamjid.

    ফলাফল পরিবর্তন হয়ে গেছে। সুতরাং প্যারেন্ট ক্লাসের getHello() মেথডটি চাইল্ড ক্লাসে পরিবর্তন হয়ে গেছে।


    চাইল্ড ক্লাসে প্যারেন্ট ক্লাসের প্রোপার্টি এবং মেথড ওভার-রাইড প্রতিরোধ

    আমরা প্যারেন্ট ক্লাসের private ব্যাতিত সকল মেথড এবং প্রোপার্টিকে চাইল্ড ক্লাস থেকে অ্যাক্সেস এবং ওভার-রাইড(Override) বা পরিবর্তন করতে পারি। কিন্তু কিছু কিছু ক্ষেত্রে আপনি নিশ্চয় চাইবেন যেন প্যারেন্ট ক্লাসে তৈরি মেথড বা প্রোপার্টিসমূহকে এর চাইল্ড ক্লাস থেকে ওভার-রাইড করতে না পারে।

    এটা সমাধানের জন্য আপনার প্যারেন্ট ক্লাসে ডিফাইনকৃত public বা protected মেথড এবং প্রোপার্টিসমুহের পূর্বে final কীওয়ার্ড যুক্ত করে দিন। যে সকল প্রোপার্টি বা মেথডের পূর্বে final কীওয়ার্ড থাকবে সেগুলোকে চাইল্ড ক্লাস থেকে আর ওভার-রাইড করা যাবে না।

    নিম্নের উদাহরণে আমরা প্যারেন্ট ক্লাসের getHello() মেথডের পূর্বে final কীওয়ার্ড ব্যবহার করবোঃ

    উদাহরণ
    <?php
     class Greeting{
    
      protected $name;
      public function __construct($name){
          $this->name = $name;
        	  }
    	final public function getHello(){
      	  echo "Hello ". $this->name . ".";
      	    }
     }
    
     class Hello extends Greeting{
    
    	public function getHello(){
       	  echo "Welcome ". $this->name . ".";
       	    }
     }
    
     $hello = new Hello("Tamjid");
     $hello->getHello();
    
    ?>

    ফলাফল
    Fatal error: Cannot override final method Greeting::getHello()

    প্যারেন্ট ক্লাসের getHello() মেথডের পূর্বে final কীওয়ার্ড ব্যবহার করায় এটি চাইল্ড ক্লাস থেকে ওভার-রাইড করা সম্ভব হয়নি এবং একটি error এর সম্মুখীন হতে হয়েছে।