php课程 12-41 多态是什么
一、总结
一句话总结:一种请求,多种响应(根据参数类型和数量)
1、function useUsb(Usb $usb){}这句话是什么意思?
判断$usb参数是否实现了Usb接口
2、多态是什么(详细一点)?
多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态的作用:消除类型之间的耦合关系。
现实中,关于多态的例子不胜枚举。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。
3、多态在php中的用处是什么?
在函数的参数前面指定实现的接口(约束父类(判断继承的父类)),function useUsb(Usb $usb){},用以针对不同的参数类型做不同的操作
4、php魔术方法有哪些?
1.__construct
2.__destruct
3.__toString
4.__call
5.__get
6.__set
7.__isset
8.__unset
5、php魔术方法的结构的共同特征是什么?
前面是双下划线__,
6、php面向对象魔术方法__toString()有什么用?
相当于给类增加说明,可以echo(echo本来是不能输出对象的)出对象的简短信息(写在__toString()中)
7、php面向对象魔术方法__call()的作用是什么?
用户在调用类中不存在的方法的时候自动调用__call()
比如类中没有stop()方法,你调用它,这个时候会严重错误,但是如果你在类中声明call方法,可以给用户提示这个方法不存在
二、php多态
1、相关知识
多态:
#函数可以根据类的父类或祖先不同而表现出不现的形态或结果.
function useUsb(Usb $usb){
$usb->start();
$usb->run();
$usb->stop();
}
2、代码
多态的实例(解决产品山寨问题,判断是否实现了标准(接口))
1 <?php 2 // 国际标准组织 3 interface Usb{ 4 function start(); 5 function run(); 6 function stop(); 7 } 8 9 // 小金生产的U盘 10 class Upan implements Usb{ 11 function start(){ 12 echo "<h3>usb start</h3>"; 13 } 14 15 function run(){ 16 echo "<h3>usb run</h3>"; 17 } 18 19 function stop(){ 20 echo "<h3>usb stop</h3>"; 21 } 22 23 function explode(){ 24 echo "<h3>usb explode</h3>"; 25 } 26 } 27 28 // 小吴生产的U盘 29 class Upan2{ 30 function start(){ 31 echo "<h3>usb start</h3>"; 32 } 33 34 function run(){ 35 echo "<h3>usb run</h3>"; 36 } 37 38 function stop(){ 39 echo "<h3>usb stop</h3>"; 40 } 41 42 function explode(){ 43 echo "<h3>usb explode</h3>"; 44 } 45 } 46 47 $obj=new Upan(); 48 49 $obj2=new Upan2(); 50 51 //使用Usb设备的产品(lenovo笔记本) 52 //多态介入区分符合标准的Usb产品 53 54 function useUsb(Usb $usb){ 55 $usb->start(); 56 $usb->run(); 57 $usb->stop(); 58 } 59 60 useUsb($obj2); 61 ?>
三、php魔术方法
1、相关知识
魔术方法:
1.__construct
2.__destruct
3.__toString
4.__call
5.__get
6.__set
7.__isset
8.__unset
2、代码
__toString给类增加一个说明
1 <?php 2 // 小吴生产的U盘 3 class Upan{ 4 function start(){ 5 echo "<h3>usb start</h3>"; 6 } 7 8 function __toString(){ 9 return '这是个U盘使用的类!'; 10 } 11 } 12 13 $obj=new Upan(); 14 echo $obj; 15 ?>
__call调用调中不存在的方法时自动调用
1 <?php 2 // 小吴生产的U盘 3 class Upan{ 4 function start(){ 5 echo "<h3>usb start</h3>"; 6 } 7 8 function __call($i,$j){ 9 echo '您调用的'.$i.'方法不存在,请走开!'; 10 } 11 } 12 13 $obj=new Upan(); 14 $obj->stop(1,2,3); 15 ?>