一、抽像类(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. BZOJ4002 [JLOI2015]有意义的字符串

    据说这两场加起来只要170= =而这是最简单的题目了QAQ 看到$(\frac {b + \sqrt {d} } {2} )^n$,第一反应是共轭根式$(\frac {b - \sqrt {d} } ...

  2. [Hadoop入门] - 2 ubuntu安装与配置 hadoop安装与配置

    ubuntu安装(这里我就不一一捉图了,只引用一个网址, 相信大家能力) ubuntu安装参考教程:  http://jingyan.baidu.com/article/14bd256e0ca52eb ...

  3. 碰到sshd连接不上linux时的解决办法

    1,首先更改ssh配置,可以是ssh端口连接不上服务器 cd /etc/ssh/sshd_config vi !$ Port 52113 //ssh默认的连接端口, 改为别人不知道的端口 Permit ...

  4. 浏览器Firefox新标签页默认打开地址设置

    1.地址栏输入about:config 2.找到browser.newtab.url 修改它的值为你想要的地址,如:https://www.baidu.com

  5. [vijos P1512] SuperBrother打鼹鼠

    这周好好码树状数组和线段树!!之前没写过二维树状数组,凭借一维的思路居然写了个比较像模像样的东西出来,原来我没那么脑残.唯一要注意的就是getsum四个矩形加减的边界条件,这里看了别人标程才意识到错误 ...

  6. Repeater 合并单元格

    前途页面: <asp:Repeater ID="rptList" runat="server" OnPreRender="rptList_Pre ...

  7. DataNode,NameNode,JobTracker,TaskTracker用jps查看无法启动解决办法

    查看tasktracker的50060的地址无法正常查看,主要有两个原因,一个是在/tmp目录下有以前使用2.02版本留下的文件没有删除,二个是因为端口被占用了 解决方法: 一.删除/tmp目录下所有 ...

  8. IOS开发中--点击imageView上的Button没有任何反应

    点击imageView上的Button没有任何反应:    解决方法:设置图片的userInteractionEnabled为YES,使该imageView可以与用户进行交互

  9. 统计一段文字中出现频率最高的10个单词(c语言)

    注:这次使用C语言做的这个程序.个别不懂的地方和算法部分是请教的其他同学,交流并吸收,所以收获颇多! 在程序中每一个地方我都做了注释,方便同学之间交流.也让老师容易看.程序也有很多不足的地方,但限于本 ...

  10. UIlabel设置不同的颜色

    NSString *string = @"注册过程中出现问题,致电400-650-5167联系会养车工作人员";    NSRange range = [string rangeO ...