关于oop:PHP中的抽象关键字

Abstract keyword in PHP

嘿,我对PHP很有经验,但我不知道关键字abstract在面向对象编程方面做了什么。有人能用简单的英语解释一下它能用来做什么吗?

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


(希望这足够简单——我不认为我能做得更好^)

不能声明abstract类:只能创建从abstract类继承的另一个类,并声明该子类。

如果将某些方法声明为abstract,则必须在子类中定义这些方法,以便使该方法不可恢复。


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

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


上面提到了定义,下面我将给您举一个例子:

"摘要"确保您遵循特定的逻辑,例如,票据的材料始终是"纸张",或者信用卡必须始终具有"代码"。如果你在一家有严格标准化的大公司工作,或者你想"强迫"你的开发人员遵循一个特定的结构,那么这一点很重要,这样他们的代码就不会一团糟。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    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上的错误。


抽象类用于实际的A模型关系。例如,这允许数据库驱动程序映射层次结构,该层次结构旨在为实际驱动程序类的方法提供一个公共的基类和签名。然后根据实际驱动程序类中预先确定的签名执行。

这是代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
abstract class AbstrakteKlasse {
  public abstract function methode();
}

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

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


虽然不能实例化抽象类,但可以声明具体的方法/属性/变量(在c,afaik中),这些方法/属性/变量将可用于派生类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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");
        }
    }