面向对象的抽象、接口和多态总结

来源:互联网 发布:9月7经济数据 编辑:程序博客网 时间:2024/06/05 16:14
一.抽象
1.抽象方法
没有方法体,也没有花括号的方法,即为抽象方法
抽象方法的写法:public|protected abstract function 方法名();
2.抽象类
使用关键字abstract修饰的类为抽象类
写法:abstract class 类名{}
含有抽象方法的类肯定是抽象类,但不是所有的抽象类中必须包含抽象方法
抽象类不能被实例化
若想使用抽象类,就必须定义一个类去继承这个抽象类,并重写父类的抽象方法
3.//抽象类不能被实例化
  //抽象类中可以没有抽象方法
  //如果一个类中存在抽象方法,那么这个类必须是抽象类
  //抽象类必须用abstract 关键字来修饰
  //抽象方法没方法体和花括号
  //抽象方法必须用abstract关键字来来修饰
  //抽象方法不能使用private进行修饰
  //如果一个子类继承了抽象类,则必须重写抽象类中的所有抽象方法
二.接口
PHP不支持多继承,即每个类只能继承一个父类,但现实中往往一个事物会有多
多种身份,比如一个可能即是医生又是运动员,这种情况就需要遵守多种约束
为了解决这个问题,引入了接口,因为接口可以同时实现多个
类中所有的方法都是抽象方法的类可以将其定义为interface(接口)
注意:
1.接口成员的可见性只能为public
2.接口成员属性只能为常量
3.接口可以继承其他接口
4.接口不能被实例化为对象,可以用过子类来实现接口,子类继承接口类时必须使用implements关键字,
不能用extends
例:class 子类名 implements 接口1,接口2...{}
5.子类必须重写接口所有的抽象方法
6.子类重写方法时不能改变参数
例:
interface 接口名称{
     常量成员 (使用const关键字来定义)
     抽象方法 (不需要使用abstract关键字)
}
7.//接口中只能声明常量,不能声明成员属性
  //接口中所有的方法都必须为抽象方法,而且接口中的抽象方法不需要也不能用abstract去修饰
  //接口中的抽象方法只能用public来修饰
  //接口不能被实例化
  //接口可以用extends去继承其他接口
  //接口可以通过子类来实现,而且一个子类可以同时实现多个接口
  //子类必须对接口中的所有抽象方法进行重写
  //重写抽象方法不能更改方法中的参数
三.多态
对象的多态性是指在父类中定义的属性或者行为被子类继承之后,实现的方式各不相同,这使得同一个属性
或行为在父类及其各个子类中呈现不同的变现形态
所谓的多态就是指一个类实例的相同方法在不同情形下有不同的表现形式


四.抽象类与接口的区别
定义:
抽象类表示该类中有可能已经有一些方法的具体定义
接口就仅仅只能定义各个方法的名称,不能有具体的实现代码在成员方法中
用法:
抽象类是子类用来继承的,当父类已有实际功能的方法时,该方法在子类中可以不必实现
实现一个接口,必须实现接口中所有定义的方法,不能遗漏一个
五.单例模式
程序运行过程中每个类只会产生一个实例化对象
实现思路:将产生的对象作为静态属性(三私一公)
//单例模式下一个类只能产生一个对象
//将实例出的对象放到一个静态属性中
//当用户需要调对象中,只需要通过类直接调用静态属性就可以了
class Test{
    public static $instance;


    //通过将构造方法设成私有方法来阻止用户在类的外部通过new来实例化对象
    private function __construct(){}


    //通过将__clone的魔术方法设为私有来阻止用户去克隆对象
    private  function __clone(){}


    //产生实例对象的方法
    public static function getInstance(){
        //在new之前判断静态属性中是否存在对象,如果存在则直接返回静态属性中的对象,如果不存在则实例化对象
        if(!self::$instance || !(self::$instance instanceof self)){
            self::$instance=new self;
        }
        return self::$instance;
    }
}
测试:
$t1=Test::getInstance();
$t2=Test::getInstance();
$t3=Test::getInstance();
//$t4= new Test();
//$t4=clone $t1;


var_dump($t1);
var_dump($t2);
var_dump($t3);
var_dump($t4);
六.工厂模式
通过一个工厂类来为不同的类创建对象
在工类类中一般只有一个实例化对象的方法
class Factory{
public static function getInstance($className){
         $object=new $className();
                     return $object;
            }
}
例:
interface Foxconn{
      public function made();
  }


  class Iphone implements Foxconn{
      public function made(){
          echo "made Iphone";
      }
  }


  class Tv implements Foxconn{
      public function made(){
          echo "made Tv";
      }
  }


  class Fridge implements Foxconn{
      public function made(){
          echo "made Fridge";
      }
  }




  class Factory{
      public static function getInstance($className){
          $obj=new $className();
          return $obj;
      }
  }




  $tvObj=Factory::getInstance('Tv');
  $iphoneObj=Factory::getInstance('Iphone');


  $tvObj->made();
原创粉丝点击