PHP 抽象类

1.PHP 5 支持抽象类和抽象方法。
2.定义为抽象的类不能被实例化,用abstract来申明;
abstract class Fruit{}

3.任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
   abstract class Fruit { 
    private $color; 
    //抽象方法
    abstract public function eat(); 
    
    public function setColor($c) { 
        $this->color = $c; 
    } 
} 

4.被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
abstract public function eat();  //直接这样写就可以了,他的具体实现需要在继承它的子类中去实现

5.继承一个抽象类的时候,子类必须定义父类中的所有抽象方法
//抽象类
abstract class Fruit { 
    private $color; 
    
    abstract public function eat(); 
    
    public function setColor($c) { 
        $this->color = $c; 
    } 
} 
//在apple类中一定要完成eat方法
class Apple extends Fruit { 
    public function eat() { 
        echo "eat apple";
    } 
} 
6.另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
//抽象类
abstract class Fruit { 
    private $color; 
    //抽象类中,抽象方法被申明为protected
    abstract protected function eat(); 
    
    public function setColor($c) { 
        $this->color = $c; 
    } 
} 
//那么在子类中,eat方法的只能被生命为protected、public,而不能是private
class Apple extends Fruit { 
    public function eat() { 
        echo "eat apple";
    } 
} 

7.此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。 这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。
abstract class AbstractClass{
    // 我们的抽象方法仅需要定义需要的参数
    abstract protected function prefixName($name);
}

class ConcreteClass extends AbstractClass{
    // 我们的子类可以定义父类签名中不存在的可选参数
    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}

自己的理解:抽象方法的使用场景我自己觉得大概是这样的(因为在实际工作中我也没有用过),在很多类中,我们写了很多相同的方法,那么我们就可以把这些方法抽出来放到抽象方法中,然后其他的类直接继承就可以了,同时可能这些类中还存在同一样的方法,但是他们的实现逻辑不一样,这时就可以定义抽象方法,在各自的类中完成其实现逻辑。比如:点赞和评论模块,我们都是需要先检测用户信息,然后才让用户操作点赞或留言,这时就可以把检查用户信息的方法写到抽象类中去,然后在抽象类中定义一个“操作的抽象方法”在点在点赞和评论的类中去完成(注:其实这样的业务直接写一个类,再让点赞类和评论类去继承也是可以完成的,然后再各自的类中写操作的方法,如果要问我这有什么区别,我查了很多资料,也还没有完全弄清楚,这仅是自己学习做的笔记,如果有不正确的地方,帮忙说下)

猜你喜欢

转载自blog.csdn.net/liaobangxiang/article/details/80409614
今日推荐