PHP'de soyut sınıf nedir?


122

PHP'de soyut sınıf nedir?

Bu nasıl kullanılabilir?




6
@Gordon: Bazen resmi belgeler bazı insanlar için o kadar net olmayabilir :(
Sarfraz


3
@ Sarfraz bu RTFM anlamında değildir. Sadece resmi belgelere bir bağlantıya sahip olmanın yararlı bir varlık olduğunu düşünüyorum. Ve kaç kişinin resmi belgeleri okumadığına veya var olduklarını bile bilmediğine inanamazsınız.
Gordon

Yanıtlar:


132

Soyut bir sınıf, içinde herhangi bir gerçek kod bulunmayan, yalnızca adı ve parametreleri olmayan ve "soyut" olarak işaretlenmiş en az bir soyut yöntem içeren bir sınıftır.

Bunun amacı, miras alan sınıftan devralmak ve soyut yöntemleri uygulamaya zorlamak için bir tür şablon sağlamaktır.

Soyut bir sınıf, bu nedenle normal bir sınıf ile saf bir arayüz arasındaki bir şeydir. Ayrıca arayüzler, TÜM yöntemlerin soyut olduğu özel bir soyut sınıf durumudur.

Daha fazla referans için PHP kılavuzunun bu bölümüne bakın .


6
Gelen bu konuya , soyut herhangi soyut bir yöntem içermez.
2016

6
It r0ng @ soyut sınıf olduğunu söylemek daha doğru olur olabilecek soyut yöntemler içerir ve soyut yöntemler her zaman soyut bir sınıf içinde olmalıdır. Benim zihnimdeki tanımlayıcı pratik özellikler, soyut bir sınıfın somutlaştırılamayacağı, ancak yöntemleri miras alıp üzerine yazabildiğiniz ve soyut bir sınıftan statik yöntemlerin normal olarak kullanılabileceğidir.
okdewit

117

Soyut sınıflar, bir veya daha fazla soyut yöntem içeren sınıflardır. Soyut bir yöntem, bildirilen, ancak uygulama içermeyen bir yöntemdir. Soyut sınıflar somutlaştırılmayabilir ve soyut yöntemler için uygulamalar sağlamak için alt sınıflar gerektirebilir.

1. Soyut sınıf başlatılamaz: Soyut olarak tanımlanan sınıflar başlatılamaz ve en az bir soyut yöntem içeren herhangi bir sınıf da soyut olmalıdır.

Aşağıdaki örnek:

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. En az bir soyut yöntem içeren herhangi bir sınıfın da soyut olması gerekir : Soyut sınıfın soyut ve soyut olmayan yöntemleri olabilir, ancak en az bir soyut yöntem içermesi gerekir. Bir sınıfın en az bir soyut yöntemi varsa, sınıfın soyut olarak bildirilmesi gerekir.

Not: Özellikler, sergileyen sınıfa gereksinimleri empoze etmek için soyut yöntemlerin kullanılmasını destekler.

Aşağıdaki örnek:

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. Soyut bir yöntem gövde içeremez : Soyut olarak tanımlanan yöntemler, yalnızca yöntemin imzasını bildirir - uygulamayı tanımlayamazlar. Ancak soyut olmayan bir yöntem uygulamayı tanımlayabilir.

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. Soyut bir sınıftan miras alırken, ebeveynin sınıf bildiriminde soyut olarak işaretlenen tüm yöntemler çocuk tarafından tanımlanmalıdır : Soyut bir sınıfı miras alırsanız, içindeki tüm soyut yöntemlere uygulamalar sağlamanız gerekir.

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. Aynı (veya daha az kısıtlı) görünürlük : Soyut bir sınıftan miras alırken, ebeveynin sınıf bildiriminde soyut olarak işaretlenmiş tüm yöntemler çocuk tarafından tanımlanmalıdır; ek olarak, bu yöntemler aynı (veya daha az kısıtlı) görünürlükle tanımlanmalıdır. Örneğin, soyut yöntem korumalı olarak tanımlanırsa, işlev uygulaması korumalı veya genel olarak tanımlanmalı, ancak özel olmamalıdır.

Soyut yöntemin özel olmaması gerektiğini unutmayın.

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. Soyut yöntemlerin imzaları eşleşmelidir : Soyut bir sınıftan miras alırken, ebeveynin sınıf bildiriminde özet olarak işaretlenen tüm yöntemler çocuk tarafından tanımlanmalıdır; yöntemlerin imzaları eşleşmelidir, yani tür ipuçları ve gerekli sayı argümanlar aynı olmalıdır. Örneğin, alt sınıf, soyut yöntemin imzasının bulunmadığı isteğe bağlı bir argüman tanımlıyorsa, imzada herhangi bir çakışma yoktur.

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. Soyut sınıf çoklu kalıtımı desteklemez : Soyut sınıf başka bir soyut sınıfı genişletebilir, Abstract sınıfı arayüzün uygulanmasını sağlayabilir ancak çoklu kalıtımı desteklemez.

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

Not: Lütfen kodunuzdaki sınıfların sırasının veya konumlandırılmasının yorumlayıcıyı etkileyebileceğini ve önemli bir hataya neden olabileceğini unutmayın. Bu nedenle, birden çok düzeyde soyutlama kullanırken, sınıfların kaynak kod içindeki konumlandırılmasına dikkat edin.

Aşağıdaki örnek, Ölümcül hataya neden olacaktır : 'at' sınıfı bulunamadı

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
İyi hazırlanmış.
Talk2Nit

18

Soyut bir sınıf, programcı tarafından yalnızca kısmen uygulanan bir sınıftır. Bir veya daha fazla soyut yöntem içerebilir. Soyut bir yöntem, programcıya yöntemin bir alt sınıfta uygulanması gerektiğini söyleyen bir işlev tanımıdır.

Burada bunun iyi bir açıklaması var .


Merhaba, açıklama için teşekkürler, gerçek şu ki internette PHP'de soyut ve arayüz hakkında bunun kadar iyi bir açıklama yok.
Lenin Zapata

12

Soyut Sınıf
1. Soyut bir yöntem içerir
2. Doğrudan başlatılamaz
3. Soyut sınıf nesnesi oluşturulamaz
4. Yalnızca miras amacıyla kullanılır

Özet Yöntem
1. Gövde içeremez
2. Özel olarak tanımlanamaz
3. Alt sınıflar, soyut sınıfta bildirilen yöntemleri tanımlamalıdır

Örnek Kod:

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

Çıktı:

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

alt sınıf nesnesiyle üst korumalı yöntemi çağıramazsınız, bu nesne ile alt sınıf yönteminde echo $ b-> test2 () çağırabilirsiniz. "<br/>";
Al-Amin

7
  • Abstract Class yalnızca yöntemin imzasını bildirir, uygulamayı tanımlayamazlar.
  • Soyutlama sınıfı, abstract anahtar sözcüğü kullanılarak tanımlanır .
  • Abstract Class, çoklu kalıtım uygulamak mümkün değildir .
  • PHP 5'in son sürümü, soyut sınıfları ve yöntemleri tanıtmaktadır.
  • Soyut olarak tanımlanan sınıflar, nesneyi oluşturamıyoruz (somutlaştırılamayabilir)

0

Soyut Sınıflar, doğrudan başlatılamayan sınıflardır. Ya da başka bir deyişle, soyut sınıfların, nesnenin doğrudan yaratılamayacağı sınıflar olduğunu söyleyebiliriz. PHP'de soyut sınıflar, anahtar sözcük soyutuyla tanımlanır .

Ayrıca tek bir sınıf soyut olabilmek için sınıfın en son bir yöntemi soyut olmalıdır.

Soyut sınıfın ayrıntıları için PHP'deki Abstract Class'taki bloguma bakabilirsiniz .


0

Soyut bir sınıf normal sınıfa benzer, değişkenler içerir, korumalı değişkenler içerir, yapıcı, yalnızca bir şey farklıdır, soyut yöntem içerir.

Soyut yöntem, tanımı olmayan boş bir yöntem anlamına gelir, bu nedenle soyut sınıfta yalnızca bir fark, soyut bir sınıf nesnesi oluşturamayız

Özet, soyut yöntemi içermelidir ve bu yöntemler, miras alan sınıfında tanımlanmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.