Apa itu kelas abstrak di PHP?

121

Apa itu kelas abstrak di PHP?

Bagaimana bisa digunakan?

udaya
sumber
6
@Gordon: Terkadang dokumen resmi tidak begitu jelas bagi sebagian orang :(
Sarfraz
3
@Sarfraz yang tidak dimaksudkan dengan cara RTF. Saya hanya berpikir bahwa memiliki tautan ke dokumentasi resmi adalah aset yang bermanfaat. Dan Anda tidak akan percaya berapa banyak orang yang tidak membaca dokumen resmi atau bahkan tahu bahwa dokumen itu ada.
Gordon

Jawaban:

131

Kelas abstrak adalah kelas yang berisi setidaknya satu metode abstrak, yang merupakan metode tanpa kode aktual di dalamnya, hanya nama dan parameternya, dan yang telah ditandai sebagai "abstrak".

Tujuannya adalah untuk menyediakan jenis template yang akan diwarisi dan memaksa kelas yang mewarisi untuk mengimplementasikan metode abstrak.

Kelas abstrak dengan demikian adalah sesuatu antara kelas biasa dan antarmuka murni. Juga antarmuka adalah kasus khusus dari kelas abstrak di mana SEMUA metode adalah abstrak.

Lihat bagian manual PHP ini untuk referensi lebih lanjut.

selfawaresoup
sumber
6
Di utas ini , abstrak tidak berisi metode abstrak apa pun.
r0ng
6
@ r0ng Akan lebih tepat untuk mengatakan bahwa kelas abstrak mungkin berisi metode abstrak, dan metode abstrak harus selalu berada di dalam kelas abstrak. Fitur praktis yang menentukan dalam pikiran saya adalah bahwa kelas abstrak tidak dapat digunakan, tetapi Anda dapat mewarisi dan menimpa metode, dan metode statis dari kelas abstrak dapat digunakan secara normal.
okdewit
117

Kelas abstrak adalah kelas yang berisi satu atau lebih metode abstrak. Metode abstrak adalah metode yang dideklarasikan, tetapi tidak berisi implementasi. Class abstrak tidak boleh dibuat instance-nya, dan memerlukan subclass untuk menyediakan implementasi untuk metode abstrak.

1. Tidak dapat membuat instance kelas abstrak : Kelas yang didefinisikan sebagai abstrak tidak boleh dibuat, dan kelas apa pun yang berisi setidaknya satu metode abstrak juga harus abstrak.

Contoh di bawah ini:

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. Setiap kelas yang berisi setidaknya satu metode abstrak juga harus abstrak : Kelas abstrak dapat memiliki metode abstrak dan non-abstrak, tetapi harus berisi setidaknya satu metode abstrak. Jika sebuah kelas memiliki setidaknya satu metode abstrak, maka kelas tersebut harus dinyatakan sebagai abstrak.

Catatan: Sifat mendukung penggunaan metode abstrak untuk menerapkan persyaratan pada kelas pameran.

Contoh di bawah ini:

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. Metode abstrak tidak boleh berisi isi : Metode yang didefinisikan sebagai abstrak hanya mendeklarasikan tanda tangan metode - metode tersebut tidak dapat menentukan implementasi. Tetapi metode non-abstrak dapat menentukan implementasinya.

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. Saat mewarisi dari kelas abstrak, semua metode yang ditandai abstrak dalam deklarasi kelas induk harus ditentukan oleh anak : Jika Anda mewarisi kelas abstrak, Anda harus menyediakan implementasi untuk semua metode abstrak di dalamnya.

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. Visibilitas yang sama (atau kurang dibatasi) : Saat mewarisi dari kelas abstrak, semua metode yang ditandai abstrak dalam deklarasi kelas induk harus ditentukan oleh anak; Selain itu, metode ini harus ditentukan dengan visibilitas yang sama (atau tidak terlalu dibatasi). Misalnya, jika metode abstrak didefinisikan sebagai dilindungi, implementasi fungsi harus didefinisikan sebagai dilindungi atau publik, tetapi tidak pribadi.

Perhatikan bahwa metode abstrak tidak boleh pribadi.

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. Tanda tangan metode abstrak harus cocok : Saat mewarisi dari kelas abstrak, semua metode yang ditandai abstrak dalam deklarasi kelas induk harus ditentukan oleh anak; tanda tangan metode harus cocok, yaitu petunjuk jenis dan jumlah yang diperlukan argumen harus sama. Misalnya, jika kelas anak mendefinisikan argumen opsional, sedangkan tanda tangan metode abstrak tidak, tidak ada konflik dalam tanda tangan.

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. Kelas abstrak tidak mendukung multiple inheritance : Kelas abstrak dapat memperluas kelas abstrak lainnya, kelas abstrak dapat menyediakan implementasi antarmuka, tetapi tidak mendukung multiple inheritance.

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

Catatan: Harap perhatikan urutan atau posisi kelas dalam kode Anda dapat mempengaruhi penerjemah dan dapat menyebabkan kesalahan Fatal. Jadi, saat menggunakan beberapa level abstraksi, berhati-hatilah dalam memposisikan kelas dalam kode sumber.

contoh di bawah ini akan menyebabkan kesalahan Fatal: Kelas 'kuda' tidak ditemukan

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());
Dhairya Lakhera
sumber
1
Diuraikan dengan baik.
Talk2Nit
18

