<?php

// php 中 trait 的实现

// 看上去既像类又像接口,其实都不是,Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中,
// 其作用有两个:表明类可以做什么;提供模块化实现。Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。

// php5.4开始引入trait,其目的就是在于减少代码的重复,增加代码的复用性。
trait People{

    private $runStatus = "1";

    function run()
    {
        echo $this->runStatus . PHP_EOL;
    }
}

class Student
{
    // trait 的调用方法
    use People;

    function sutdy()
    {
        $this->runStatus = 2;
    }
}

class Worker
{
    // trait 的调用方法
    use People;

    function work()
    {
        $this->runStatus = 3;
    }
}

// trait 像类一样被创建但是不会 呗声明出来
$s = new Student();
$s->sutdy();
$s->run();
// 输出 2
$w = new Worker();
$w->work();
$w->run();

// 输出 3

// trait 有像类似于像被继承的基类 所有这里就涉及到重点知识

// (敲黑板)从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

// 优先级:自身方法>trait的方法>继承的方法(就是这样子的。)
trait HelloWorld {

    public function sayHello()
    {
        echo 'Hello World!'.PHP_EOL;
    }
}

class TheWorldIsNotEnough
{
    use HelloWorld;

    public function sayHello()
    {
        echo 'Hello Universe!'.PHP_EOL;
    }
}

$o = new TheWorldIsNotEnough();
$o->sayHello();

// 输出是 Hello Universe!

// 多个trait的使用
trait Hello {

    public function sayHello()
    {
        echo 'Hello '.PHP_EOL;
    }
}

trait World {

    public function sayWorld()
    {
        echo 'World'.PHP_EOL;
    }
}

class MyHelloWorld
{
    use Hello, World;

    public function sayExclamationMark()
    {
        echo '!'.PHP_EOL;
    }
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();

QQ截图20190827104849.png

最后修改:2019 年 08 月 27 日
如果觉得我的文章对你有用,请随意赞赏