Soru PHP'de soyut olmayan sınıfta soyut yöntem nasıl bildirilir?


class absclass {
    abstract public function fuc();
}

raporlar:

PHP Önemli hata: Sınıf absclass   1 soyut yöntem içerir ve gerekir   bu nedenle soyut beyan veya   kalan yöntemleri uygulamak   (Absclass :: fuc)

Ne anlama geldiğini bilmek istiyorum kalan yöntemleri uygulamak,Nasıl?


44
2018-03-03 13:16


Menşei


Uyguladığınız ama uygulanmayan soyut ata sınıfında zaten bildirilmişti. Şimdi bunu uygulamaya, bildirmeye gerek yok. Bütün soyutlar (uygulanmayan deklare edilen) metotları uygulandığında sınıf soyut olmaz ve örneklere sahip olabilir. - Gherman


Cevaplar:


Bunu farz ediyorum kalan yöntemler Aslında tanımlamaya çalıştığınız soyut yöntemleri ifade eder (bu durumda, fuc()), mevcut olmayan soyut yöntemler zaten her şeyden iyidir. Muhtemelen daha iyi bir ifadeyi kullanabilecek bir hata mesajıdır: Nerede yazıyor? kalan söylemeliyim soyut.

Düzeltme oldukça basittir (hata mesajının bir kısmı iyi): bunu değiştirmeniz gerekir:

abstract public function fuc();

... düzgün bir uygulamaya

public function fuc(){
    // Code comes here
}

... ya da, alternatif olarak ve ihtiyaçlarınıza bağlı olarak, tüm sınıf özetini yapın:

abstract class absclass {
    abstract public function fuc();
}

23
2018-03-03 13:29



katılıyorum yanlış yazılmış hata iletisi - user198729
Bu nasıl bir cevaptır? Bu durumda "kalan yöntemler", hata mesajının da belirttiği gibi, "fuc" anlamına gelir, çünkü bunları özet olarak beyan ettiniz ama sınıfın kendisini soyut olarak beyan etmediniz. Hata mesajı mükemmel şekilde ifade edilmiş gibi görünüyor. - Robert Grant
@RobertGrant - mesaj mükemmel bir şekilde ifade edilmişse, ilk etapta bu soru sorulmayacaktır. - SDC
Hehe ... Hata mesajı olduğu Dağınık, yukarıdaki gibi Robert'ın muhakemesinde olduğu gibi ('kalan' yöntemlerden 'bu yana "fuc" kelimesine atıfta bulunulur, çünkü err. msg. kafa karıştırıcıdır ...), ama yine de hala doğrudur: kabul edilen cevap soruya cevap vermiyor gibi görünüyor. :) Bu, sahte cevapların bogusun çözülmediği güzel bir “dairesel yanlış anlama” olgusudur.burada neden görmek) soru, ama asıl sorunun asıl sorunu, muhtemelen, ama yanlış bir şekilde ifade edilmişti?) - Sz.
@ Gordon'un cevabı doğru cevaptır .. - musicliftsme


Bölümüne bakınız PHP el kitabında Class Abstraction:

PHP 5 soyut sınıfları ve yöntemleri tanıtır. Özet olarak tanımlanan sınıflar örneklenemez ve en az bir soyut yöntem içeren herhangi bir sınıf da soyut olmalıdır. Soyut olarak tanımlanan yöntemler, yalnızca yöntemin imzasını bildirir - uygulamayı tanımlayamazlar.

Demek zorundasın

abstract class absclass { // mark the entire class as abstract
    abstract public function fuc();
}

veya

class absclass {
    public function fuc() { // implement the method body
        // which means it won't be abstract anymore
    };
}

73
2018-03-03 13:29



"En az bir soyut yöntem içeren herhangi bir sınıf da soyut olmalı" PHP'ye özgü veya OO dillerinde oldukça yaygın mı? - Caltor
Bu F # örneğinde aynıdır - broch


Soyut bir sınıf doğrudan somutlaştırılamaz, ancak soyut ve soyut olmayan metotları içerebilir.

Soyut bir dersi genişletirseniz, ya tüm soyut işlevlerini yerine getirmeli ya da alt sınıfı soyutlaştırmalısınız.

Düzenli bir yöntemi geçersiz kılabilir ve onu soyut bir hale getiremezsiniz, ancak tüm soyut yöntemleri geçersiz kılmalı ve soyutlamamalısınız.

<?php

abstract class Dog {

    private $name = null;
    private $gender = null;

    public function __construct($name, $gender) {
        $this->name = $name;
        $this->gender = $gender;
    }

    public function getName() {return $this->name;}
    public function setName($name) {$this->name = $name;}
    public function getGender() {return $this->gender;}
    public function setGender($gender) {$this->gender = $gender;}

    abstract public function bark();

}

// non-abstract class inheritting from an abstract class - this one has to implement all inherited abstract methods.
class Daschund extends Dog {
    public function bark() {
        print "bowowwaoar" . PHP_EOL;
    }
}

