问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为啥PHP的多态是假多态?

发布网友 发布时间:2022-04-06 14:31

我来回答

6个回答

懂视网 时间:2022-04-06 18:53

(六)、学以致用

问题:用面向对象的编程方式模拟出以下真实的场景,代码要能体现出多态的概念

一个农村老人小刘,养了5鸡,和5只狗,每天早上,他都会6点准时起床,煮稀饭,吃完稀饭后,然后他会提着2小桶食物去给鸡和鸭喂食,走到鸡栏边,它把其中的一桶米倒入鸡食槽里,走到狗窝旁,又把剩下的装有残羹剩菜的一桶食物倒入狗狗吃的食槽里

思路分析:

1、对象分析:里面的对象有老人,鸡,狗,食物 所以至少有这4个类

2、对象属性分析:(结合具体的场景+现实世界)

老人:名称

鸡:个数

狗:个数

食物:名称

3、对象方法分析:(结合具体的场景+现实世界)

老人:起床,煮稀饭,吃(吃稀饭),喂食

鸡:吃(啄米吃)

狗:吃(吃骨头)

食物:设置食物名称

4、综上分析,我们发现其中3个对象都有吃的方法,但是他们分别有不同的吃法,所以我们可以把这个公共方法抽离出来做成一个接口,然后让这3个类分别去实现它

具体实现代码如下:

<?php
//定义吃的接口
interface Eat{
 public function eat($food);
}
//定义食物
class Food{
 public $name = "";
 public function __construct( $name ){
 $this->name = $name;
 }
}

//定义人
class Human implements Eat{
 public $name = "";
 public function __construct( $name ){
 $this->name = $name;
 }
 //起床
 public function wakeup(){
 echo $this->name."起床了<br/>";
 }
 //煮稀饭
 public function cook($food){
 echo $this->name."煮".$food->name."了<br/>";
 }
 public function eat($food){
 echo $this->name."吃了".$food->name."<br/>";
 }
 //喂食
 function startFeed( $obj,$food ){
 if( $obj instanceof Eat ){
  $obj->eat($food);
 }else{
  echo "该对象没有实现Eat的方法<br/>";
 }
 }

 public function feed($obj, $food){
 $this->startFeed( $obj,$food );
 }
}
//定义鸡的类
class Chiken implements Eat{
 public $count = 5;
 public function eat($food){
 echo $this->count."只小鸡们,都吃了".$food->name."<br/>";
 }
}
//定义狗的类
class Dog implements Eat{
 public $count = 5;
 public function eat($food){
 echo $this->count."只小狗们,都吃了".$food->name."<br/>";
 }
}

//创建对象
$xiaoliu = new Human("小刘");
$chikens = new Chiken();
$dogs = new Dog();
//创建食物
$xfFood = new Food("稀饭");
$seedsFood = new Food("米");
$mealFood = new Food("残羹剩饭");
//老人起床
$xiaoliu->wakeup();
//老人煮稀饭
$xiaoliu->cook($xfFood);
//老人吃稀饭
$xiaoliu->eat( $xfFood );
//老人喂食开始
$xiaoliu->feed($chikens,$seedsFood);//给小鸡喂食
$xiaoliu->feed($dogs,$mealFood);//给小狗喂食

?>

运行结果为:

小刘起床了
小刘煮稀饭了
小刘吃了稀饭
5只小鸡们,都吃了米
5只小狗们,都吃了残羹剩饭

(七)、总结

1、本文主要是讲了多态的定义和作用,以及具体的实现

希望本文能给大家带来一定的帮助,谢谢!!!

热心网友 时间:2022-04-06 16:01

1.多态是指在面向对象中能够根据使用类的上下文来重新定义或改变类的性质和行为。

2.PHP不支持重载实现多态,但是PHP可以变向的实现多态效果。

3.php其语法特点,不支持固定变量类型,它是根据上下文来确定当前的类型是什么,即,最后一次赋值是什么类型,现在它就是什么类型。也就不存在将子类
变量赋给基类变量的说法。但php函数的参数,是可以规定类型的,如下面的show函数。如果传递一个不是此类型的参数,将会在运行时报错。
代码如下:

<?php
 
/**
 * 虚基类
 */
abstract class T{
    abstract function show();
}
 
/**
 * 子类
 */
class T1 extends T {
    public function show(){
        echo "T1 from abstract class!<br/>";
    }
    public function show1(){
        echo "T1 not from abstract class!<br/>";
    }
}
 
/**
 * 子类
 */
class T2 extends T {
    public function show(){
        echo "T2 from abstract class!<br/>";
    }
    public function show1(){
        echo "T2 not from abstract class!<br/>";
    }
}
 
