资讯专栏INFORMATION COLUMN

PHP 特性之 trait (二)

yeooo / 723人阅读

摘要:命名冲突如果使用了多个并且多个中的命名有重复,那么这个时候就会产生一个致命的错误。避免的冲突引起的错误。但是中的属性跟方法,如果需要被外部的类使用的话,必须为,即使是也是不能被外部的类所使用的。

前面我们介绍了Trait的基本使用,下面来介绍下Trait比较复杂的用法
使用多个Trait
trait Member
{
    public  function info()
    {
        echo "this is trait,";
    }

}
trait Admin
{
    public function show()
    {
        echo  "this is admin,";
    }

}


class ShowMember
{
    use Member,Admin;

}
$Member = new ShowMember();
$Member->info();
$Member->show();

直接使用,逗号隔开,以上程序将会输出this is trait,this is admin,

命名冲突
如果使用了多个Trait,并且多个Trait中的命名有重复,那么这个时候就会产生一个致命的错误。为了正确的使用这些Trait,我们需要用insteadof来调用这些同名的方法。
trait Member
{
    public  function info()
    {
        echo "this is member info,";
    }

    public function show()
    {
        echo "this is member show,";

    }

}
trait Admin
{
    public function info()
    {
        echo  "this is admin info,";

    }

    public function show()
    {
        echo  "this is admin show,";
    }

}


class ShowMember
{
    use Member,Admin{
        Member::info insteadof Admin;//使用 Member 的info 方法来替代 Admin 的info方法
        Admin::show insteadof Member;//使用 Admin 的show 方法来替代 Member 的show方法
    }

}
$Member = new ShowMember();
$Member->info();
$Member->show();

以上程序将会输出this is member info,this is admin show,。这个时候使用了insteadof来声明了,我需要使用哪个Trait中的方法。避免的冲突引起的错误。

Trait的抽象成员
Trait和普通的类一样,也是成员变量的,也可以定义抽象方法来强制要求。
trait Member
{
    public  function info()
    {
        echo "this is member info,";
    }

    abstract public function show();

}



class ShowMember
{
    use Member;
    public function show()
    {
        // TODO: Implement show() method.
    }


}
$Member = new ShowMember();
$Member->info();
Trait的静态成员
Trait 同样是可以静态成员变量的
trait Member
{
    public  function info()
    {
        echo "this is member info,";
    }

    public static $_a = 1;
    public function show()
    {
        echo self::$_a;
    }

}



class ShowMember
{
    use Member;

}
$Member = new ShowMember();
$Member->show();//会输出1
echo $Member::$_a;//也会输出1
Trait的访问修饰符

上面很多例子可以看到 对Trait的方法,跟属性都是加有 public访问修饰符,是不是就意味着,Trait也可以使用访问修饰符呢,答案是肯定的。但是Trait中的属性跟方法,如果需要被外部的类使用的话,必须为public,即使是protected也是不能被外部的类所使用的。那么如果我需要在外部的类中对该方法进行私有化怎么办呢,下面来看一个列子

trait Member
{
    public static function show()
    {
        echo "show";
    }


}



class ShowMember
{
    use Member{
        show as private;  //将Trait中的show方法私有化
    }
    public function OutShow()
    {
        Member::show();
    }
}
$Member = new ShowMember();
$Member->OutShow();
//$Member::show(); //这个时候直接调用 show方法那么会造成致命错误

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

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

相关文章

  • PHP 特性 trait (一)

    摘要:在阅读文档的时候看到一个类是以声明的。是一种代码复用技术,为的单继承限制提供了一套灵活的代码复用机制。下面把的代码做一个修改以上代码会输出。可以看出优先级的顺序为,当前类的优先级基类。   在阅读laravel文档的时候看到一个类 是以 Trait声明的。平时在工作中从来没有用过,于是就去看了下官方文档。原来这个类早在php5.4.0就有了。可惜在项目中从来没有用过。   Trait看...

    ermaoL 评论0 收藏0
  • PHP 5.3向更高版本迁移特性

    摘要:新特性掌握的引入,可以扩展的内容,使在某种形式上实现了多重继承,更加灵活不能被实例化示例代码需要注意的是,的继承顺序来自当前类的成员覆盖了的方法,而则覆盖了被继承的方法当多个被同一个类使用的时候,会出现方法冲突的情况,使用关键词解决示 PHP 5.4新特性 掌握 traits trait的引入,可以扩展class的内容,使class在某种形式上实现了多重继承,更加灵活 t...

    macg0406 评论0 收藏0
  • 关于PHPTrait特性

    摘要:关于作者程序开发人员,不拘泥于语言与技术,目前主要从事和前端开发,使用和,端使用混合式开发。和组合的语义定义了一种减少复杂性的方式,避免传统多继承和类相关典型问题。它为传统继承增加了水平特性的组合也就是说,应用的几个之间不需要继承。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和...

    wind3110991 评论0 收藏0
  • 【日常手记】Laravel5.3

    摘要:个人网站最近刚写了一个手机在线播放的电影站使用日常手记更新使用的的查询作用域的本地作用域去自定义可复用的约束集合,方便链式调用什么是本地查询作用域本地作用域允许我们定义通用的约束集合以便在应用中复用。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和够用是最完美的追求。 个人网站:...

    kidsamong 评论0 收藏0
  • Laravel学习笔记PHP反射(Reflection) (上)

    摘要:说明中经常使用的反射特性来设计代码,本文主要学习的反射特性,来提高写代码时的设计质量。提供一套检测的两个工具包和,类似于探针一样的东西来探测这些一等公民。限于篇幅,下篇再聊下反射。 说明:Laravel中经常使用PHP的反射特性来设计代码,本文主要学习PHP的反射特性,来提高写代码时的设计质量。PHP提供一套检测class, interface, trait, property, me...

    JessYanCoding 评论0 收藏0

发表评论

0条评论

yeooo

|高级讲师

TA的文章

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