为啥PHP的多态是假多态?
答案:5 悬赏:20 手机版
解决时间 2021-03-30 18:29
- 提问者网友:温柔港
- 2021-03-30 07:46
为啥PHP的多态是假多态?
最佳答案
- 五星知识达人网友:从此江山别
- 2021-03-30 07:52
1.多态是指在面向对象中能够根据使用类的上下文来重新定义或改变类的性质和行为。
2.PHP不支持重载实现多态,但是PHP可以变向的实现多态效果。
3.php其语法特点,不支持固定变量类型,它是根据上下文来确定当前的类型是什么,即,最后一次赋值是什么类型,现在它就是什么类型。也就不存在将子类
变量赋给基类变量的说法。但php函数的参数,是可以规定类型的,如下面的show函数。如果传递一个不是此类型的参数,将会在运行时报错。
代码如下:
abstract class T{
abstract function show();
}
class T1 extends T {
public function show(){
echo "T1 from abstract class!
";
}
public function show1(){
echo "T1 not from abstract class!
";
}
}
class T2 extends T {
public function show(){
echo "T2 from abstract class!
";
}
public function show1(){
echo "T2 not from abstract class!
";
}
}
class T3 {
public function show(){
echo "in T3!
";
}
public function show1(){
echo "in T3!
";
}
}
$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();
}
?>
2.PHP不支持重载实现多态,但是PHP可以变向的实现多态效果。
3.php其语法特点,不支持固定变量类型,它是根据上下文来确定当前的类型是什么,即,最后一次赋值是什么类型,现在它就是什么类型。也就不存在将子类
变量赋给基类变量的说法。但php函数的参数,是可以规定类型的,如下面的show函数。如果传递一个不是此类型的参数,将会在运行时报错。
代码如下:
abstract class T{
abstract function show();
}
class T1 extends T {
public function show(){
echo "T1 from abstract class!
";
}
public function show1(){
echo "T1 not from abstract class!
";
}
}
class T2 extends T {
public function show(){
echo "T2 from abstract class!
";
}
public function show1(){
echo "T2 not from abstract class!
";
}
}
class T3 {
public function show(){
echo "in T3!
";
}
public function show1(){
echo "in T3!
";
}
}
$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();
}
?>
全部回答
- 1楼网友:青尢
- 2021-03-30 09:58
你猜,你猜,你猜猜猜
- 2楼网友:西岸风
- 2021-03-30 09:38
理论上来讲PHP是不支持多态的
- 3楼网友:洎扰庸人
- 2021-03-30 09:17
很显然PHP并不支持相同的函数名。
- 4楼网友:动情书生
- 2021-03-30 08:42
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){}
}
例子: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){}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