คลาสนามธรรมใน PHP คืออะไร?


123

คลาสนามธรรมใน PHP คืออะไร?

จะใช้งานได้อย่างไร?



2
(ที่เกี่ยวข้อง) stackoverflow.com/questions/2288467/…
Gordon

6
@Gordon: บางครั้งเอกสารอย่างเป็นทางการก็ไม่ชัดเจนสำหรับบางคน :(
Sarfraz


3
@Sarfraz ที่ไม่ได้หมายถึงวิธี RTFM ฉันคิดว่าการมีลิงก์ไปยังเอกสารอย่างเป็นทางการเป็นสิ่งที่มีประโยชน์ และคุณจะไม่เชื่อว่ามีคนจำนวนมากที่ไม่อ่านเอกสารอย่างเป็นทางการหรือรู้ว่ามีอยู่จริง
Gordon

คำตอบ:


132

คลาสนามธรรมคือคลาสที่มีวิธีนามธรรมอย่างน้อยหนึ่งวิธีซึ่งเป็นวิธีที่ไม่มีรหัสจริงใด ๆ เพียงชื่อและพารามิเตอร์และได้รับการระบุว่าเป็น "นามธรรม"

จุดประสงค์ของสิ่งนี้คือการจัดเตรียมแม่แบบที่จะสืบทอดและบังคับให้คลาสที่สืบทอดมาใช้วิธีนามธรรม

คลาสนามธรรมจึงเป็นสิ่งที่อยู่ระหว่างคลาสปกติและอินเทอร์เฟซที่บริสุทธิ์ นอกจากนี้อินเทอร์เฟซยังเป็นกรณีพิเศษของคลาสนามธรรมที่วิธีการทั้งหมดเป็นนามธรรม

ดูส่วนนี้ของคู่มือ PHP สำหรับการอ้างอิงเพิ่มเติม


6
ในหัวข้อนี้บทคัดย่อไม่มีวิธีนามธรรมใด ๆ
r0ng

6
@ r0ng มันจะถูกต้องมากกว่าถ้าจะบอกว่าคลาสนามธรรมอาจมีวิธีการที่เป็นนามธรรมและวิธีนามธรรมจะต้องอยู่ในคลาสนามธรรมเสมอ การกำหนดคุณสมบัติที่ใช้งานได้จริงในใจของฉันคือคลาสนามธรรมไม่สามารถสร้างอินสแตนซ์ได้ แต่คุณสามารถสืบทอดและเขียนทับวิธีการได้และวิธีการแบบคงที่จากคลาสนามธรรมสามารถใช้ได้ตามปกติ
okdewit

118

คลาสนามธรรมคือคลาสที่ประกอบด้วยวิธีการที่เป็นนามธรรมอย่างน้อยหนึ่งวิธี วิธีนามธรรมคือวิธีการที่ประกาศ แต่ไม่มีการนำไปใช้ คลาสบทคัดย่อไม่สามารถสร้างอินสแตนซ์ได้และจำเป็นต้องมีคลาสย่อยเพื่อจัดเตรียมการนำไปใช้สำหรับวิธีนามธรรม

1. ไม่สามารถสร้างอินสแตนซ์คลาสนามธรรมได้ : คลาสที่กำหนดเป็นนามธรรมอาจไม่สามารถสร้างอินสแตนซ์ได้และคลาสใด ๆ ที่มีวิธีนามธรรมอย่างน้อยหนึ่งวิธีก็ต้องเป็นนามธรรมด้วย

ตัวอย่างด้านล่าง:

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

2. คลาสใด ๆ ที่มีวิธีนามธรรมอย่างน้อยหนึ่งวิธีก็ต้องเป็นนามธรรมเช่นกันคลาสบทคัดย่อสามารถมีวิธีนามธรรมและไม่ใช่นามธรรมได้ แต่ต้องมีวิธีนามธรรมอย่างน้อยหนึ่งวิธี ถ้าคลาสมีวิธีนามธรรมอย่างน้อยหนึ่งคลาสก็ต้องประกาศคลาสนามธรรม

หมายเหตุ: ลักษณะสนับสนุนการใช้วิธีนามธรรมเพื่อกำหนดความต้องการของชั้นเรียน

ตัวอย่างด้านล่าง:

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)

3. วิธีนามธรรมต้องไม่มีเนื้อความ : วิธีการที่กำหนดเป็นนามธรรมเพียงแค่ประกาศลายเซ็นของวิธีการ - ไม่สามารถกำหนดการใช้งานได้ แต่วิธีการที่ไม่ใช่นามธรรมสามารถกำหนดการดำเนินการได้

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

4. เมื่อรับช่วงจากคลาสนามธรรมเด็กต้องกำหนดวิธีการทั้งหมดที่ทำเครื่องหมายนามธรรมไว้ในการประกาศคลาสของผู้ปกครอง : หากคุณสืบทอดคลาสนามธรรมคุณต้องจัดเตรียมการนำไปใช้กับวิธีนามธรรมทั้งหมดในนั้น

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)

