多态为面向对象编程的精华所在,js等面向过程的语言虽然可以模拟面向对象,但是毕竟模仿的永远比不上真的,所以了解而且会使用面向对象的多态是必不可少的

在了解多态之前,我们必须要了解接口,但是接口又是在抽象之上建立的.....(哎,废话真多)

一:抽象

  1. * 1.必须以abstract来修饰的方法
    * 2.不能有方法体
    * 3.可以在抽象类里面写抽象方法和非抽象方法,反过来却不行
    * 4.能存放抽象方法的类就是抽象类,
    * 5.抽象类的子类必须要用抽象类的抽象方法
  1. //抽象类(父类)
  2. abstract class Human
  3. {
  4. public $name;
  5. //抽象方法
  6. public abstract function speak();
  7.  
  8. //非抽象方法
  9. public function run(){
  10. echo "我是抽象类里面的非抽象方法";
  11. }
  12. }

  

  1. include_once "Human.class.php";
  2.  
  3. //抽象类的子类必须要用抽象类的抽象方法
  4. class Workers extends Human
  5. {
  6. function __construct($name)
  7. {
  8. $this->name=$name;
  9.  
  10. }
  11.  
  12. //抽象方法,必须要用
  13. public function speak()
  14. {
  15. echo "父类告诉我必须要用这个吃饭的而抽象方法";
  16. }
  17.  
  18. //非抽象方法,可以不用
  19. public function run(){
  20. echo "我是抽象类里面的非抽象方法{$this->name}";
  21. }
  22. }

  

二.接口

  1. * 1.接口中不需要使用abstract关键字来修饰方法,默认的就是抽象方法,所有方法都是抽象方法,没有非抽象方法
    * 2.接口中所有的属性都必须是常量,但很少在接口中使用属性;
    * 3.关键字interface来声明一个接口
    * 4.实现接口(无法继承),关键字implements,实现多个接口的时候,在后面加逗号进行添加
  1. //定义一个接口
  2.  
  3. interface Animal{
  4.  
  5. //常量成员
  6. const legs=10;
  7.  
  8. //抽象方法
  9. public function play();
  10.  
  11. }

  

  1. include_once "Animal.interface.php";
  2. //实现多个接口的时候,在后面加“,”进行添加
  3. class Dog implements Animal
  4. {
  5. public function play(){
  6. echo "狗会跑";
  7. }
  8.  
  9. }

  

三.多态

以上面的接口为例来做多态,我们在实现接口的时候,只写了一个dog类,那我想写一个cat类,它会的play行为是上树,这个时候如果我们不用多态的话,是不是得每次都实例化一次,然后再挨个挨个的实现接口,这就显的麻烦了,这个时候用多态就显得简洁一些

好,那么我在定义一个cat类来实现接口

  1. include_once "Animal.interface.php";
  2. class Car implements Animal
  3. {
  4.  
  5. public function play(){
  6. echo "猫会抓老鼠";
  7. }
  8. }

  

此时,我如果想用多态的话,需要再定义一个类来实现play这一行为,我把它定义为Boy类

  1. include_once "Dog.class.php";
  2. include_once "Car.class.php";
  3. include_once "Animal.interface.php";
  4. class Boy{
  5.  
  6. public function makeAnimalPlay(Animal $animal){
  7.  
  8. $animal->play();
  9.  
  10. }
  11.  
  12. }

  

主函数main里的代码是这个样子的

  1. function __autoload($name){
  2. $path = $name.".class.php";
  3. include_once $path;
  4. }
  5.  
  6. $dog = new Dog();
  7.  
  8. $car = new Cat();
  9.  
  10. $boy = new Boy();
  11.  
  12. $boy->makeAnimalPlay($dog);
  13.  
  14. $boy->makeAnimalPlay($cat);

  这个时候我们就完成了一个简单的多态了

  1.  

