博客列表 >类相关的关键字 - abstract

类相关的关键字 - abstract

力挽狂澜的博客
力挽狂澜的博客原创
2018年05月11日 16:33:231325浏览

abstract

抽象类: 类成员方法中至少有一个被声明为抽象(abstract),被声明的方法只有定义没有实现,访问权限不能声明为private,可以声明属性和类常量,不能被实例化,只能被其他类继承或实现的特殊类.

[此定义是个人理解,其中"类成员方法中至少有一个被声明为抽象"这句在代码上看是有问题的,可见以下代码实验的第二条,但抽象类的意义是通过抽象方法来规范子类,如果一个抽象方法都没有,就达不到这个要求,与普通class无异,与目的相违背,因此定义我依然不改,但要知道这个现象]

1.抽象类中没有被声明为抽象的方法必须要实现

<?php
//错误示例: 非抽象方法没有实现
abstract class mp3 {
  public function music();
}

( ! ) Fatal error: Non-abstract method mp3::music() must contain body in F:\wamp\www\blog.54skyer.cn\index.php on line 79


2.抽象类中至少有一个方法被声明为抽象.[事实证明该定义错误,见代码]

<?php
abstract class mp3 {
    public function music(){
        echo "mp3 play a music";
    }
}

!!!执行没有任何报错,证明抽象类还真的可以没有任何抽象方法.即抽象类中至少有一个方法被声明为抽象是必要不充分条件,个人认为是PHP代码设计的检测缺陷.但是如果一个类里面包含了抽象方法,则类必须被声明为抽象


3.被声明为abstract(抽象)的方法只有定义,没有实现

<?php
//错误示例: 方法进行了实现
abstract class mp3 {
    public abstract function music(){
        echo "mp3 play a music";
    }
}

( ! ) Fatal error: Abstract function mp3::music() cannot contain body in F:\wamp\www\blog.54skyer.cn\index.php on line 81

<?php
//正确示例: 只有定义,没有实现
abstract class mp3 {
    public abstract function music();
}


4.抽象方法访问权限不能被声明为private(私有),因为抽象方法必须被子类继承或实现,private不满足

<?php
//错误示例: 抽象方法note声明为私有
abstract class mp4 {
    protected abstract function vedio();
    public abstract function music();
    private function note();
}


( ! ) Fatal error: Abstract function mp4::note() cannot be declared private in F:\wamp\www\blog.54skyer.cn\index.php on line 81


5.可以声明类常量和属性,子类覆写父类的属性和方法时,访问权限不能比父类更严格,只能相同或者更宽松

<?php
    abstract class MP3 {
        protected abstract function music();
    }
    
    class MP4 extends MP3{
        private  function music(){
    }
}
$mp4 = new MP4();
$mp4->music();

( ! ) Fatal error: Access level to MP4::music() must be protected (as in class MP3) or weaker in F:\wamp64\www\blog.54skyer.cn\index.php on line 90


6.不能被实例化

<?php
//错误示例: 实例化
abstract class mp3 {
public abstract function music();
}
$mp3 = new mp3();

( ! ) Fatal error: Cannot instantiate abstract class mp3 in F:\wamp\www\blog.54skyer.cn\index.php on line 81


7.普通类继承抽象类必须对其抽象方法进行实现,且实现的抽象方法要取消abstract关键字.

<?php
//错误示例: 普通子类没有对抽象方法进行实现
abstract class mp3 {
    public abstract function music();
}
class ipod extends mp3 {

}
$ipod = new ipod();
$ipod->music();


( ! ) Fatal error: Class ipod contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (mp3::music) in F:\wamp\www\blog.54skyer.cn\index.php on line 83

<?php
//正确示例: 普通子类对抽象方法进行实现,且取消abstract关键字
abstract class mp3 {
    public abstract function music();
}
class ipod extends mp3 {
    public function music(){
        echo "ipod play a music";
    }
}
$ipod = new ipod();
$ipod->music();


8.抽象类继承抽象类,子抽象类可以对父抽象类的抽象方法实现或者不实现,但是不能将父类的抽象方法重新声明。


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议