PHP中 Trait的详解

本文详细介绍了PHP中的Trait特性,包括其用法、优先级规则及如何解决不同Trait间同名方法或属性的冲突问题。此外,还展示了如何利用Trait提高代码复用性和减少重复代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性


用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Trait的声明使用Trait关键词,Trait不能实例化

如以下代码示例:

<?php
    trait Kobe{
        public $name="kobe";
        public function bark(){
            echo "My name is kobe";
        }
    }
    
    class James{
        public function lebron(){
            echo "My name is james";
        }
    }
    
    class Curry extends James{
        use Kobe;
        public function stephen(){
            echo "My name is curry";
        }
    }
    
    $nba = new Curry();
    $nba->lebron();
    
    echo "<br/>";
    $nba->stephen();
    
    echo "<br/>";
    $nba->bark();

将会如下输出:
在这里插入图片描述
我们再测试Trait、基类和本类对同名属性或方法的处理,代码如下:

<?php
    trait Kobe{
        public $name="kobe";
        public function name(){
            echo "My name is kobe";
        }
        public function number(){
            echo "球衣 24";
        }
    }

    class James{
        public function name(){
            echo "My name is james";
        }
        public function number(){
            echo "球衣23";
        }
    }

    class Curry extends James{
        use Kobe;
        public function name(){
            echo "My name is curry";
        }
    }

    $nba = new Curry();
    $nba->name();

    echo "<br/>";
    $nba->number();

输出的结果:在这里插入图片描述
所以我们得出的的结论是:trait中的方法会覆盖基类中的同名方法,而本类会覆盖Trait中同名方法

一个类可以组合多个Trait,通过逗号相隔,如下
use trait1,trait2

当不同的trait中,却有着同名的方法或属性,会产生冲突,可以使用insteadof或 as进行解决,insteadof 是进行替代,而as是给它取别名
如下实例:

<?php
    trait trait1{
        public function name(){
            echo "My name is kobe";
        }
        public function number(){
            echo "球衣 24";
        }

    }
    trait trait2{
        public function name(){
            echo "My name is james";
        }
        public function number(){
            echo "球衣23";
        }
    }

    class nba1{
        use trait1,trait2{
            trait1::name insteadof trait2;
            trait1::number insteadof trait2;
        }
    }
    class nba2{
        use trait1,trait2{
            trait1::name insteadof trait2;
            trait1::number insteadof trait2;
            trait2::name as names;
            trait2::number as num;
        }
    }
    $NBA1 = new nba1();
    $NBA1->name();
    echo "<br/>";
    $NBA1->number();
    echo "<br/>";
    echo "<br/>";
    echo "<br/>";
    $NBA2 = new nba2();
    $NBA2->name();
    echo "<br/>";
    $NBA2->number();
    echo "<br/>";
    $NBA2->names();
    echo "<br/>";
    $NBA2->num();

输出结果为:
在这里插入图片描述

as 还可以修改方法的访问控制

<?php
	trait Nba
    {
        public function name()
        {
            echo "My name is kobe";
        }
    }

    class Kobe
    {
        use Nba {
            name as protected;
        }
    }

    class Curry
    {
        use Nba {
            Nba::name as private names;
        }
    }

    $kobe = new Kobe();
    $kobe->name();//报错,因为已经把eat改成了保护

    $curry = new Curry();
    $curry->name();//正常运行,不会修改原先的访问控制
    $curry->names();//报错,已经改成了私有的访问控制

Trait也可以互相组合,还可以使用抽象方法,静态属性,静态方法等

trait Kobe{
    public function name(){
        echo "My name is kobe ";
    }
}

trait Lebron{
    use Kobe;
    public function james(){
        echo "My name is James";
    }
    abstract public function getName();

    public function test(){
        static $num=0;
        $num++;
        echo $num;
    }

    public static function curry(){
        echo "My name is curry";
    }
}
class animal{
    use Lebron;
    public function getName(){
        echo "This is animal name";
    }
}

$animal = new animal();
$animal->getName();
echo "<br/>";
$animal->name();
echo "<br/>";
$animal->james();
echo "<br/>";
$animal::curry();
echo "<br/>";
$animal->test();
echo "<br/>";
$animal->test();

输出结果为:
在这里插入图片描述

总结

Trait 表明类可以做什么、提供模块化实现。
Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码用机制。

工作中哪里用到了trait?
可以再多个类中使用(一个方法需要在多个类中使用)
php5.4开始引入trait,其目的就是在于减少代码的重复,增加代码的复用性。

注意
如何使用Trait、以及Trait的优先级
1、先声明一个trait;
2、在类中使用use将该trait引入。
Trait优先级 :身方法>trait的方法>继承的方法


文章:以上就是PHP中trait的详解,感谢各位大佬的阅读、点赞、评论支持,希望可以帮助到你们。我是 敲码农的小Bug 我们下期见
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值