类可以用 abstract 修饰,表示抽象类,抽象类不能直接被实例化。但是,继承了抽象类的普通类是可以被实例化的。如:

//one.php

<?php

abstract class one
{
    
    function __construct(){

    }

}
//new one;
?>

实例化的时候会报Fatal error的错误。
但是继承自这个抽象类的方法就可以被实例化。如:

//index.php

include 'one.php';

class index extends one
{
    
    function __construct(){
        parent::__construct();
    }
}
$obj = new index;

除了类可以用 abstract 修饰之外,方法也能被 abstruct 修饰,为抽象方法。抽象方法真的是很抽象,它并没有内容,如:

<?php
//one.php
abstract class one
{
    
    function __construct(){

    }

    abstract public function test();
    //允许带参数,但是在子类中重写的时候也必须带上参数,参数名可以不同
    //abstract public function test($param);

}
//new one;
?>

如果方法被 abstruct 修饰,那么这个类必须用abstruct,不然就
会报错。也就是说抽象类可以有普通的方法,但是抽象方法必须在抽象类里面定义,并且,如果继承了这个有抽象方法的抽象类,那么在你继承的这个类里面必须重写这个方法,否则依然会报错。如:

<?php
//index.php
include 'one.php';

class index extends one
{
    
    function __construct(){
        parent::__construct();
    }
    //这个方法不重写就会报错
    public function test(){
        echo 'hello';
    }
    //如果抽象的父类中该函数有参数,那么重写的时候也要带上参数
    public function test($papapa){
        echo 'hello';
    }
}
$obj = new index;

?>

但是抽象类中的抽象方法似乎不能被定义为静态的,定义了之后就报错。如:

<?php
//one.php
abstract class one
{
    
    function __construct(){

    }

    abstract public function test($param);
    //定义静态抽象方法就报错
    static abstract  function hello();

}
//new one;
?>
<?php
//index.php
include 'one.php';

class index extends one
{
    
    function __construct(){
        parent::__construct();
    }

    public function test($aa){
        echo 'hello';
    }
    //并不能实现
    static public function hello(){
        echo 'word';
    }
}
$obj = new index;

?>

还有,抽象类是可以继承抽象类的,并且不需要重写父类的抽象方法,它的抽象方法不能和父类的抽象方法同名,他们的关系就像是拓展延伸的关系。如:

<?php
//index.php
include 'one.php';



abstract class two extends one
{
    abstract public function test1();

    //重写了之后子类无需再重写
    /*public function test(){

    }*/
}

class index extends two
{
    public function test(){

    }

    public function test1(){

    }
}

$obj = new index;


?>

由于平时接触这些也不多,主要都是基于框架开发或者直接在其他系统上二次开发,对这些稍微底层一点的知识理解的不透彻,在我的理解看来,抽象类和方法主要是用在比较底层的被继承的类中,供其他继承的类去拓展。但是是否对于性能是否有改变就不大清楚了。


月白
316 声望5 粉丝

大家好,我是月白