Apa itu kelas abstrak di PHP?
Bagaimana bisa digunakan?
Apa itu kelas abstrak di PHP?
Bagaimana bisa digunakan?
Jawaban:
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.
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());
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 .
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
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 .
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.