广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP用trait或组合模式实现多继承的方法
  • 377
分享到

PHP用trait或组合模式实现多继承的方法

2023-06-20 16:06:45 377人浏览 八月长安
摘要

本篇内容主要讲解“PHP用trait或组合模式实现多继承的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php用trait或组合模式实现多继承的方法”吧!PHP的类继承只能是单继承,不能多继

本篇内容主要讲解“PHP用trait或组合模式实现多继承的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习php用trait或组合模式实现多继承的方法”吧!

PHP的类继承只能是单继承,不能多继承,如果想要实现多继承的话,可以使用接口的方式来多继承,但是如果不想使用接口的方式来实现多继承的话,可以考虑使用trait来实现,当然也可以使用组合模式来实现。

trait是PHP 5.4新增的代码复用的方法,Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

通常在类中使用  use关键字声明要组合的Trait名称,而具体某个Trait的声明使用trait关键词,Trait不能直接实例化。

代码如下:

<?phptrait Hello{    public function sayHello()    {        echo 'Hello ';    }    public function aaa()    {        echo 'AAA';    }}trait World{    public function sayWorld()    {        echo 'World';    }}class MyHelloWorld{    use Hello, World;    public function sayExclamationMark()    {        echo '!';    }    // 会覆盖掉Hello中的aaa方法    public function aaa()    {        echo 'AAAAA';    }}$obj = new MyHelloWorld();$obj->sayHello();$obj->sayWorld();$obj->sayExclamationMark();$obj->aaa();// 输出:// Hello World!AAAAA

代码中使用两个trait来实现了多继承。

注意:两个trait中不能出现同样的方法,如果有同名的方法时,会产生致命错误。

注意:并且MyHelloWorld类中也有aaa方法,会覆盖Hello trait中的aaa方法。

上面的代码也可以通过组合的模式来实现,代码如下:

<?phpclass Hello2{    public function sayHello()    {        echo 'Hello ';    }    public function aaa()    {        echo 'AAA';    }}class World2{    public function sayWorld()    {        echo 'World';    }    public function aaa()    {        echo 'AAAA';    }}class MyHelloWorld2{    public $obj = [];    public function __construct()    {        $this->obj['Hello2'] = new Hello2();        $this->obj['World2'] = new World2();    }    public function sayExclamationMark()    {        echo '!';    }    public function __call($name, $arguments)    {        foreach ($this->obj as $value) {            if (method_exists($value, $name)) {               return $value->$name();                // 也可以用 return call_user_func([$value, $name]);            }        }        if (!method_exists($this->obj['Hello2'], $name) && !method_exists($this->obj['World2'], $name)) {            echo "\r\n不存在此方法";        }        return true;    }    // 会覆盖其他类的aaa方法    public function aaa()    {        echo 'AAAAA';    }}$obj = new MyHelloWorld2();$obj->sayHello();$obj->sayWorld();$obj->saywhat();$obj->aaa();$obj->sayExclamationMark();// 输出:// Hello World!AAAAA

显而易见,通过trait来实现的话代码量少得多并且可读性也要高得多。

到此,相信大家对“PHP用trait或组合模式实现多继承的方法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: PHP用trait或组合模式实现多继承的方法

本文链接: https://www.lsjlt.com/news/298559.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作