class10 多态

多态简单说就是用不同的类去实现同一个接口的方法,以实现不同类自己的方法

<?php
date_default_timezone_set("PRC");
/*** 多态* 1. 只要某个对象实现了接口(instanceof),就可以直接在对象上调用接口的方法*/interface ICanEat {public function eat($food);
}// Human类实现了ICanEat接口
class Human implements ICanEat { // 跟Animal类的实现是不同的public function eat($food){echo "Human eating " . $food . "\n";}
}// Animal类实现了ICanEat接口
class Animal implements ICanEat {public function eat($food){echo "Animal eating " . $food . "\n";}
}function eat($obj){if($obj instanceof ICanEat){ $obj->eat("FOOD"); // 不需要知道到底是Human还是Animal,直接吃就行了}else{echo "Can't eat!\n";}
}$man = new Human();
$monkey = new Animal();// 同样的代码,传入接口的不同实现类的时候,表现不同。这就是为什么成为多态的原因。
eat($man);
eat($monkey);?>

class11  抽象类

抽象类是介于接口和一般类之间的一个类,它允许自身的某些方法暂时没有具体实现;但是,抽象类和接口一样,不能直接实例化为对象,必须要一个一般类去继承它,它只能作为父类被使用

<?php
date_default_timezone_set("PRC");
/*** 抽象类* 1. 抽象类允许类里面的部分方法暂时没有具体实现,这些方法我们成为抽象方法* 2. 一旦类里面有抽象方法,这个类就必须是抽象类* 3. 抽象类跟接口一样,不能直接实例化为对象*/// 抽象类前面以abstract关键字开始
abstract class ACanEat {// 没有实现的方法需要设定为抽象方法// 抽象方法需要在子类中实现 abstract public function eat($food);public function breath(){echo "Breath use the air.\n";}
}// Human类实现了ICanEat接口
class Human extends ACanEat { // 跟Animal类的实现是不同的public function eat($food){echo "Human eating " . $food . "\n";}
}// Animal类实现了ICanEat接口
class Animal extends ACanEat {public function eat($food){echo "Animal eating " . $food . "\n";}
}$man = new Human();
$man->eat("Apple");
$man->breath(); // 和Animal共用了抽象类ICanEat的breath方法
$monkey = new Animal();
$monkey->eat("Banana");
$monkey->breath();?>

这只后给大家简单介绍一下PHP中特有的一些方法(PHP特性),他们分别是

 __tostring()--能使对象当做String直接调用
__invoke()   --能使对象被当成方法被自动调用

class12

 __tostring()--能使对象当做String直接调用
__invoke()   --能使对象被当成方法被自动调用
<?php
date_default_timezone_set("PRC");
/*** 魔术方法1* 1. 当对象被当做String使用时,__tostring()会被自动调用* 2. 当对象被当成方法调用时,__invoke()会被自动调用*/
class MagicTest{public function __tostring(){return "This is the Class MagicTest.\n";}public function __invoke($x){echo "__invoke called with parameter " . $x . "\n";}
}$obj =  new MagicTest();
echo $obj;
$obj(5);  //直接在对象中传入参数5,它会被__invoke()函数接收?>

class13

  1. 当对象访问不存在的方法名称时,__call()方法会被自动调用2. 当对象访问不存在的静态方法名称时,__callStatic()方法会被自动调用
<?php
date_default_timezone_set("PRC");
/*** 魔术方法2之方法重载* 1. 当对象访问不存在的方法名称时,__call()方法会被自动调用* 2. 当对象访问不存在的静态方法名称时,__callStatic()方法会被自动调用*/
class MagicTest{public function __tostring(){return "This is the Class MagicTest.\n";}public function __invoke($x){echo "__invoke called with parameter " . $x . "\n";}public function __call($name, $arguments){echo "Calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n";}public static function __callStatic($name, $arguments){echo "Static calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n";}
}$obj =  new MagicTest();
$obj->runTest("para1", "para2");
MagicTest::runTest("para3","para4");?>

class14

__set()
__get()
isset()
empty()
unset()
__unset()
<?php
date_default_timezone_set("PRC");
/*** 魔术方法3之属性重载* 1. 在给不可访问属性赋值时,__set() 会被调用。* 2. 读取不可访问属性的值时,__get() 会被调用。* 3. 当对不可访问属性调用 isset() 和empty()时,__isset() 会被调用。* 4. 当对不可访问属性调用 unset() 时,__unset() 会被调用*/
class MagicTest{public function __tostring(){return "This is the Class MagicTest.\n";}public function __invoke($x){echo "__invoke called with parameter " . $x . "\n";}public function __call($name, $arguments){echo "Calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n";}public static function __callStatic($name, $arguments){echo "Static calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n";}// 通过这两个方法可以实现动态的对象属性public function __get($name){return "Getting the property " . $name;}public function __set($name, $value){echo "Setting the property " . $name . " to value ". $value. "\n";}public function __isset($name){echo "__isset invoked\n";return false;}public function __unset($name){echo "unsetting property " . $name;}
}$obj =  new MagicTest();
echo $obj->name . "\n";
$obj->name = "Name Value";
echo '$obj->name is set? '. isset($obj->name) . "\n";
echo '$obj->name is empty?' . empty($obj->name) . "\n";
unset($obj->name);
?>

后边几个魔术方法,具体在什么时候调用呢?

我觉得是用于容错处理的。

转载于:https://www.cnblogs.com/construtora/p/5021302.html

PHP面向对象编程(imooc)代码合集(四)相关推荐

  1. GitHub上7000+ Star的Python常用代码合集

    作者 | 二胖并不胖 来源 | 大数据前沿(ID:bigdataqianyan) 今天二胖给大家介绍一个由一个国外小哥用好几年时间维护的Python代码合集.简单来说就是,这个程序员小哥在几年前开始保 ...

  2. 收藏 | 因果推断书籍代码合集

    来源:计量经济学服务中心本文约2700字,建议阅读8分钟 本文为你介绍了因果推断书籍的代码合集. 1.Causal Inference: The Mixtape 来源: https://mixtape ...

  3. 2013计算机视觉代码合集

    注:下面有project网站的大部分都有paper和相应的code.Code一般是C/C++或者Matlab代码. 最近一次更新:2013-9-7 一.特征提取Feature Extraction: ...

  4. 预编码 matlab,无线通信-预编码-MATLAB代码合集

    无线通信-预编码-MATLAB代码合集 c 2021-2-18 下载地址 https://www.codedown123.com/72422.html 多用户MIMO预编码之类的代码,帮助初学者进行编 ...

  5. python画心形代码大全_Python代码合集看点 机器人算法、自动导航算法算法大全...

    导读:本文包含机器人算法.自动导航算法的Python代码合集.其主要特点有以下三点:选择了在实践中广泛应用的算法:依赖最少.容易阅读,容易理解每个算法的基本思想.希望阅读本文后能对你有所帮助.文章来源 ...

  6. 一、PyTorch Cookbook(常用代码合集)

    PyTorch Cookbook(常用代码合集) 原文链接:https://mp.weixin.qq.com/s/7at6y2NcYaxGGN8syxlccA 谢谢作者的付出.

  7. apicloud ajax html,基于apicloudAJAX请求代码合集

    get请求代码: api.ajax({ url:'http://m.weather.com.cn/data/101010100.html' //天气预报网站的WebService接口 },functi ...

  8. 【CV】YOLOv4最全复现代码合集(含PyTorch/TF/Keras和Caffe等)

    前言 2020年4月24日,CVer第一时间推文:大神接棒,YOLOv4来了! 2020年6月28日,CVer第一时间推文:YOLOv4-Tiny来了!371 FPS! 距离YOLOv4正式推出,已经 ...

  9. YOLOv3最全复现代码合集(含PyTorch/TensorFlow和Keras等)

    点击上方"CVer",选择"置顶公众号" 重磅干货,第一时间送达 前戏 2018年3月26日,CVer第一时间推文:YOLOv3:你一定不能错过 2019年3月 ...

  10. js时间戳(代码合集)获取(年月日,秒戳,毫秒戳,) - 综合篇

    js时间戳(代码合集)获取(年月日,秒戳,毫秒戳,) - 综合篇 官方解说:JavaScript Date 对象 W3CSchool教程: JavaScript Date 对象 一.js获取北京时间 ...

最新文章

  1. Netflix海外市场交到好运 用户数量猛增
  2. 使用思科3640实现不同网段通讯
  3. matlab矩阵分解
  4. python中color的用法_python - 如何为热图(使用plt.pcolor创建)中的NaN单元分配特定的颜色或图案,并使其显示在颜色栏中(图colorbar) - 堆栈内存溢出...
  5. Python:list 和 array的对比以及转换时的注意事项
  6. 在Linux环境下使用Apache部署ASP.NET Core
  7. 重设MYSQL数据库ROOT用户的密码
  8. 手把手搭建一个容器化+代理网关+可视化管理环境
  9. 国外PHP学习网站书籍资料汇总
  10. linux samba教程,Linux samba的配置和使用
  11. C# struct 性能损失
  12. 微课有关计算机应用基础,【计算机仿真论文】微课在计算机应用基础课的应用(共3802字)...
  13. python的pyqt5教程_python PyQt5初级教程hello world
  14. InDesign(拼合预设转曲)
  15. 管家婆软件显示服务器连接失败,管家婆软件提示“连接服务器失败”怎么办
  16. 【简介】请使用中国原子能科学研究院学位论文Latex模板
  17. 我的世界1.12.2java下载_我的世界Minecraft Java版1.12.2 pre2 宣布
  18. C#中invoke和beginInvoke
  19. 戴尔台式计算机怎么安装的,戴尔台式机重装系统教程
  20. PHP实现页面静态化、纯静态化及伪静态化

热门文章

  1. xp启动java设置_Windows XP快速启动经典六招
  2. python中where函数_如何在python中基于Where函数获取两列值
  3. 一个小型网站多少台服务器,小型企业局域网需要服务器的价格在多少左右(40台机器)...
  4. 计算机三级四级机考,2017年全国计算机等级考试四级上机编程试题一
  5. php基础 简书,php基础
  6. 工业机器视觉系统相机如何选型?(理论篇—3)
  7. 【lidar】基于YOLO的3D目标检测(激光雷达点云)课程设计
  8. xlrd.biffh.XLRDError: Excel xlsx file; not supported解决方法
  9. des vue 双倍长 解密_3DES双倍长加密 - osc_ojx9hm4t的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. python 去除str的引号 去除括号_Python基础教程:运算符以及数据类型解析