trait

Trait 关键字

介绍:
  1. PHP 是一门单继承的语言。为了实现多继承的效果, 在 5.4 以后引入了新的关键字 Trait 来解决多继承问题。
作用:
  1. 以一种优雅的方式解决了多继承问题,提升了代码的复用性。
特点:
  1. 创建方式类似于类,只需要把创建类时的 Class关键字 替换成 trait 就可了
  2. 不允许被实例化
  3. 在类中使用 use 来导入就可使用
  4. 执行优先级: 类方法 > trait 方法 > 基类方法
例子:
<?php

class  Base
{
    public function hello()
    {
        echo 'method hello from class Base' . PHP_EOL;
    }
}

trait  Hello
{

    public function hello()
    {
        echo 'method hello from Trait Hello!' . PHP_EOL;
    }

    public function hi()
    {
        echo 'method hi from Trait Hello' . PHP_EOL;
    }

    abstract public function getValue();

    static public function staticMethod()
    {
        echo 'static method staticMethod from Trait Hello' . PHP_EOL;
    }

    public function staticValue()
    {
        static $value;
        $value++;
        echo "$value" . PHP_EOL;
    }
}

trait Hi
{
    public function hello()
    {
        parent:: hello();
        echo 'method hello from Trait Hi!' . PHP_EOL;
    }

    public function hi()
    {
        echo 'method hi from Trait Hi' . PHP_EOL;
    }
}

trait HelloHi
{
    use  Hello, Hi {
        Hello::hello insteadof Hi;
        Hi::hi insteadof Hello;
    }
}


class  MyNew extends Base
{
    use HelloHi;

    private $value = 'class MyNew' . PHP_EOL;

    public function hi()
    {
        echo 'method hi from class MyNew' . PHP_EOL;
    }

    public function getValue()
    {
        return $this->value;
    }

}

$obj = new MyNew ();

$obj->hello();
//输出:'method hello from Trait Hello!'
//优先级顺序:trait中的方法又覆盖了基类中的方法

$obj->hi();
//输出:'method hi from class MyNew'
//优先级顺序:当前类中的方法会覆盖 trait 方法

MyNew::staticMethod();
//输出:'static method staticMethod from Trait Hello'
//静态方法:trait中可以定义静态方法

echo $obj->getValue();
//输出:'class MyNew'
//抽象成员:trait中可以使用抽象方法

$objOther = new MyNew();
$obj->staticValue();
//输出:1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值