PHP中的抽象关键字

时间:2009-12-05 12:31:09

标签: php oop abstract-class

嘿,我对PHP很有经验,但我不知道关键字摘要在面向对象编程时会做什么。任何人都可以用简单的英语解释它可以用于什么?

我会在什么情况下使用抽象关键字?它如何改变类/接口?

5 个答案:

答案 0 :(得分:16)

(希望这很简单 - 我认为我不能做得更好^^)

abstract类无法实例化:您只能创建另一个继承自abstract类的类,并实例化该子类。

如果您将某些方法声明为abstract,则必须在子类中定义这些方法,以使其成为可实现的。

答案 1 :(得分:7)

声明类抽象意味着它必须被子类化才能被使用。无法实例化抽象类。人们可以将其视为可能包含实现代码的扩展接口(而不是接口)。

通过声明方法abstract,可以强制子类实现该方法。

答案 2 :(得分:2)

上面提到了定义,现在我将尝试给你一个例子:

“abstract”确保您遵循特定的逻辑,例如票证的材料总是“纸”,或者信用卡必须始终有“代码”。 如果您在一家拥有严格标准化的大公司工作,或者您希望“强迫”您的开发人员遵循特定的结构,这一点很重要,因此他们的代码不会一团糟。

    abstract class ticket{

    public function material()
    {
        return 'Paper';
    }

}

abstract class creditcard{

    public function material()
    {
        return 'Plastic';
    }

    abstract function setCode(); // the ";" semicolon is important otherwise it will cause an error

}

class key extends ticket{

    public function getMaterial()
    {
        return parent::material();
    }
}

class anotherKey extends creditcard{

    public function setCode($code)
    {
        $this->code = $code;
    }
}

如果我们没有定义“setCode”方法,解析器将在“new anotherKey”上返回错误

答案 3 :(得分:1)

抽象类用于实际的a-kind-of-model关系。这允许例如数据库驱动程序映射层次结构,其中旨在提供公共基类,实际驱动程序类的方法的签名。然后根据实际驱动程序类中的预定签名执行实现。

这是代码示例

<?php
abstract class AbstrakteKlasse {
  public abstract function methode();
}

class ImplementierendeKlasse extends AbstrakteKlasse {
  public function methode() {
    print "ImplementierendeKlasse::methode() aufgerufen.\n";
  }
}

$objekt = new ImplementierendeKlasse;
$objekt->methode();
?>

答案 4 :(得分:0)

虽然您无法实例化抽象类,但您可以声明可用于派生类的具体方法/属性/变量(在C#,AFAIK中)

class Program
    {
        static void Main(string[] args)
        {
            Dog a = new Dog();
           //concrete properties and methods in abstract base class 
          //are available to derived class
            a.Name = "SuperDog";
            a.EatFood();
            //And now calling Dog's method
            a.Speak();            
            Console.WriteLine(a.GetType());

        }
    }

    public abstract class Animal
    {
        public string Name { get; set; }
        public void EatFood()
        {
            Console.WriteLine("Eating..");
        }
    }

    public class Dog :Animal
    {
        public void Speak()
        {
            Console.WriteLine("Bow .. Bow");
        }
    }
相关问题