php是多继承还是单继承
本文操作环境:windows10系统、php 7、thinkpad t480电脑。
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的方法
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341