PHP接口&抽象类验证笔记

抽象类可以不含抽象方法,抽象类中可以有抽象的方法和非抽象的方法。但是接口中的所有方法必须是抽象的。

但是含抽象方法的类一定是抽象类(或者接口)

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是公开、抽象的。
接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化

抽象类验证:

<?php
/**
*
* 抽象类中不一定需要有抽象方法
* 提供一个规范,继承该抽象类的所有的类--
* 都要实现抽象类中定义的方法,以此保证所有的子类都有相似的行为
*/
abstract class EventGenerator {
    private $observers = array();
    function addObserver(Observer $observer)
    {
        $this->observers[] = $observer;
    }
    function notify()
    {
        foreach($this->observers as $observer)
        {
            $observer->update();
        }
    }
abstract protected function Insert();//抽象方法里面不能有方法体
}
//子类必须完全实现这个抽象类中所有的抽象方法
class Test extends EventGenerator{
    function t(){
    return "test";
}
//实现父类抽象方法
public function Insert(){
    //to do
}
}
$test = new Test();
echo $test->t();
//$obj = new EventGenerator();//不能从抽象类创建对象,它的意义在于被扩展
?>

接口验证:

<?php
/**
interface和abstract class的比较及选择参照:
1. interface和abstract class都不能实例化,但可以声明引用变量,abstract class中子类必须对父类的抽象方法进行重写
2. 如果要创建不带任何方法定义和成员变量的基类,那么就应该选择接口而不是抽象类。
3. 如果知道某个类应该是基类,那么第一个选择的应该是让它成为一个接口,只有在必须要有方法定义和成员变量的时候,才应该选择抽象类。因为抽象类中允许存在一个或多个被具体实现的方法,只要方法没有被全部实现该类就仍是抽象类。
*/
interface Observer
{
    function update($event_info);
function Insert();//接口方法中不能含有方法体
}
class Test implements Observer{
    public function t(){
    return 'test';
}
function update($event_info){
    return "aaa";
}
function Insert(){
    //to do
}
}
$test = new Test();
echo $test->t();
//$obj = new Observer();//不能从抽象类创建对象,它的意义在于被扩展
?>



你可能感兴趣的:(PHP接口&抽象类验证笔记)