目录
因为无意间有在csdn看到php使用trait多继承的文章,回想起在面试的时候被经常问到php是否支持多继承,答案是否,php只支持单继承,那如何实现多继承呢。我接下来详细说明2种实现php多继承的方法:trait和接口
(1)PHP实现接口多继承
前言:
在PHP的面向对象中,接口可以继承接口。但是PHP类只能继承一个父类(类只能单继承),但是接口可以实现多继承,可以继承一个或者多个接口。当然接口的继承也是和类的继承一样使用extends关键字,要多个继承的话只要用逗号把继承的接口隔开即可。所以我们可以通过接口实现多继承.通过代码演示:
//继承单接口
<?php
interface testA{
function echostr();
}
interface testB extends testA{
function dancing($name);
}
class testC implements testB{
function echostr(){
echo "接口继承,要实现所有相关抽象方法!";
echo "<br>";
}
function dancing($name){
echo $name."正在跳舞!";
}
}
$demo=new testC();
$demo->echostr();
$demo->dancing("模特");
//运行结果
/**
接口继承,要实现所有相关抽象方法
模特正在跳舞!
**/
---------------------
//继承多接口
<?php
interface testA{
function echostr();
}
interface testB{
function dancing($name);
}
interface testC extends testA,testB{
function singing($nickname);
}
class testD implements testC{
function echostr(){
echo "接口继承,要实现父接口所有相关方法!";
echo "<br />";
}
function dancing($name){
echo $name."正在跳舞!";
echo "<br />";
}
function singing($nickname){
echo $nickname."正在唱歌!";
}
}
$demo=new testD();
$demo->echostr();
$demo->dancing("模特");
$demo->singing("周杰伦");
//运行结果
/**
接口继承,要实现父接口所有相关方法!
模特正在跳舞!
周杰伦正在唱歌!
**/
(2)php实现trait多继承
前言:
自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。
Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承(看上去既像类又像接口,其实都不是,Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中,其作用有两个:表明类可以做什么;提供模块化实现。Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制)。
从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法
所以我们可以通过trait实现.通过代码演示:
trait traitTestOne{
public function test()
{
echo "This is trait one <br/>";
}
public function testOne()
{
echo "one <br/>";
}
}
trait traitTestTwo{
public function testTwo()
{
echo "two <br/>";
}
}
class basicTest{
public function test()
{
echo "hello world\n";
}
}
class myCode extends basicTest{
use traitTestOne,traitTestTwo;
}
$test = new mycode();
$test->test();
$test->testOne();
$test->testTwo();
输出为:
This is trait one
one
two
笔者也是不断通过阅读文章和博客,进行浅层的总结。
在快结尾的时候笔者发现了一篇总结更详细和实现多继承方式更多的文章:
希望此篇文章对大家有一定的作用