class T3 {
    public function show(){
        echo "in T3!<br/>";
    }
    public function show1(){
        echo "in T3!<br/>";
    }
}
 
$t1 = new T1();
$t2 = new T2();
$t3 = new T3();
 
show($t1);
show($t2);
 
//报错,$t3不是T,所以被show函数调用的时候,会报类型不对的错误
//show($t3);
 
function show( T $t ){//注意参数的类型
    $t->show();
    $t->show1();
}
?>

热心网友 时间:2022-04-06 17:19

很显然PHP并不支持相同的函数名。

热心网友 时间:2022-04-06 18:53

PHP的类中不允许像C#或者Java那样定义多个名称相同但是参数顺序、类型不同的方法,而是通过对参数赋默认值的方式来实现函数的参数形式可变,看起来像多态,但是不是真实意义上的多态。
例子:php中的'多态'
function set($name='',$age=0,$sex='male'){
}
调用时:
set('Miss Gao');
set('Miss Gao',21);
set('Miss Gao',21,'women');

例子:c#中的多态,可以定义多个方法名相同的方法,只要他们的方法签名不相同
class Person
{
public void set(string name){}
public void set(string name,int age){}
public void set(string name,int age ,string sex){}
}

热心网友 时间:2022-04-06 20:45

理论上来讲PHP是不支持多态的

热心网友 时间:2022-04-06 22:53

你猜,你猜,你猜猜猜
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
报错Warning: Trying to access array offset on value of type boo... ...with message 'Illegal string offset 'BindStartDate''_百度... 网站导航出现 Warning: Illegal string offset 'parentid' in_百度... PHP提示 Warning: Illegal string offset 'name' in在XX目录下的文件... 心情压抑了,得不到释放该怎么办?拜托各位了3Q 怎样暗示我的女生 我喜欢她 要提示的 我很内向拜托各位了 3Q_百度... 你好,阿富汗内容简介 闺怨诗词古名句鉴赏(15首经典闺怨诗) 钢琴考级一到十级 ...开机密码忘了不能用指纹除了刷机还有办法吗在线等很急 汽车码表到底准不准 升仕幽灵250s码表不准 无痛人流后没出血,肚子也不痛,是怎么回事大神们帮帮忙 人流第二天出血了,肚子不疼,正常吗 人流后半个月又开始出血,血不多。肚子也不疼。什么情况呢?请专家指点 人流术后一直出血但腹部不痛是怎么回事 26号做完无痛人流,术后出血很少,也不疼,这两天出血量稍多了些,肚子也疼,吃了两天消炎药,是什么原因 衬衫裙和什么鞋子搭配 衬衫裙是什么样子的?衬衫裙怎样搭配? 长款衬衫裙怎么搭配什么外套 衬衫裙子怎么搭配图片 买了一条白色的衬衫裙,应该搭配什么鞋子才会有休闲的感觉? 衬衫裙好穿又不易踩雷,可以搭配哪些小饰品呢? 衬衫和短裙,应该怎么搭配才最完美? 衬衫裙很流行,怎么搭配能比较上档次? 冬天的一步裙怎么搭配衣服 时髦感十足的衬衫裙在穿搭时,该掌握哪些搭配技巧? 穿衬衫配裙子才好看,哪几种搭配方式,显瘦又有气质? 女生穿衬衫裙,鞋子应该如何进行搭配呢? 衬衫裙还可以怎样搭配? 汽车码表与实际码数是不是有误差 汽车换了轮毂码表还准吗? 自行车那个测车速的码表,话说那种码表准不准?有没有比较好的牌子推荐? 问道,自行车测速表准确吗?凭什么测量速度? 码表的测速准确性? GPS的速度准确还是汽车码表的速度准确? 雅马哈踏板摩托车码表准吗 码表的数值准确吗 汽车轮胎换了个大一号的码表还会不会准呀? 码表准不准,误差多大? 芝士化冻时间长了还能吃吗 在网上买的奶酪化了还能继续用吗? 买了芝士没有开封回来后化掉了并且有一点点臭味还能用吗? 夏天快递过来的奶酪都化了能吃吗 半熟芝士常温放一天会化吗? 黄油奶酪芝士运输软化还能用吗 做芝士焗饭盖上了保鲜膜放进烤箱结果保鲜膜化了,我已经把上面一层撇掉了又放了些芝士重考请问饭还能吃吗 牛肉酱怎么做好吃,红烧牛肉酱的家常做法 怎样做酱牛肉好吃又简单 最简单的酱牛肉怎么酱