简明现代魔法 -> PHP服务器脚本 -> PHP 面向对象:抽象方法

PHP 面向对象:抽象方法

2010-05-10

用abstract修饰的类表示这个方法是一个抽象方法。

抽象方法,只有方法的声明部分,没有方法体。

抽象方法没有 {} ,而采用; 结束。

一个类中,只要有一个抽象方法,这个类必须被声明为抽象类。

抽象方法在子类中必须被重写。

下面是一个抽象类,其中有两个抽象方法,分别是 setSal() 和 getSal()。用来取回$sal 员工的工资。

<?

abstract class User{
    protected $sal = 0;  
    //这里定义的抽象方法.
    //注意抽象方法没有方法体,而且方法结束使用 ; 号.  
   
    abstract function getSal();
    abstract function setSal($sal);
    //定义它的__toString 方法.
    public function __toString(){
        return get_class($this);
    }
}

?>

既然User类不能被直接继承,我们写一个 NormalUser类继承自User类。

当我们写成如下代码时,系统会报错。

这个错误告诉我们,在 User类中有两个抽象方法,我们必须在子类中重写这两个方法。

<?
abstract class User{
    protected $sal = 0;  
    //这里定义的抽象方法.
    //注意抽象方法没有方法体,而且方法结束使用 ; 号.  
    
    abstract function getSal();
    abstract function setSal($sal);
    //定义它的__toString 方法.
    public function __toString(){
        return get_class($this);
    }
}

class NormalUser extends User {
    
}

?>

程序运行结果:

Fatal error: Class NormalUser contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (User::getSal, User::setSal) in E:\PHPProjects\test.php on line 17

下面例子,重写了这两个方法,虽然方法体里面 {} 的内容是空的,也算重写了这个方法。注意看重写方法的参数名称,这里只要参数数量一致就可以,不要求参数的名称必须一致。

<?
abstract class User{
    protected  $sal = 0;  
    //这里定义的抽象方法.
    //注意抽象方法没有方法体,而且方法结束使用 ; 号.  
    
    abstract function getSal();
    abstract function setSal ($sal);
    //定义它的__toString 方法.
    public function __toString(){
        return get_class($this);
    }
}

class NormalUser extends User {
    //虽然是空的方法体,但依然是重写了.
    function getSal(){}  
   
    function  setSal($sal){}
    
}
//这样就不会出错了.
?>

下面19-21行,三种写重写的方式都会报错。

<?
abstract class User{
    protected $sal = 0;  
    //这里定义的抽象方法.
    //注意抽象方法没有方法体,而且方法结束使用 ; 号.    
    abstract function getSal();
    abstract function setSal ($sal);
    //定义它的__toString 方法.
    public function __toString(){
        return get_class($this);
    }
}

class NormalUser extends User {
    //虽然是空的方法体,但依然是重写了.
    function getSal(){}
    
    //function setSal(){}
    //function setSal($sal1,$sal2){}
    function  setSal( User $sal){}
    
}
//这样就不会出错了.
?>

程序运行结果:

Fatal error: Declaration of NormalUser::setSal() must be compatible with that of User::setSal() in E:\PHPProjects\test.php on line 22

一个类中,如果有一个抽象方法,这个类必须被声明为抽象类。

下面这个类不是抽象类,其中定义了一个抽象方法,会报错。

<?

class User{
    protected  $sal = 0;  
    //这里定义的抽象方法.
    //注意抽象方法没有方法体,而且方法结束使用 ; 号.  
   
    abstract function getSal();
    abstract function setSal($sal);
    //定义它的__toString 方法.
    public function __toString(){
        return get_class($this);
    }
}
//这个类中有两个抽象方法,如果这个类不是抽象的.
//会报错.
?>

程序运行结果:

Fatal error: Class User contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (User::getSal, User::setSal) in E:\PHPProjects\test.php on line 14
随机文章推荐
网站分类


注:如需转载本文,请注明出处(原文链接),谢谢。更多精彩内容,请进入简明现代魔法首页。

进入新博客
喜欢本文,就分享它吧
给我留言
您的名字:
您的邮件:
您的网站:


 

copyright © 2009 简明现代魔法    学习、分享、进步

power by Gonn 感谢所有关心和支持本站的朋友们