• 技术文章 >后端开发 >php教程

    php面向对象语法5 final类,抽象类,接口结构(不是类)

    黄舟黄舟2016-12-28 10:12:32原创411
    类的作用
    1实例化对象
    2作为其他类的基础类,被继承!
    3调用其静态成员

    两大主要功能:实例化对象、被继承。

    存在两种特殊的类,功能单一!
    1, **只能实例化对象,不能被继承。**final类
    2, 只能被继承,不能实例化对象。抽象类

    final类和final方法
    final 类是继承链上的末链,不能再有子类

    final class End{
    }
    class Test  extends End{
    }
    运行结果:报错
    PHP Fatal error: Class Test may not inherit from final class (End) in /usercode/file.php on line 7

    final方法,限制方法不能被子类重写

    <?php
    class  AmParent{
        final public function end_func(){
            echo '我是final方法';
        }
    }
    class AmChild extends AmParent{
         public function end_func(){
            echo '我是子类,我想重写final方法,可是报错了';
        }
    }
    运行结果:报错
    PHP Fatal error: Cannot override final method AmParentt::end_func() in /usercode/file.php on line 11

    抽象类,abstract类
    比常规类(类常量,静态属性,静态方法,非静态属性,非静态方法) 多出一样东西 ——抽象方法,要求非抽象子类必须实现抽象方法。
    抽象方法: 没有{},称之为 只有方法的声明。可以有参数。

    abstract public function abstract_func($arg1,$arg2)
    //不能实例化对象
    <?php
    abstract class AmParent{
        abstract public function abstract_func($arg1,$arg2);
    }
    $amParent=new AmParent;
    运行结果:
    PHP Fatal error: Cannot instantiate abstract class AmParent in /usercode/file.php on line 5

    只能被继承
    被继承的两种情况:
    1.子类是抽象类
    2.子类不是抽象类,必须将父类的抽象方法全部实现(加上方法体{})。

    <?php
    abstract class AmParent{
        abstract public function abstract_func($arg1,$arg2);
    }
    class AmChild extends AmParent{
    }
    运行结果,报错:
    PHP Fatal error: Class AmChild contains 1 abstract method and must therefore be 
    declared abstract or implement the remaining methods (AmParent::abstract_func) in /usercode/file.php on line 6

    不报错的情况:
    1加上abstract成为抽象类

    <?php
    abstract class AmParent{
        abstract public function abstract_func($arg1,$arg2);
    }
    abstract class AmChild extends AmParent{
    }

    2实现抽象方法

    <?php
    abstract class AmParent{
        abstract public function abstract_func($arg1,$arg2);
    }
     class AmChild extends AmParent{
         public function abstract_func($arg1,$arg2){
            echo $arg1.$arg2;
             }
    }
    $amChild=new AmChild;
    $amChild->abstract_func( 'have implemented ',' abstract_func ');
    运行结果,报错:
    have implemented abstract_func

    使用意义
    抽象类,规定其非抽象子类都必须存在的方法,同名但方法体可以不同。

    <?php
    abstract class Goods{
        abstract public function sayName();
    }
     class Books extends  Goods{
         public function sayName(){
             echo '我是一本书的名字<br/>';
         }
    }
     class Mobiles extends  Goods{
         public function sayName(){
             echo '我是一部手机的名字<br/>';
         }
    }
    $book1=new Books;
    $book1->sayName();
    $mobile1=new Mobiles;
    $mobile1->sayName();
    运行结果:
    我是一本书的名字
    我是一部手机的名字

    接口结构:
    用于限制一个类(对象)应该具备的公共方法(接口方法)!

    <?php
        interface iGoods{
            const PAI=3.14;
            public function sayName();
            public function sayPrice();
        }

    接口内只能包含公共的抽象方法(不完整的方法)和常量!
    实现implements
    实现接口结构的类,就包含了接口中定义的抽象方法。
    两个选择,1定义成抽象类,2实现接口方法!

    //1定义成抽象类
    abstract class Books implements iGoods{
        abstract  public function sayName();
        abstract  public function sayPrice();
    }
    //2实现接口方法
     class Books implements iGoods{
         public function sayName(){
             echo '我实现了接口方法';
         }
         public function sayPrice(){
             echo '我实现了接口方法';
         }
    }

    比较抽象类与接口的区别:
    1抽象类与普通类之间是继承关系
    普通类继承抽象类了,第一可以得到抽象类中已有的常规成员,
    第二才需要实现抽象方法(不一定是public的)
    2.接口与普通类之间是实现关系!
    普通类实现了接口,只能将其没有实现的公共方法实现!
    3.接口只用于定义public方法和常量!而抽象类,什么都可以有!
    4.接口多实现。一个类,可以同时实现多个接口

    <?php
    interface iA{
            const PAI=3.14;
        public function sayA();
    }
    interface iB{
        public function sayB();
    }
    class C implements iA,iB{
        public function sayA(){
        }
        public function sayB(){
        }
    }

    tip:
    接口不是类,接口就是独立的一种结构,用于限制类的结构!

    //用class_exists(@param string),判断类是否存在
    var_dump(class_exists('C'));
    var_dump(class_exists('iA'));
    运行结果:
    bool(true)
    bool(false)

    里面全是没有方法体也没有abstract关键词的public方法与常量。


    以上就是php面向对象语法5 final类,抽象类,接口结构(不是类)的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    上一篇:php面向对象语法3 继承extends 下一篇:php面向对象语法4:访问修饰限定符,public,protected,private
    大前端线上培训班

    相关文章推荐

    • PHP数据库学习之怎样使用PDO执行SQL语句?• PHP数据库学习之怎样使用PDO获取查询结果?• PHP数据库学习之怎样使用PDO连接数据库?• 浅谈怎么利用PHP读取到图片的EXIF信息(附代码)• PHP中获取SQL的查询结果的常用函数整理(实例详解)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网