PHP olmayan soyut sınıf soyut yöntem bildirmek nasıl?

7 Cevap php
class absclass {
    abstract public function fuc();
}

raporlar:

PHP Fatal error: Class absclass contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (absclass::fuc)

Ben implement the remaining methods, nasıl ne anlama geldiğini bilmek ister misiniz?

7 Cevap

I remaining methods aslında tanımlamaya çalışıyoruz soyut yöntemlere başvurduğu tahmin (Bu durumda, fuc()), mevcut olabilecek soyut olmayan yöntemleri zaten tamam beri. Muhtemelen misworded hata iletisi: o remaining o abstract diyebilirim diyor burada.

Düzeltme (hata mesajı o kısmı ince) oldukça basittir: Bunu değiştirmek gerekir:

abstract public function fuc();

... Uygun bir uygulamaya:

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

Bölümüne bakınız Class Abstraction in the PHP manual:

PHP 5 soyut sınıfları ve yöntemleri tanıtır. Bu soyut olarak tanımlanmış bir sınıfın örneğini oluşturmak için izin verilmez. En az bir soyut yöntemi içeren herhangi bir sınıf da soyut olmalıdır. Soyut olarak tanımlanan yöntemler sadece onlar uygulanmasını tanımlamak değil yöntemin imza beyan ederim.

Bu var ya gelir

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
    };
}

Bir soyut sınıf doğrudan örneği olamaz, ama o soyut ve non-soyut yöntemler içerebilir.

Bir soyut sınıf genişletmek ise, tüm soyut işlevleri uygulamak, ya da alt sınıf soyut yapmak için ya var.

Siz düzenli bir yöntemi geçersiz kılmak ve soyut, ama (sonunda) her soyut yöntemleri geçersiz kılmak ve onları soyut olmayan yapmalısınız olamaz.

<?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();

?>

O program bombalar ile:

PHP Fatal error: Class BadDog contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Dog::bark)

Eğer baddog sınıf açıklama ise, o çıktı:

name: Fred
gender: female
bowowwaoar

Bu gibi doğrudan bir köpek veya bir PassTheBuckDog örneğini çalışırsanız:

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

.. Bu bombalar ile:

PHP Fatal error: Cannot instantiate abstract class Dog

ya da (eğer $ yanlış satırı yorum ise)

PHP Fatal error: Cannot instantiate abstract class PassTheBuckDog

Ancak, soyut bir sınıf statik bir 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 gayet güzel çalışıyor.

Özet anahtar kelimeler etiket sınıfları ya da desen gibi yöntemler kullanılır. Bu arayüzler benzer ama yöntem değişkenleri ve uygulamaları içerebilir.

Soyut sınıfları ile ilgili yanlış anlamaları bir yeri vardır. Burada soyut bir köpek sınıfının bir örneğidir. Bir geliştirici genişletmek için diğer geliştiriciler için veya kendisi için bazı temel Köpek sınıf oluşturmak istiyorsa o soyut olarak sınıf bildirir. Sen (kimse yapamaz) doğrudan Köpek sınıf örneğini değil, ancak kendi sınıf tarafından Köpek uzatabilirsiniz. SmartDog vs Dog uzanır

Köpek sınıf tarafından soyut olarak ilan edilir bütün yöntemler Dog uzanır her sınıfta el ile uygulanması gerekir.

Örneğin, soyut sınıf Köpek) bir soyut yöntem Dog :: Bark (sahiptir. Ama bütün Köpekler havlamaya farklı. Yani her Dog-altsınıflarda bu köpek havlamaları somut NASIL açıklamak gerekir, bu yüzden örneğin SmartDog tanımlamanız gerekir :: Bark ().

Bu soyut bir sınıfın uygun en az bir arka yöntemi sahip olduğu anlamına gelir. Yani sınıf yöntemi (non soyut) uygulamak, ya da beyan edilen soyut olması için ya vardır.

Sen biraz bu hata mesajı ile yoldan ediliyoruz. O this class içinde o fuc tanımlanır ediliyor çünkü bu durumda, gerçekten bu sınıfta bunu uygulamak için mantıklı olmaz. Ne hata size anlatmaya çalıştığım olmayan bir soyut sınıf, soyut yöntemler olamaz olmasıdır. En kısa zamanda bir sınıf tanımı soyut bir yöntem koymak gibi, aynı zamanda soyut olarak sınıfının kendisini işaretlemeniz gerekir.

(? Normal sınıf) Ben olmayan bir soyut sınıf içinde soyut bir yöntemi kullanmak istedim ve ben de yöntemin içeriğini sarabilirdiniz bulundu 'if' şöyle get_parent_class ile beyanı ():

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

Ya da, eylem (cmd satırında bir dosyada test: 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() Documentation