5. การมองเห็นที่เหมือนกัน (หรือ จำกัด น้อยกว่า) : เมื่อสืบทอดจากคลาสนามธรรมเด็กต้องกำหนดวิธีการทั้งหมดที่ทำเครื่องหมายนามธรรมในการประกาศคลาสของผู้ปกครอง นอกจากนี้ต้องกำหนดวิธีการเหล่านี้ด้วยการมองเห็นเดียวกัน (หรือ จำกัด น้อยกว่า) ตัวอย่างเช่นหากกำหนดวิธีนามธรรมเป็นแบบป้องกันการใช้งานฟังก์ชันจะต้องถูกกำหนดให้เป็นแบบป้องกันหรือสาธารณะ แต่ไม่ใช่แบบส่วนตัว

โปรดทราบว่าวิธีนามธรรมไม่ควรเป็นแบบส่วนตัว

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)

6. ลายเซ็นของวิธีนามธรรมต้องตรงกัน : เมื่อรับช่วงจากคลาสนามธรรมเด็กต้องกำหนดวิธีการทั้งหมดที่ทำเครื่องหมายนามธรรมในการประกาศคลาสของผู้ปกครองโดยลายเซ็นของวิธีการต้องตรงกันกล่าวคือคำแนะนำประเภทและจำนวนที่ต้องการ อาร์กิวเมนต์ต้องเหมือนกัน ตัวอย่างเช่นถ้าคลาสย่อยกำหนดอาร์กิวเมนต์ที่เป็นทางเลือกโดยที่ลายเซ็นของเมธอดนามธรรมไม่มีความขัดแย้งในลายเซ็น

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

7. คลาสนามธรรมไม่รองรับการสืบทอดหลายคลาส: คลาสนามธรรมสามารถขยายคลาสนามธรรมอื่นคลาสนามธรรมสามารถให้การใช้งานอินเทอร์เฟซได้ แต่ไม่รองรับการสืบทอดหลายรายการ

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
อธิบายได้ดี
Talk2Nit

18

คลาสนามธรรมคือคลาสที่โปรแกรมเมอร์นำไปใช้เพียงบางส่วน อาจมีวิธีนามธรรมอย่างน้อยหนึ่งวิธี วิธีนามธรรมเป็นเพียงคำจำกัดความของฟังก์ชันที่ทำหน้าที่บอกโปรแกรมเมอร์ว่าต้องใช้วิธีการในคลาสย่อย

มีคำอธิบายที่ดีของที่อยู่ที่นี่


สวัสดีขอบคุณสำหรับคำอธิบายความจริงก็คือไม่มีคำอธิบายที่ดีเช่นนี้บนอินเทอร์เน็ตเกี่ยวกับนามธรรมและอินเทอร์เฟซใน PHP
Lenin Zapata

12

คลาสนามธรรม
1. ประกอบด้วยวิธีนามธรรม
2. ไม่สามารถเริ่มต้นโดยตรง
3. ไม่สามารถสร้างวัตถุของคลาสนามธรรม
4. ใช้เพื่อวัตถุประสงค์ในการสืบทอดเท่านั้น

วิธีนามธรรม
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

คุณไม่สามารถเรียกเมธอดที่ได้รับการป้องกันโดยผู้ปกครองโดยอ็อบเจ็กต์คลาสลูกคุณสามารถเรียกใช้เมธอดคลาสลูกโดยอ็อบเจ็กต์นี้ echo $ b-> test2 () "<br/>";
Al-Amin

7
  • Abstract Class มีเพียงประกาศลายเซ็นของวิธีการเท่านั้นพวกเขาไม่สามารถกำหนดการใช้งานได้
  • ระดับนามธรรมจะถูกกำหนดโดยใช้คำหลักที่เป็นนามธรรม
  • บทคัดย่อชั้นเป็นไปไม่ได้ที่จะใช้มรดกหลาย
  • PHP 5 เวอร์ชันล่าสุดได้แนะนำคลาสและวิธีการที่เป็นนามธรรม
  • คลาสที่กำหนดเป็นนามธรรมเราไม่สามารถสร้างวัตถุได้ (อาจไม่สร้างอินสแตนซ์)

0

Abstract Classes คือคลาสที่ไม่สามารถเริ่มต้นได้โดยตรง หรืออีกนัยหนึ่งเราสามารถพูดได้ว่าคลาสนามธรรมคือคลาสที่อ็อบเจ็กต์ไม่สามารถสร้างได้โดยตรง ใน PHP คลาสนามธรรมจะท้าทายกับคำนามธรรม

นอกจากนี้การที่จะกลายเป็นนามธรรมคลาสหนึ่งวิธีการหนึ่งของคลาสจะต้องเป็นนามธรรม

สำหรับรายละเอียดของระดับนามธรรมที่คุณสามารถดูได้ที่บล็อกของฉันในบทคัดย่อชั้นใน PHP


0

คลาสนามธรรมก็เหมือนกับคลาสปกติที่มีตัวแปรซึ่งมีฟังก์ชันตัวแปรที่มีการป้องกันซึ่งมีตัวสร้างเพียงสิ่งเดียวที่แตกต่างกันมันมีวิธีนามธรรม

วิธีนามธรรมหมายถึงวิธีที่ว่างเปล่าโดยไม่มีคำจำกัดความดังนั้นความแตกต่างเพียงอย่างเดียวในคลาสนามธรรมที่เราไม่สามารถสร้างวัตถุของคลาสนามธรรมได้

บทคัดย่อต้องมีวิธีนามธรรมและต้องกำหนดวิธีการเหล่านั้นในคลาสที่สืบทอด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.