Kelas abstrak adalah kelas yang hanya diimplementasikan sebagian oleh programmer. Ini mungkin berisi satu atau lebih metode abstrak. Metode abstrak hanyalah definisi fungsi yang berfungsi untuk memberi tahu programmer bahwa metode tersebut harus diimplementasikan dalam kelas anak.

Ada penjelasan bagus tentang itu di sini .

Sarfraz
sumber
Hai, terima kasih atas penjelasannya, sebenarnya tidak ada penjelasan yang bagus seperti ini di internet tentang abstrak dan antarmuka dalam PHP.
Lenin Zapata
12

Kelas Abstrak
1. Berisi metode abstrak
2. Tidak dapat langsung diinisialisasi
3. Tidak dapat membuat objek kelas abstrak
4. Hanya digunakan untuk tujuan pewarisan

Metode Abstrak
1. Tidak dapat berisi tubuh
2. Tidak dapat didefinisikan sebagai privat
3. Kelas anak harus mendefinisikan metode yang dideklarasikan dalam kelas abstrak

Kode Contoh:

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/>";

Keluaran:

Hello World
India
Hello World test
F1 Method Call
F2 Method Call
vivek s vamja
sumber
Anda tidak dapat memanggil metode induk yang dilindungi oleh objek kelas anak, Anda dapat memanggil metode kelas anak dengan objek ini echo $ b-> test2 (). "<br/>";
Al-Amin
7
  • Kelas Abstrak berisi hanya mendeklarasikan tanda tangan metode, mereka tidak dapat mendefinisikan implementasinya.
  • Kelas abstraksi didefinisikan menggunakan kata kunci abstrak .
  • Kelas Abstrak tidak mungkin untuk mengimplementasikan multiple inheritance .
  • Versi terbaru PHP 5 telah memperkenalkan kelas dan metode abstrak.
  • Kelas didefinisikan sebagai abstrak, kami tidak dapat membuat objek (mungkin tidak dipakai)
Elangovan
sumber
0

Kelas Abstrak adalah kelas-kelas yang tidak dapat dijalankan secara langsung. Atau dengan kata lain kita dapat mengatakan bahwa kelas abstrak adalah kelas-kelas yang objeknya tidak dapat dibuat secara langsung. Dalam kelas abstrak PHP ditentang dengan abstrak kata kunci .

Juga untuk menjadi satu kelas abstrak ateast satu metode kelas harus abstrak.

Untuk detail kelas abstrak Anda bisa merujuk ke blog saya di Kelas Abstrak di PHP .

Ankur Kumar Singh
sumber
0

Kelas abstrak seperti kelas normal berisi variabel yang berisi variabel terlindungi fungsi yang berisi konstruktor hanya satu hal yang berbeda itu berisi metode abstrak.

Metode abstrak berarti metode kosong tanpa definisi sehingga hanya satu perbedaan dalam kelas abstrak kita tidak dapat membuat objek kelas abstrak

Abstrak harus berisi metode abstrak dan metode tersebut harus didefinisikan di kelas yang mewarisinya.

shriyash deshmukh
sumber