php学习十四:抽象,接口和多态的更多相关文章

  1. Java程序设计(2021春)——第四章接口与多态笔记与思考

    Java程序设计(2021春)--第四章接口与多态笔记与思考 本章概览: 4.1 接口(接口的概念和声明接口.实现接口的语法) 4.2 类型转换 4.3 多态的概念 4.4 多态的应用 4.5 构造方 ...

  2. Java程序设计(2021春)——第四章接口与多态课后题(选择题+编程题)答案与详解

    Java程序设计(2021春)--第四章接口与多态课后题(选择题+编程题)答案与详解 目录 Java程序设计(2021春)--第四章接口与多态课后题(选择题+编程题)答案与详解 第四章选择题 4.0 ...

  3. Java基础学习(四)-- 接口、集合框架、Collection、泛型详解

    接口 一.接口的基本概念 关键字为:Interface,在JAVA编程语言中是一个抽象类型,是抽象方法的集合.也是使用.java文件编写.   二.接口声明 命名规范:与类名的命名规范相同,通常情况下 ...

  4. Java学习笔记:03面向对象-接口_多态

    1.类的概念 一堆具有共同的成员变量(属性)和成员方法(功能)对象的集合 2.接口的概念 接口是功能的集合,就是方法的集合 接口中只能定义方法,不能定义普通的成员变量 而且接口中的成员方法,必须是抽象 ...

  5. 强化学习(十四) Actor-Critic

    在强化学习(十三) 策略梯度(Policy Gradient)中,我们讲到了基于策略(Policy Based)的强化学习方法的基本思路,并讨论了蒙特卡罗策略梯度reinforce算法.但是由于该算法 ...

  6. Java学习笔记——继承、接口、多态

    浮点数的运算需要注意的问题: BigDecimal operand1 = new BigDecimal("1.0"); BigDecimal operand2 = new BigD ...

  7. Scala学习十四——模式匹配和样例类

    一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...

  8. luogg_java学习_07_抽象类_接口_多态学习总结

    这篇博客总结了半天,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 , 抽象 一种专门用来做父类,被继承的. (模板) 格式: abs ...

  9. 《java JDK7 学习笔记》之接口与多态

    1.对于"定义行为"也就是接口,可以使用interface关键字定义,接口中的方法不能操作,直接标示为abstract,而且一定是public修饰的. 类要操作接口,必须使用imp ...

随机推荐

  1. Log4php 使用心得

    使用log4php 记录系统日志: 1.自动拦截php报出的错误,写日志 2.手动打印错误 set_error_handler('captureNormal',E_ERROR | E_PARSE); ...

  2. Apache HttpComponents 通过代理发送HTTP请求

    package org.apache.http.examples.client; import org.apache.http.HttpEntity; import org.apache.http.H ...

  3. Win10技巧:如何确定电脑是否适用Hyper-V虚拟机?

    既然微软想要为Hyper-V的普及铺路,那么各种套路……配套措施当然也会一并跟上.比如想要看出电脑是否符合Hyper-V配置要求,有至少两种方式可以参考. 方法一:系统信息 这方法很简单,在Corta ...

  4. ORA-12504 warning in PHP

    <?php $conn = oci_connect('proekt', 'proekt1', 'localhost:1521'); $stid = oci_parse($conn, " ...

  5. ip辅助和别名的区别

    更流畅 IP 别名和辅助 IP 地址 2017-01-25 12:05             838人阅读             评论(0)             收藏              ...

  6. js学习笔记19----getElementsByClassName函数封装

    js里面的getElementsByClassName()方法可通过某个class名获取到元素,在标准浏览器下可使用,在非标准浏览器下不可用.为了能够让这个方法兼容所有的浏览器,可以封装成如下函数: ...

  7. Semi-Supervised Classification with Graph Convolutional Networks

    Kipf, Thomas N., and Max Welling. "Semi-supervised classification with graph convolutional netw ...

  8. Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering

    Defferrard, Michaël, Xavier Bresson, and Pierre Vandergheynst. "Convolutional neural networks o ...

  9. fbset

    fbset用于读取和设置framebuffer的参数. # fbset mode "800x480-112" # D: 64.998 MHz, H: 58.034 kHz, V: ...

  10. PHP高手修炼50法——勤快篇

    .把PHP当成一门新的语言学习: .看<PHP与mysql5?web?开发技术详解>和<PHP高级程序设计:模式.框架与测试>: .不要被VC.BCB.BC.MC.TC等词汇所 ...