首页 >后端开发 >PHP问题 >php trait用法是什么

php trait用法是什么

藏色散人
藏色散人原创
2021-05-18 10:32:191884浏览

php trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制,其使用语法如“trait ezcReflectionReturnInfo {function getReturnType() {/*1*/}...}”。

php trait用法是什么

本文操作环境:windows7系统、PHP7.1版,DELL G3电脑

1、php中的trait是啥?

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

2、PHP版本要求:

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

3、trait的使用场景:

  试想这样一种情况,当有一个方法需要在很多的类中使用时,该怎么处理?

  通常一般的处理方式会是,写一个基础类,在基类中实现这个方法,然后所有类都继承这个基类。

  这是一种处理方法,但不是最好的处理方式。通常采用继承的情况是:几个类具有很大的相似性。比如人作为一个基类,学生、工人、等继承“人”这个基类来扩展。

  由此,trait的作用就出来了,trait 可以在多个类中使用。

4、trait如何使用:

  引用PHP手册中的例子:

  例子一

<?php
trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}
 
class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
}
 
class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
}
?>

1、先声明一个trait;

2、在类中使用use将该trait引入。

  是不是非常简单(手动逃)?需要注意的是trait的优先级。

5、trait的优先级

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

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

看例子

<?php
trait HelloWorld {
    public function sayHello() {
        echo &#39;Hello World!&#39;;
    }
}
class TheWorldIsNotEnough {
    use HelloWorld;
    public function sayHello() {
        echo &#39;Hello Universe!&#39;;
    }
}
$o = new TheWorldIsNotEnough();
$o->sayHello();//输出是 Hello Universe!
?>

还有一点需要注意的是:多个trait的使用。

<?php
trait Hello {
    public function sayHello() {
        echo &#39;Hello &#39;;
    }
}
 
trait World {
    public function sayWorld() {
        echo &#39;World&#39;;
    }
}
 
class MyHelloWorld {
    use Hello, World;
    public function sayExclamationMark() {
        echo &#39;!&#39;;
    }
}
 
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>

  总结:Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。

推荐学习:《PHP视频教程

以上是php trait用法是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn