zoukankan      html  css  js  c++  java
  • php面向对象编程_2

    1, 抽象类 ,用abstract关键字来修饰一个类,这个类就是抽象类;如果用abstract关键字来修饰一个方法,这个方法就是抽象方法,如果是抽象方法就不能实现(即抽象方法只能声明,不能定义)。

    抽象类的样式:

    abstract 类名{

    成员变量;

    abstract 成员方法

    }

    为什么设计抽象类这个技术?

    在实际开发中,我们可能有这样一种类,是其他类的父类,但是它本身并不需要实例化。主要用途是让子类来继承,这样可以达到代码复用。同时利于项目设计者,设计类。比如,项目经理安排手底下多人编写某项目代码,为了统一管理,项目经理可以先写一个项目的抽象类,其他人在抽象类基础上进行编写。

    abstract class Animal{
        public $name;
        protected $age;
    
        abstract public function cry();
        public function getName(){
            return $this->name;
        }
    }
    class Cat extends Animal{
        public function cry(){
            echo "喵喵叫";
        }
    }
    $cat1 = new Cat();
    $cat1->cry();
    echo $cat1->getName();
    

      

    抽象类注意事项:

    (1),抽象类不能被实例化。

    (2),抽象类不一定包含abstract方法,也就是说抽象类可以没有抽象方法,可以有实现了的方法。。

    (3),如果一个类中,只要有抽象方法,则该类必须声明为抽象类。

    (4),抽象方法没有函数体,即抽象方法只有声明,没有定义。

    (5),如果A类继承了抽象类B,则要求A类实现从B类继承的所有抽象方法。

    2, 接口,接口是更加抽象的抽象类,抽象类里的方法可以有方法体,接口里的所有方法都没有方法体。接口体现了程序设计的多态和高内聚低耦合的设计思想。

    (1),接口的实例化

    /模拟USB接口
    interface iUsb{
        public function start();
        public function stop();
    }
    
    //编写相机类,让他去实现接口
    //1,当一个类实现了某个接口,则要求该类必须实现这个接口的所有方法
    class Camera implements iUsb{
        public function start(){
            echo "相机开始工作";
        }
        public function stop(){
            echo "相机停止工作";
        }
    }
    
    //手机类
    class Phone implements iUsb{
        public function start(){
            echo "手机开始工作";
        }
        public function stop(){
            echo "手机停止工作";
        }
    }
    
    $camera1 = new Camera();
    $camera1->start();
    $camera1->stop();
    
    $phone1 = new Phone();
    $phone1->start();
    $phone1->stop();
    

    (2)接口使用的基本语法,接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来。

    Interface 接口名{

    //属性

    //方法

    }

    接口中方法都不能有方法体,只能声明,没法定义。

    (3)如何实现接口

    Class 类名 implements 接口1,接口2{

    }

    (4)什么时候使用接口,(4.1)比如架构师订下规范,让别的程序员来实现;比如架构师做一个学生管理系统。定义接口

    interface StuManagerInterface{
        public function addStudent($stu);  //$stu为对象
        public function delStudent($id);
        public function updStudengt($stu);
    }
    给程序员
    class StuManage{
        public function tianjiaxuesheng(){
            
        }
    }
    

      

    (4.2)多个类(类之间无继承关系,是平级的)这些类都要去实现某个功能。

    (5)接口相关细节知识

    (5.1)接口不能实例化;

    (5.2)接口中所有方法都不能有主体,只能声明,没有定义;

    (5.3)一个类可以实现多个接口,必须用逗号隔开;

    class 类名 implements 接口1,接口2{}

    (5.4)接口中可以有属性,但必须是常量,并且是public的;

    interface iUsb{
        const A = 90;
    }
    echo "ok".iSub::A;
    class B implements iUsb{
        public function aaa(){
            iSub::A
        }
    }
    

      (5.5)接口的方法都是public

    (5.6)一个接口不能继承别的类,但是可以继承别的接口,类只能继承一个类,接口可以继承多个接口。一个类实现接口,必须将此接口的方法,以及此接口的所有父接口的方法实现。

     

    interface iUsb2{
        public function a();
    }
    interface iUsb3{
        public function b();
    }
    interface iUsb extends iUsb2,iUsb3{
        const A = 90;
        public function test();
    }
    class Class1 implements iUsb{
        public function a(){}
        public function b(){}
        public function test(){}
    }
    

    (6)继承与接口的比较

    php的继承是单继承,也就是一个类最多只能有一个父类,这种单继承的机制可保证类的纯洁性,比C++中的多继承机制简洁。但是不可否认,对子类功能的扩展有一定影响,所以我们认为:

    (6.1)实现接口可以看作是对继承的一种补充,还有一点,继承是层级式的,不太灵活。如下图所示,这种结构修改某个类会打破这种继承的平衡,而接口就没有这样的麻烦,因为它只针对实现接口的类才起作用。

     

    (6.2)实现接口可在不打破继承关系的前提下,对某个类功能扩展,非常灵活。  

    3,final

    (3.1)如果我们希望某个类不被其他的类来继承(可能因为安全原因)。可以使用final。如下,类B没法继承类A。

    final class A{
    
    }
    class B extends A{
    
    }
    echo "ok";
    

     (3.2)final成员方法不能被子类覆盖,可以被继承。

    class A{
        final public function getRate($salary){
            return $salary*0.08;
        }
    }
    class B extends A{
        public function getRate($salary){
            return $salary*0.01;
        }
    }
    $b = new B();
    echo $b->getRate(100);

    (3.3) final不能修饰成员变量。

    4,const,常量,不希望某个成员变量被修改,希望该变量的值是固定不变的,这时可以用const去修饰该成员变量,这样这个变量就自动成为常量。

    (4.1)基本用法:const 常量名 = 值;

    访问:类名::常量名或接口名::常量名

    (4.2)常量名应该全部大写,并且前面不加$。

    class A{

    const 常量名=赋初值;

    }

    interface 接口名{

    const 常量名=赋初值;

    }

    (4.3)因为常量没法修改,所以在声明时候直接赋值。

    (4.4)常量默认是public。在声明时候不要加修饰符号。

    class A{
        const TAX_RATE=0.08;
        public function payTax($val){
        return $val*A::TAX_RATE; //self:: TAX_RATE也正确
        }
    }
    $a = new A();
    echo $a->payTax(200);
    

    (4.5)在类的外部访问常量,类名::常量名;在类的内部,类名::常量名或self::常量名。

    (4.6)常量可以被子类继承。

    (4.7)常量是属于一个类的,而不是某个对象的。

  • 相关阅读:
    python 合并 Excel 单元格
    python 设置 Excel 表格的行高和列宽
    Python 用 openpyxl 模块统计 Excel 表格中的数据,以字典形式写入 py 文件
    python 打印字母阶梯和金字塔
    python 用 openpyxl 读取 Excel 表格中指定的行或列
    Python 的 filter() 函数
    Python 的 map() 函数
    python 之 range() 函数
    python 的 reduce() 函数
    python 之 lambda 函数
  • 原文地址:https://www.cnblogs.com/usa007lhy/p/4898669.html
Copyright © 2011-2022 走看看