পিএইচপি-তে একটি বিমূর্ত শ্রেণি কী?


121

পিএইচপি-তে একটি বিমূর্ত শ্রেণি কী?

এটি কীভাবে ব্যবহার করা যায়?




6
@ গর্ডন: কখনও কখনও সরকারী দস্তাবেজগুলি কিছু লোকের পক্ষে পরিষ্কার হয় না :(
সরফরাজ


3
@ সরফরাজ যা আরটিএফএম উপায়ে বোঝানো হয়নি। আমি কেবল মনে করি যে অফিসিয়াল ডকুমেন্টেশনের লিঙ্ক থাকা একটি সহায়ক সম্পদ। এবং আপনি বিশ্বাস করবেন না যে কতজন লোক সরকারী দস্তাবেজগুলি পড়েন না বা এমনকি তাদের বিদ্যমান রয়েছে তাও জানেন না।
গর্ডন

উত্তর:


131

একটি বিমূর্ত শ্রেণি হ'ল একটি শ্রেণি যা অন্তত একটি বিমূর্ত পদ্ধতি ধারণ করে, যা কোনও নাম, প্যারামিটারের কোনও প্রকৃত কোড ছাড়াই একটি পদ্ধতি এবং এটি "বিমূর্ত" হিসাবে চিহ্নিত হয়েছে।

এর উদ্দেশ্য হ'ল উত্তরাধিকার সূত্রে প্রাপ্ত উত্তরাধিকারী শ্রেণীর এক ধরণের টেম্পলেট সরবরাহ এবং বিমূর্ত পদ্ধতিগুলি প্রয়োগ করতে বাধ্য করা।

একটি বিমূর্ত শ্রেণি নিয়মিত ক্লাস এবং খাঁটি ইন্টারফেসের মধ্যে এমন কিছু। এছাড়াও ইন্টারফেসগুলি বিমূর্ত ক্লাসগুলির একটি বিশেষ ক্ষেত্রে যেখানে সমস্ত পদ্ধতি বিমূর্ত থাকে।

আরও রেফারেন্সের জন্য পিএইচপি ম্যানুয়ালটির এই বিভাগটি দেখুন ।


6
ইন এই থ্রেড , বিমূর্ত কোনো বিমূর্ত পদ্ধতি ধারণ করে না।
r0ng

6
@ r0ng এটি বলা আরও সঠিক হবে যে কোনও বিমূর্ত শ্রেণিতে বিমূর্ত পদ্ধতি থাকতে পারে এবং বিমূর্ত পদ্ধতি অবশ্যই সর্বদা একটি বিমূর্ত শ্রেণীর মধ্যে থাকতে পারে। আমার মনে সংজ্ঞাযুক্ত ব্যবহারিক বৈশিষ্ট্যগুলি হ'ল কোনও বিমূর্ত শ্রেণি তাত্ক্ষণিকভাবে চালু করা যায় না, তবে আপনি উত্তরাধিকার সূত্রে এবং পদ্ধতিগুলিকে ওভাররাইট করতে পারেন এবং একটি বিমূর্ত শ্রেণীর স্ট্যাটিক পদ্ধতিগুলি সাধারণত ব্যবহার করা যেতে পারে।
Okdewit

117

বিমূর্ত শ্রেণি ক্লাস যা এক বা একাধিক বিমূর্ত পদ্ধতি ধারণ করে। একটি বিমূর্ত পদ্ধতি হল এমন একটি পদ্ধতি যা ঘোষিত হয় তবে এতে কোনও প্রয়োগ হয় না। অ্যাবস্ট্রাক্ট ক্লাসগুলি তাত্ক্ষণিকভাবে চালু করা যায় না এবং বিমূর্ত পদ্ধতিগুলির জন্য বাস্তবায়ন সরবরাহ করার জন্য সাবক্লাসগুলির প্রয়োজন।

১. বিমূর্ত শ্রেণি তাত্ক্ষণিকভাবে চালু করতে পারে না : বিমূর্ত হিসাবে সংজ্ঞায়িত শ্রেণিগুলি তাত্ক্ষণিকভাবে চালু করা যায় না এবং কমপক্ষে একটি বিমূর্ত পদ্ধতি রয়েছে এমন কোনও শ্রেণিও অবশ্যই বিমূর্ত হতে পারে।

নীচে উদাহরণ:

abstract class AbstractClass
{

    abstract protected function getValue();
    abstract protected function prefixValue($prefix);


    public function printOut() {
        echo "Hello how are you?";
    }
}

$obj=new AbstractClass();
$obj->printOut();
//Fatal error: Cannot instantiate abstract class AbstractClass

২. যে কোনও ক্লাসে কমপক্ষে একটি বিমূর্ত পদ্ধতি রয়েছে তা অবশ্যই বিমূর্ত হতে হবে : বিমূর্ত শ্রেণিতে বিমূর্ত এবং অ-বিমূর্ত পদ্ধতি থাকতে পারে তবে এতে কমপক্ষে একটি বিমূর্ত পদ্ধতি থাকতে হবে contain কোনও শ্রেণীর যদি কমপক্ষে একটি বিমূর্ত পদ্ধতি থাকে তবে ক্লাসটি অবশ্যই বিমূর্ত ঘোষণা করতে হবে।

দ্রষ্টব্য: বৈশিষ্ট্যগুলি প্রদর্শনী শ্রেণীর উপর প্রয়োজনীয়তা আরোপের জন্য বিমূর্ত পদ্ধতিগুলির ব্যবহারকে সমর্থন করে।

নীচে উদাহরণ:

class Non_Abstract_Class
{
   abstract protected function getValue();

    public function printOut() {
        echo "Hello how are you?";
    }
}

$obj=new Non_Abstract_Class();
$obj->printOut();
//Fatal error: Class Non_Abstract_Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Non_Abstract_Class::getValue)

৩. একটি বিমূর্ত পদ্ধতিতে দেহ থাকতে পারে না : বিমূর্ত হিসাবে সংজ্ঞায়িত পদ্ধতিগুলি কেবল পদ্ধতির স্বাক্ষর ঘোষণা করে - তারা বাস্তবায়ন সংজ্ঞায়িত করতে পারে না। তবে একটি অ-বিমূর্ত পদ্ধতি বাস্তবায়ন সংজ্ঞায়িত করতে পারে।

abstract class AbstractClass
{
   abstract protected function getValue(){
   return "Hello how are you?";
   }

    public function printOut() {
        echo $this->getValue() . "\n";
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
//Fatal error: Abstract function AbstractClass::getValue() cannot contain body

৪. কোনও বিমূর্ত শ্রেণীর উত্তরাধিকার সূত্রে, পিতামাতার শ্রেণীর ঘোষণায় বিমূর্ত হিসাবে চিহ্নিত সমস্ত পদ্ধতি অবশ্যই শিশু দ্বারা সংজ্ঞায়িত করা উচিত : আপনি যদি কোনও বিমূর্ত শ্রেণির উত্তরাধিকারী হন তবে আপনাকে এটিতে সমস্ত বিমূর্ত পদ্ধতিতে প্রয়োগকরণ সরবরাহ করতে হবে।

abstract class AbstractClass
{
    // Force Extending class to define this method
    abstract protected function getValue();

    // Common method
    public function printOut() {
        print $this->getValue() . "<br/>";
    }
}

class ConcreteClass1 extends AbstractClass
{
    public function printOut() {
        echo "dhairya";
    }

}
$class1 = new ConcreteClass1;
$class1->printOut();
//Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue)

৫. একই (বা কিছুটা সীমাবদ্ধ) দৃশ্যমানতা : যখন কোনও বিমূর্ত শ্রেণি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় তখন পিতামাতার শ্রেণীর ঘোষণায় বিমূর্ত হিসাবে চিহ্নিত সমস্ত পদ্ধতি অবশ্যই শিশু দ্বারা সংজ্ঞায়িত করা উচিত; অতিরিক্তভাবে, এই পদ্ধতিগুলি অবশ্যই একই (বা কম সীমাবদ্ধ) দৃশ্যমানতার সাথে সংজ্ঞায়িত করা উচিত। উদাহরণস্বরূপ, যদি বিমূর্ত পদ্ধতিটি সুরক্ষিত হিসাবে সংজ্ঞায়িত করা হয় তবে ফাংশন বাস্তবায়নটিকে অবশ্যই সুরক্ষিত বা পাবলিক হিসাবে সংজ্ঞায়িত করতে হবে তবে ব্যক্তিগত নয়।

নোট করুন যে বিমূর্ত পদ্ধতিটি ব্যক্তিগত হওয়া উচিত নয়।

abstract class AbstractClass
{

    abstract public function getValue();
    abstract protected function prefixValue($prefix);

        public function printOut() {
        print $this->getValue();
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."<br/>";
//Fatal error: Access level to ConcreteClass1::getValue() must be public (as in class AbstractClass)

The. বিমূর্ত পদ্ধতির স্বাক্ষরগুলি অবশ্যই মেলতে হবে : কোনও বিমূর্ত শ্রেণীর উত্তরাধিকার সূত্রে, পিতা-মাতার শ্রেণীর ঘোষণায় বিমূর্ত হিসাবে চিহ্নিত সমস্ত পদ্ধতি অবশ্যই শিশু দ্বারা সংজ্ঞায়িত করা উচিত; পদ্ধতিগুলির স্বাক্ষরগুলি অবশ্যই মেলে, অর্থাত্ ইঙ্গিতগুলি এবং প্রয়োজনীয় সংখ্যার সাথে যুক্তি একই হতে হবে। উদাহরণস্বরূপ, যদি শিশু শ্রেণি একটি alচ্ছিক যুক্তি সংজ্ঞায়িত করে, যেখানে বিমূর্ত পদ্ধতির স্বাক্ষর না হয় তবে স্বাক্ষরে কোনও বিরোধ নেই।

abstract class AbstractClass
{

    abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass
{


    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "<br/>";
echo $class->prefixName("Pacwoman"), "<br/>";
//output: Mr. Pacman
//        Mrs. Pacwoman

Ab. বিমূর্ত শ্রেণি একাধিক উত্তরাধিকারকে সমর্থন করে না : বিমূর্ত শ্রেণিটি অন্য বিমূর্ত শ্রেণির প্রসারিত করতে পারে, অ্যাবস্ট্রাক্ট শ্রেণি ইন্টারফেসের বাস্তবায়ন সরবরাহ করতে পারে ut তবে এটি একাধিক উত্তরাধিকার সমর্থন করে না।

interface MyInterface{
    public function foo();
    public function bar();
}

abstract class MyAbstract1{
    abstract public function baz();
}


abstract class MyAbstract2 extends MyAbstract1 implements MyInterface{
    public function foo(){ echo "foo"; }
    public function bar(){ echo "bar"; }
    public function baz(){ echo "baz"; }
}

class MyClass extends MyAbstract2{
}

$obj=new MyClass;
$obj->foo();
$obj->bar();
$obj->baz();
//output: foobarbaz

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

নীচে উদাহরণস্বরূপ মারাত্মক ত্রুটি ঘটবে : শ্রেণি 'ঘোড়া' পাওয়া যায় নি

class cart extends horse {
    public function get_breed() { return "Wood"; }
}

abstract class horse extends animal {
    public function get_breed() { return "Jersey"; }
}

abstract class animal {
    public abstract function get_breed();
}

$cart = new cart();
print($cart->get_breed());

1
ভালভাবে ব্যাখ্যা করা হয়েছে।
টক 2নিট

18

একটি বিমূর্ত শ্রেণি এমন একটি বর্গ যা কেবলমাত্র প্রোগ্রামার দ্বারা আংশিকভাবে প্রয়োগ করা হয়। এটিতে এক বা একাধিক বিমূর্ত পদ্ধতি থাকতে পারে। একটি বিমূর্ত পদ্ধতিটি কেবল একটি ফাংশন সংজ্ঞা যা প্রোগ্রামারকে জানাতে পরিবেশন করে যে পদ্ধতিটি একটি শিশু শ্রেণিতে প্রয়োগ করা আবশ্যক।

এখানে এর ভাল ব্যাখ্যা আছে


হাই, ব্যাখ্যাটির জন্য ধন্যবাদ, সত্যটি এই যে পিএইচপি-র অ্যাবস্ট্রাক্ট এবং ইন্টারফেস সম্পর্কে ইন্টারনেটে এর মতো ভালো কোনও ব্যাখ্যা নেই।
লেনিন জাপাটা

12

অ্যাবস্ট্রাক্ট ক্লাস
১. একটি বিমূর্ত পদ্ধতি রয়েছে
২. সরাসরি শুরু করা
যায় না ৩. বিমূর্ত শ্রেণির কোনও অবজেক্ট তৈরি করা যায় না
৪. কেবল উত্তরাধিকারের উদ্দেশ্যেই ব্যবহৃত হয়

বিমূর্ত পদ্ধতি
1. একটি শরীর থাকতে পারে না
2. ব্যক্তিগত হিসাবে সংজ্ঞায়িত করা যায় না
3. শিশু ক্লাসগুলি বিমূর্ত শ্রেণিতে ঘোষিত পদ্ধতিগুলি সংজ্ঞায়িত করতে হবে

উদাহরণ কোড:

abstract class A {
    public function test1() {
        echo 'Hello World';
    }
    abstract protected function f1();
    abstract public function f2();
    protected function test2(){
        echo 'Hello World test';
    }
}

class B extends A {
    public $a = 'India';
    public function f1() {
        echo "F1 Method Call";
    }
    public function f2() {
        echo "F2 Method Call";
    }
}

$b = new B();
echo $b->test1() . "<br/>";
echo $b->a . "<br/>";
echo $b->test2() . "<br/>";
echo $b->f1() . "<br/>";
echo $b->f2() . "<br/>";

আউটপুট:

Hello World
India
Hello World test
F1 Method Call
F2 Method Call

আপনি শিশু শ্রেণীর অবজেক্টের মাধ্যমে প্যারেন্ট সুরক্ষিত পদ্ধতিটিকে কল করতে পারবেন না, আপনি এই বিষয়টির প্রতিধ্বনি </ b>> টেস্ট 2 () দ্বারা শিশু শ্রেণি পদ্ধতিতে কল করতে পারেন। "<br/>";
আল-আমিন

7
  • বিমূর্ত শ্রেণিতে কেবল পদ্ধতির স্বাক্ষর ঘোষণা করে, তারা বাস্তবায়ন সংজ্ঞায়িত করতে পারে না।
  • বিমূর্ততা শ্রেণি মূল শব্দটি বিমূর্ত ব্যবহার করে সংজ্ঞায়িত করা হয় ।
  • বিমূর্ত শ্রেণি একাধিক উত্তরাধিকার বাস্তবায়ন সম্ভব নয় ।
  • পিএইচপি 5 এর সর্বশেষ সংস্করণটিতে বিমূর্ত ক্লাস এবং পদ্ধতিগুলি উপস্থাপন করা হয়েছে।
  • বিমূর্ত হিসাবে সংজ্ঞায়িত ক্লাসগুলি, আমরা অবজেক্টটি তৈরি করতে অক্ষম (তাত্ক্ষণিকভাবে নাও)

0

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

এছাড়াও এক শ্রেণীর বিমূর্ত খাঁটি হয়ে উঠতে ক্লাসের একটি পদ্ধতি অবশ্যই বিমূর্ত হতে হবে।

বিমূর্ত শ্রেণীর বিশদের জন্য আপনি পিএইচপি-র অ্যাবস্ট্রাক্ট ক্লাসে আমার ব্লগটি উল্লেখ করতে পারেন ।


0

একটি বিমূর্ত শ্রেণি স্বাভাবিক শ্রেণীর মতো এটির মধ্যে ভেরিয়েবল থাকে এতে সুরক্ষিত ভেরিয়েবল ফাংশন থাকে এতে কনস্ট্রাক্টর থাকে কেবল একটি জিনিস আলাদা এটিতে অ্যাবস্ট্রাক্ট পদ্ধতি থাকে।

বিমূর্ত পদ্ধতি মানে সংজ্ঞা ব্যতীত একটি খালি পদ্ধতি তাই বিমূর্ত শ্রেণীর মধ্যে কেবলমাত্র একটি পার্থক্য আমরা বিমূর্ত শ্রেণীর কোনও অবজেক্ট তৈরি করতে পারি না

বিমূর্তে অবশ্যই বিমূর্ত পদ্ধতি থাকা উচিত এবং সেই পদ্ধতিগুলি অবশ্যই তার উত্তরাধিকারী শ্রেণিতে সংজ্ঞায়িত করা উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.