一、抽像类(abstract)
        在我们实际开发过程中,有些类并不需要被实例化,如前面学习到的一些父类,主要是让子类来继承,这样可以提高代码复用性
语法结构:

 代码如下 复制代码
  abstract class 类名{
        属性 $name;
        方法(){}  //方法也可以为abstract 修饰符 function 方法名(){}
    }

例:

 代码如下 复制代码
abstract class animal{
        public $name;
        public $age;
        //抽象方法不能有方法体,主要是为了让子类去实现;
        abstract public function cry();
        //抽象类中可以包含抽象方法,同时也可以包含实例类方法
        public function getname(){
            echo $this->name;
        }
    }
    class Cat{
        public function cry(){
            echo 'ok';
        }
    }

理解:动物类,实际上是一个抽象的概念,它规定了一些动物有些哪共同的属性和行为,但实际上它自己并没收有那些属性和行为。再比如:交通工具类,植物类等等
 
注意:
    1、如果一个类用了abstract来修饰,则该类就是一个抽象类,如果一个方法被abstract修饰,那么该方法就是一个抽象方法,抽象方法不能有方法体=> abstract function cry();  连{}也不可以有
    2、抽象类一定不能被实例化,抽象类可以没有抽象方法,但是如果一个类包含了任意一个抽象方法,这个类一定要声明为abstract类;
    3、如果一个类继承了另一个抽象类,则该子类必须实现抽象类中所有的抽象方法(除非它自己也声明为抽象类);
 
二、接口(interface)
        接口就是将一些没有实现的方法,封装在一起,到某个类要用的时候,再根据具体情况把这些方法写出来;
        语法结构

 代码如下 复制代码
   interface 接口名{
                //属性、方法
                //接口中的方法都不能有方法体;
            }
            如何实现接口
            class 类名 implements 接口名{
 
            }

理解:接口就是更加抽象的抽象类,抽象类里的方法可以有方法体,但是接口中的方法必须没有方法体。接口实现了程序设计的多态和高内聚、低偶合的设计思想;
 
例:

 代码如下 复制代码
   //接口是定义规范、属性的,一般以小写的i开头;
        interface iUsb{
            public function start();
            public function stop();
        }
        //编写相机类,让它去实现接口
        //当一个类实现了某个接口,那么该类就必须实现接口的所有方法
        class Camera implements iUsb{
            public function start(){
                echo 'Camera Start Work';
            }
            public function stop(){
                echo 'Camera Stop Work';
            }
        }
        //编写一个手机类
        class Phone implements iUsb{
            public function start(){
                echo 'Phone Satrt Work';
            }
            public function stop(){
                echo 'Phone Stop Work';
            }
        }
        $c=new Camera();
        $c->start();
        $p=new Phone();
        $p->start();

什么时候使用接口:
        1、定下规范,让其他程序员来实现
        2、当多个平级的类,都需要去实现某个功能,但是实现的方式不一样;
 
    小结:
        1、接口不能被实例化,接口中所有的方法都不能有主体;
        2、一个类可以实现多个接口,以逗号(,)分隔 class demo implements if1,if2,if3{}
        3、接口中可以有属性,但必须是常量,常量不可以有修饰符(默认是public修饰符)
            如:interface iUsb{
                        const A=90;
                    }
                    echo iUsb::A;
        4、接口中的方法都必须是public的,默认是public;
        5、一个接口不能继承其他的类,但是可以继承其它的接口,一个接口可以继承多个其它接口
            如:interface 接口名 extends if1,if2{}
        6、一个类可以在继承父类的同时实现其它接口
            如:class test extends testbase implements test1,test2{}
 
实现接口VS继承类 
php的继承是单一继承,也就是一个类只能继承一个父类,这样对子类功能的扩展有一定的影响。实现接口可以看做是对继承类的一个补充。继承是层级的关系,不太灵活,而实现接口是平级的关系,实现接口可以在不打破继承关系的前提下,对某个功能扩展,非常灵活。
 
三、Final
 
1、如果我们希望某个类不被其它的类继承(比如为了安全原因等。。),那么可以考虑使用final
    语法:
            final class A{}
2、如果我们希望某个方法,不被子类重写,可以考虑使用final来修饰,final修饰的方法还是可以继承的,因为方法的继承权取决于public的修饰 
    如:

 代码如下 复制代码
class A{
                final public function getrate($salary){
                    return $salary*0.08;
                }
            }
            class B extens A{
                //这里父类的getrate方法使用了final,所以这里无法再重写getrate
                //public function getrate($salary){
                //    return $salary*0.01;
                //}
            }

3、final不能用来修饰属性         
 
四、类常量(const)
 
在某些情况下,可能有这样的需求:当不希望一个成员变量被修改,希望该变量的值是固定不变的,这时可以使用const常量(常量名应该全用大写,并且不带$符号,常量不可以加修饰符)
语法:
        const 常量名=常量值;  //必须赋初值,因为常量是不能修改的
