zoukankan      html  css  js  c++  java
  • php使用trait遇到的一个问题

    php是单继承语言,也是就是一个类只能继承一个单独的原始类
    自PHP5.4.0起,PHP实现了一种代码复用的方法,称为Trait
    trait 是在一些类(Class)的应该具备的特定的属性或方法,而同父级的另外一些类应该避免包含这些属性和方法情况下使用的.

    类成员优先级为:当前类>Trait>父类

     1 trait funcA {
     2             // 二、
     3             // trait关键字的使用和类定义一样
     4             // 也是可以定义方法和属性的
     5             public function a () {
     6                 echo "hello ";
     7             }
     8             public function b () {
     9                 echo "word ";
    10             }
    11             public function mm () {
    12                 echo "mmp";
    13             }
    14             public function c () {
    15                 $this->a();
    16                 $this->b();
    17             }
    18         }
    19         class A {
    20             // 在类A中使用use关键字,可以实现复用func里面的方法和属性(变相的继承了func中的属性和方法)
    21             use funcA;
    22         }
    23         $a = new A();
    24         $a->c();

    上面这段代码,最终输出结果为hello hello word

    经过断点调试,发现在实例化对象的时候,上述代码中的 a方法被执行了(难道是巧合?换个姿势在测试一次)

     1 trait funcA {
     2             // 二、
     3             // trait关键字的使用和类定义一样
     4             // 也是可以定义方法和属性的
     5             public function a () {
     6                 echo "hello";
     7             }
     8             public function b () {
     9                 echo "word";
    10             }
    11             public function c () {
    12                 $this->a();
    13                 $this->b();
    14             }
    15         }
    16         class B {
    17             // 在类A中使用use关键字,可以实现复用func里面的方法和属性(变相的继承了func中的属性和方法)
    18             use funcA;
    19         }
    20         $a = new B();
    21         // $a->c();

    按道理来说应该什么也不输出的,不巧的是,在实例化的时候trait中的b方法还是被执行了(那我们再换个姿势来测试一下?)

    trait funcA {
                // 二、
                // trait关键字的使用和类定义一样
                // 也是可以定义方法和属性的
                public function test1 () {
                    echo "hello";
                }
                public function test2 () {
                    echo "word";
                }
                public function c () {
                    $this->test1();
                    $this->test2();
                }
            }
            class A {
                // 在类A中使用use关键字,可以实现复用func里面的方法和属性(变相的继承了func中的属性和方法)
                use funcA;
            }
            $a = new A();

    按照我们之前的推断,这次应该不会再输出什么了吧!!对的没错,这次是按照我们的预期来得,所以上述原因是为什么呢?我也不晓得?待大神来答疑解惑。。。。。

  • 相关阅读:
    mysql-5-aggregation
    mysql-4-functions
    mysql-3-orderby
    技术之心 | 云信和TA们携手打响防疫战
    疫情下的传统商企自救|4个Tips搭建销量过亿直播间
    那些2019年会爆发的泛娱乐黑科技风口
    流量难、获客难、增长难?增长黑客思维“解救”B端业务
    【翻译】Facebook全面推出Watch Party,可多人线上同看直播视频
    深入浅出聊一聊Docker
    C++写日志方法调试
  • 原文地址:https://www.cnblogs.com/songdongdong/p/8777522.html
Copyright © 2011-2022 走看看