php是单继承还是多继承?

最近经常被问到:php是单继承还是多继承?
针对这个问题,百度了一些文档,在这里做一个记录。

首先,PHP是单继承,他是不支持多继承的。面向对象的特点是封装、继承、多态。这里的继承是指类与类之间的继承关系,可以使用关键字extends实现,这里只可以继承一个类。

那么,php是否可以实现多继承呢?答案是可以的。

php可以用两种方式实现多继承。一个是使用interface实现。还有一个就是使用trait实现。

第一种:关于使用interface实现,它的原理就是一个类可以实现多个接口,我们可以定义多个接口类,如下:

interface test1 {
	public function connect();
}
interface test2 {
	public function contact();
}

一个类实现多个接口:

class MyClass implements test1,test2 {
	public function connect() {
		echo "test1";
	}
	public function contact() {
		echo "test2";
	}
}

第二种:使用trait实现。其实trait并不算是多继承,应该叫做类似多继承的功能。
什么是trait呢?
答:看上去既像类又像接口,其实都不是,Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中,其作用有两个:表明类可以做什么;提供模块化实现。Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。

//基本类
  class basicTest{
    public function test(){
      echo "hello,world\n";
    }
  }

  //traitOne
  trait traitOne{
    public function test(){
      echo "this is trait one";
    }
    public function testOne(){
      echo "one";
    }
  }

  //traitTwo
  trait traitTwo{
    // public function test(){
      // echo "this is trait two!";
    // }

    public function testTwo(){
      echo "Two";
    }
  }

  //继承基本类,并use trait
  class myCode extends basicTest{
    use traitOne,traitTwo;
    public function test(){
      echo "hehaha!!";
    }
  }

  $obj = new myCode();
  $obj->testTwo();

注意:

优先级:自身方法>trait的方法>继承的方法(就是这样子的。)
如果我们打开上述代码中的注释,会报错,因为两个trait中的方法重名了。

如何解决trait中方法重名的情况?

//使用demo1和demo2的方法,但并不是导入命名空间
//demo1和demo2种都有hello方法
    use Demo1,Demo2{
        //将Demo1的hello方法替换Demo2的hello方法
        Demo1::hello insteadof Demo2;
        //给Demo2的hello方法起别名
        Demo2::hello as Demo2Hello;
    }
//下方调用的时候
return $this->hello(); // 使用demo1的方法
return $this->Demo2Hello();  //使用demo2的方法
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值