调用:
        类名::常量名[本类内部可用self::常量名]   或者  接口名::常量名  //接口中只能使用常量,不能使用变量
 
如:

 代码如下 复制代码
class A{
    const TAX_RATE=0.08;
    function paytax($salary){
        return $salary*self::TAX_RATE;
    }
}
$a=new A();
echo $a->paytax(100);

注:
    1、常量可以被子类继承
    2、常量是属于某个类的,而不属于某个对象
虽然实现很简单但大家只要有点基础知识就可以方便快速的实现php面向对象编辑操作了。

php面向对象之抽像类、接口、final、类常量的更多相关文章

  1. Java不可变类与final类

    概念 Java的不可变类是指八个基础类型的包装类和String,他们的数据成员是不可变的.使用加法等操作时,其实是创建了一个新的对象. Java的final类是对类用关键字final进行修饰,说明该类 ...

  2. 动态绑定、阻止继承,final类和方法

    1.编译器查看对象的声明类型和方法名.当调用 x.f(param); 且隐式参数x生命为C类对象.这时候可能有多个名字都叫f,但是参数类型不一样的方法.编译器会一一列举C类中名为f的方法和其超类中访问 ...

  3. java中String类、StringBuilder类和StringBuffer类详解

    本位转载自http://www.cnblogs.com/dolphin0520/p/3778589.html  版权声明如下: 作者:海子 出处:http://www.cnblogs.com/dolp ...

  4. java基础1.0::Java面向对象、面向对象封装、抽象类、接口、static、final

    一.前言 一直以来都是拿来主义,向大神学习,从网上找资料,现在就把自己在工作中和学习中的所理解的知识点写出来,好记星不如烂笔头,一来可以作为笔记自己温习,二来也可以给走在求学之路的同学们一点参考意见, ...

  5. 如何讲清楚 Java 面向对象的问题与知识?(类与对象,封装,继承,多态,接口,内部类...)

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  6. JAVA面向对象-----接口与类、接口之间的关系

    接口与类.接口之间的关系 大家之前都知道类与类之间的关系继承,那么接口与类之间又是怎样子的关系呢? 接口与类之间是实现关系.非抽象类实现接口时,必须把接口里面的所有方法实现.类实现接口用关键字impl ...

  7. JAVASE(十)面向对象:特性之多态性、Object类、代码块、关键字:static、final、父子类执行顺序

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.面向对象的特性之:多态性 多态性的理解:事物的多种形态 1.1 广义上多态性的体现:①方法的重写,重 ...

  8. 31 面向对象编程 接口 普通类:只有具体实现 声明类的关键字是class,声明接口关键字是interface 接口的作用

    接口 概念 普通类:只有具体实现 抽象类:具体实现和规范(抽象方法)都有! 接口:只有规范!自己无法写方法!专业的约束!约束和实现分离:面向接口编程~ 接口就是规范,定义的是一组规则,体现了现实世界中 ...

  9. PHP 面向对象 final类与final方法

    final---用于类.方法前. final类---不可被继承. final方法---不可被覆盖. final类不能被继承. 如果我们不希望一个类被继承,我们使用final来修饰这个类.这个类将无法被 ...

随机推荐

  1. oracle Redhat64 安装错误3

    问题描述 /usr/bin/ld: cannot find -lxxx 其中xxx即表示函式库文件名称,其命名规则是:lib+库名(即xxx)+.so. 可能原因:  1 安装了,但相对应的lib版本 ...

  2. java模式之-模板方法模式

    模板方法模式是java设计模式常见的模式之一. <JAVA与模式>中写道: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法 ...

  3. autoLyout纯代码适配

    前言 1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时 ...

  4. 转: CSS中float和clear的理解

    float:浮动,比如,默认的,我们知道,div是占满一行的,现在我们想把两个div显示在一行上,那怎么办呢<div style="width:100px;">1111 ...

  5. POJ 3468 区间更新,区间求和(经典)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 72265   ...

  6. 存储过程Oracle学习(一)

    一.简介 存储过程:就是在数据库中创建的一段程序,供别人调用 .其实我感觉跟定义一个方法相似 二.无参存储过程 如下,经典的输出"Hello World"来入门存储过程 创建一个存 ...

  7. mysql数据库 安装 (原创)

    1.首先下载mysql 数据库,我安装的是mysql5.1版本,直接安装就行,但是如果以后你想在数据库里显示中文的话,要把字符集设置为gb2312 2.配置数据源odbc.  mysql-connec ...

  8. 神奇的NOIP模拟赛 T1 LGTB 玩扫雷

    LGTB 玩扫雷 在一个n m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示).LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷.请帮助他输出写了之后的棋盘 ...

  9. Android双击返回按钮退出程序

    //双击退出事件 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KE ...

  10. python遍历文件夹下的文件

    在读文件的时候往往需要遍历文件夹,python的os.path包含了很多文件.文件夹操作的方法.下面列出: os.path.abspath(path) #返回绝对路径 os.path.basename ...