// this class causes a compilation error, because it fails to implement bark().
class BadDog extends Dog {
    // boom!  where's bark() ?
}

// this one succeeds in compiling, 
// it's passing the buck of implementing it's inheritted abstract methods on to sub classes.
abstract class PassTheBuckDog extends Dog {
    // no boom. only non-abstract subclasses have to bark(). 
}

$dog = new Daschund('Fred', 'male');
$dog->setGender('female');

print "name: " . $dog->getName() . PHP_EOL;
print "gender: ". $dog->getGender() . PHP_EOL;

$dog->bark();

?>

Bu program şu şekilde bombalar:

PHP Önemli hata: Class BadDog   1 soyut yöntem içerir ve gerekir   bu nedenle soyut beyan veya   kalan yöntemleri uygulamak   (Köpek havlaması)

BadDog sınıfını yorumlarsanız, çıktı şu şekildedir:

name: Fred
gender: female
bowowwaoar

Bir Dog veya bir PassTheBuckDog'u doğrudan örneklendirmeyi denerseniz, bunun gibi:

$wrong = new Dog('somma','it');
$bad = new PassTheBuckDog('phamous','monster');

.. ile bombalar:

PHP Önemli hata: Anında başlatılamıyor   soyut sınıf köpek

ya da ($ yanlış satırını yorumlarsanız)

PHP Önemli hata: Anında başlatılamıyor   soyut sınıf PassTheBuckDog

Bununla birlikte, soyut bir sınıfın statik işlevini çağırabilirsiniz:

abstract class Dog {
    ..
    public static function getBarker($classname, $name, $gender) {
        return new $classname($name, $gender);
    }
    ..
}

..

$other_dog = Dog::getBarker('Daschund', 'Wilma', 'female');
$other_dog->bark();

Bu iyi çalışıyor.


25
2018-06-23 19:35



public public function bark() ? - Raptor
Oh, bunu işaret ettiğin için teşekkürler. Düzenlendi ve düzeltildi. - Shavais


Soyut anahtar kelimeler, sınıfları veya yöntemleri kalıp olarak etiketlemek için kullanılır. Arayüzlere benzer, ancak değişkenler ve yöntemlerin uygulanmasını içerebilir.

Soyut sınıflarla ilgili birçok yanlış anlamalar var. İşte soyut bir Köpek sınıfının bir örneğidir. Bir geliştirici, diğer geliştiriciler için temel bir köpek sınıfı oluşturmak istiyorsa veya kendi başına genişletmek için sınıfı soyut olarak ilan eder. Dog sınıfını doğrudan sınıflandıramazsınız (kimse yapamaz), ancak Köpek'i kendi sınıfınıza göre genişletebilirsiniz. SmartDog Köpek vb.

Köpek sınıfı tarafından özet olarak beyan edilen tüm yöntemler, Köpek'i genişleten her bir sınıfta manuel olarak uygulanmalıdır.

Örneğin, soyut sınıfın Köpek soyut bir yöntemi vardır Dog :: Bark (). Ama bütün köpekler farklı şekilde havlar. Bu yüzden, her bir Köpek alt sınıfında, köpeğin somut olarak buğulandığını tanımlamanız gerekir, yani örneğin SmartDog :: Bark () öğesini tanımlamanız gerekir.


3
2018-03-03 13:18





Bu, soyut bir sınıfın uygunluğunun en az bir soyut yönteme sahip olduğu anlamına gelir. Yani sınıfınız ya yöntemi (soyut olmayan) uygulamak ya da soyut olarak beyan edilmek zorundadır.


2
2018-03-03 13:19





Bu hata mesajıyla biraz yoldan sapıyorsunuz. Bu durumda, içinde olduğundan bu sınıf o fuc tanımlanıyor, bu sınıfta uygulamak gerçekten mantıklı değil. Bir hatanın size anlatmaya çalıştığı şey, soyut olmayan bir sınıfın soyut yöntemlere sahip olamayacağıdır. Bir sınıfın tanımına soyut bir yöntem koyduğunuzda, sınıfı da soyut olarak işaretlemelisiniz.


2
2017-08-29 23:14





Soyut olmayan bir sınıf içinde (normal sınıf?) Soyut bir metot kullanmak istedim ve metodun içeriğini get_parent_class () ile bir 'if' ifadesinde sarmalayabildiğimi keşfettim:

if (get_parent_class($this) !== false) {

Veya, eylem halinde (cmd satırındaki bir dosyada test edildi: php -f "abstract_method_normal_class_test.php"):

<?php
    class dad {
        function dad() {
            if (get_parent_class($this) !== false) {
                // implements some logic
                echo "I'm " , get_class($this) , "\n";
            } else {
                echo "I'm " , get_class($this) , "\n";
            }
        }
    }

    class child extends dad {
        function child() {
            parent::dad();
        }
    }

    $foo = new dad();
    $bar = new child();
?>

Output:
I'm dad
I'm child

PHP get_parent_class () Belgeler


0