Blogger Information
Blog 25
fans 0
comment 0
visits 16855
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
类相关的关键字 - abstract
力挽狂澜的博客
Original
1330 people have browsed it

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.抽象类继承抽象类,子抽象类可以对父抽象类的抽象方法实现或者不实现,但是不能将父类的抽象方法重新声明。


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post