• 关于trait()


    PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 Trait

    Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method

    • trait看上去更像是为了代码的复用而写的一个小插件,它类似于include 可以用use放在类中间,让trait里面定义的方法作为class的一部分 本身不能直接实例化,Trait的作用域在引用该Trait类的内部是都可见的(publicprivate 等等都可以) 可以理解为use关键字将Trait的实现代码Copy了一份到引用该Trait的类中 。
    
    <?php trait ezcReflectionReturnInfo {
        function getReturnType() { /*1*/ }
        function getReturnDescription() { /*2*/ }
    }
    
    class ezcReflectionMethod extends ReflectionMethod {
        use ezcReflectionReturnInfo;
        /* ... */ }
    
    class ezcReflectionFunction extends ReflectionFunction {
        use ezcReflectionReturnInfo;
        /* ... */ } ?>
    
    

    优先级

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

    
    <?php class Base {
        public function sayHello() {
            echo 'Hello ';
        }
    }
    
    trait SayWorld {
        public function sayHello() {
            parent::sayHello();
            echo 'World!';
        }
    }
    
    class MyHelloWorld extends Base {
        use SayWorld;
    } $o = new MyHelloWorld(); $o->sayHello();    #输出:Hello, World! ?> 
    
    
    
    <?php trait HelloWorld {
        public function sayHello() {
            echo 'Hello World!';
        }
    }
    
    class TheWorldIsNotEnough {
        use HelloWorld;
        public function sayHello() {
            echo 'Hello Universe!';
        }
    } $o = new TheWorldIsNotEnough(); $o->sayHello();    #输出:Hello Universe!  ?>
    
    

    多个 trait 

    通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。

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

    如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。

    引用地址:https://www.php.net/traits

  • 相关阅读:
    MyKTV项目总结
    TCP滑动窗口Sliding Window
    TCP时间戳选项Timestamp
    TCP窗口扩大选项Window Scale
    TCP最大报文段长度MSS
    TCP路径MTU发现
    TCP主动打开 之 第一次握手-发送SYN
    TCP层accept系统调用的实现分析
    Linux TCP套接字选项 之 SO_REUSEADDR && SO_REUSEPORT
    TCP层bind系统调用的实现分析
  • 原文地址:https://www.cnblogs.com/jackw1/p/12582639.html
Copyright © 2020-2023  润新知