资讯专栏INFORMATION COLUMN

PHP中的Traits详解

Harriet666 / 2787人阅读

摘要:原文链接是单继承的语言,在出现之前,的类无法同时从两个基类继承属性或方法。的和语言的组合功能类似,通过在类中使用关键字声明要组合的名称,而具体某个的声明使用关键词,不能直接实例化。

原文链接:http://tabalt.net/blog/php-tr...

PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法。php的Traits和Go语言的组合功能类似,通过在类中使用use关键字声明要组合的Trait名称,而具体某个Trait的声明使用trait关键词,Trait不能直接实例化。具体用法请看下面的代码:

carName}
";
        }
    }
    class Person {
        public function eat() {
            echo "eat
";
        }
    }
    class Student extends Person {
        use Drive;
        public function study() {
            echo "study
";
        }
    }
    $student = new Student();
    $student->study();
    $student->eat();
    $student->driving();

输出结果如下:

study
eat
driving trait

上面的例子中,Student类通过继承Person,有了eat方法,通过组合Drive,有了driving方法和属性carName。

如果Trait、基类和本类中都存在某个同名的属性或者方法,最终会保留哪一个呢?通过下面的代码测试一下:

hello();
    $student->driving();

输出结果如下:

hello student
driving from drive

因此得出结论:当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,而 trait 的方法又覆盖了基类中的方法。

如果要组合多个Trait,通过逗号分隔 Trait名称:

use Trait1, Trait2;

如果多个Trait中包含同名方法或者属性时,会怎样呢?答案是当组合的多个Trait包含同名属性或者方法时,需要明确声明解决冲突,否则会产生一个致命错误。


输出结果如下:

PHP Fatal error:  Trait method hello has not been applied, because there are collisions with other trait methods on Class1 in ~/php54/trait_3.php on line 20

使用insteadof和as操作符来解决冲突,insteadof是使用某个方法替代另一个,而as是给方法取一个别名,具体用法请看代码:

hello();
$Obj1->hi();
echo "
";
$Obj2 = new Class2();
$Obj2->hello();
$Obj2->hi();
$Obj2->hei();
$Obj2->hehe();

输出结果如下:

Trait2::hello
Trait1::hi

Trait2::hello
Trait1::hi
Trait2::hi
Trait1::hello

as关键词还有另外一个用途,那就是修改方法的访问控制:

hello(); # 报致命错误,因为hello方法被修改成受保护的
    $Obj2 = new Class2();
    $Obj2->hello(); # 原来的hello方法仍然是公共的
    $Obj2->hi();  # 报致命错误,因为别名hi方法被修改成私有的

Trait 也能组合Trait,Trait中支持抽象方法、静态属性及静态方法,测试代码如下:

sayHello();
$Obj->sayWorld();
echo $Obj->getWorld() . "
";
HelloWorld::doSomething();
$Obj->inc();
$Obj->inc();

输出结果如下:

Hello
World
get World
Doing something
1
2

原文链接:http://tabalt.net/blog/php-tr...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20999.html

相关文章

  • PHP 自 5.2 到 5.6 中新增的功能详解

    摘要:本文将会介绍自起,直至中增加的新特征。弃用的功能以下几个功能被弃用,若在配置文件中启用,则会在运行时发出警告。该类的完整限定名是其中第一个反斜杠表示全局命名空间。目的在于模仿的不对,目的是为了让发布应用程序更加方便。 截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5...

    番茄西红柿 评论0 收藏0
  • php 代码复用机制--traits

    摘要:是一种为类似的单继承语言而准备的代码复用机制。因为中的变量环境是基于函数的,所以会输出博客链接代码复用机制,本文后续如有更新将会在博客更新。 提到 php 的代码复用,我们可能第一时间会想到继承,但是这种单继承语言一旦派生的子类过多,那么会产生一系列的问题,比如依赖父类、耦合性太大、破坏了类的封装性。那么有没有更好的方法来实现代码复用呢? 自 PHP 5.4.0 起,PHP 实现了另外...

    yedf 评论0 收藏0
  • 【modernPHP专题(5)】类多继承的替代方案Traits

    摘要:概述是新进入的特性,其目的就是解决的类不能多继承的问题。可以理解为一组能被不同的类都能调用到的方法集合。只需要在类中使用关键词引入即可,可引入多个,用隔开。为了解决多个在同一个类中的命名冲突,需要使用操作符来明确指定使用冲突方法中的哪一个。 概述 traits是PHP5.4新进入的特性,其目的就是解决PHP的类不能多继承的问题。Traits不是类!不能被实例化。可以理解为一组能被不同的...

    imtianx 评论0 收藏0
  • PHP知识难点TOP3,挑战一下你

    摘要:虽然容易入门,但是要想深入,还是有些路要走的,今天我们就来聊聊一些比较难理解的知识点。至于的第三种用法请看下面的。如果大家觉得这篇文章还不错,请给予一个赞或者分享给你的好友,如果你有更多好的经验或问题,请在评论中和大家分享一下。 php虽然容易入门,但是要想深入,还是有些路要走的,今天我们就来聊聊php一些比较难理解的知识点。use php从5.3.0开始引入了一个叫作命名空间的新特征...

    mdluo 评论0 收藏0
  • 解读 thinkphp5 源码(一):自动加载

    摘要:索性读一下它的源码。行载入类载入类,这个类比较重要,实现了自动加载。注册错误和异常处理机制加载惯例配置文件接下来我们看一下自动加载的实现方法。所以借助此函数可以达到自动加载。博客链接解读源码一自动加载 听说 TP5 已经 RC4 了,曾经在 RC3 的时候用它写过一个小东西。官方说从 RC4 以后改动不是太大。索性读一下它的源码。然后顺便记录一下,如有错漏,请路过大神多多指正! 入口 ...

    stormzhang 评论0 收藏0

发表评论

0条评论

Harriet666

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<