• 西安市:构建“五方联动”社会治理新格局 2019-06-23
  • IP定向--云南频道--人民网 2019-06-23
  • 育儿十大坎 新手妈妈快快get起来 2019-06-21
  • 吉林:让更多农村孩子参加少年宫活动 2019-06-21
  • 美国发起贸易战,我们要让世界知道美元、美债并不可靠 2019-06-05
  • 紫光阁中共中央国家机关工作委员会 2019-05-31
  • 监察体制改革后 湘西半年72名公职人员主动交代问题 2019-05-12
  • 媒体宣传报道重庆日报 王国平:扮靓重庆两江四岸” 让城市有机更新 2019-04-26
  • 我相信“交警雨中护送高考生”是真,“交警雨中护送高考生”反被该高考生家长投诉是假。 2019-04-16
  • 14名消防员日巡逻28公里 洗冷水澡 2019-04-10
  • 靶壕有了“蓝军”,百发百中的“神枪手”练起来 2019-04-10
  • 不是秀强大了,别人就会来做朋友,这逻辑不对 2019-04-01
  • 候选企业:中国石油呼和浩特石化公司 2019-03-26
  • 航天员沙漠野外生存训练完美收官!为第一天团打call 2019-03-25
  • 请问,建立市场经济后,原计划经济哪里去?改革后,我们还在实行计划经济,为何没有提及? 2019-03-25
  • 频道栏目
    神奇公式秒杀全国11选5 > 程序开发 > Web开发 > php > 正文
    PHP5.4以后新增的trait功能使用介绍
    2018-07-19 11:23:02         来源:qq_29735775的博客  
    收藏   我要投稿

    神奇公式秒杀全国11选5 www.2zfa.com trait是php5.4以后新增加的一个功能,可以将多个类中,共用的一些属性和方法提取出来做来公共trait类,就像是装配汽车的配件,如果你的类中要用到这些配件,就直接用use导入就可以了,相当于把trait中的代码复制到当前类中.

    因为trait不是类,所以不能有静态成员,类常量,当然也不可能被实例化。

    其实一个类中的代码,可以分为二大部分:一是我们自己写的代码,暂且叫私有代码吧,还有一部分就是公共代码了,之前主要是由父类代码组成。现在你的类中的公共代码又多一个新成员:trait类代码。

    如果说:继承可以纵向扩展一个类,那么trait就是横向扩展一个类功能

    下面以实例进行演示:
    //1创建一个trait类Test1

    hello1(); //访问trait类Test1中的hello1()
    echo '

    '; echo $obj->name; //访问ttrait类Test1中的$name属性 echo '
    '; echo $obj->hello2(); //访问ttrait类Test1中的hello2()

    trait可以互相嵌套,一个trait类中可以用use导入另一个trait类,理解成代码复制就可以了.

    例如本例中,在Test2中要用到Test1中的代码,我们只要改动二个地方就可以了。

    一是在Test2中用use Test1;导入Test1中的代码,

    二是在Demo1类中的,去掉对Test1的引用,只保留对Test2的引用,想想这是为什么?给大家当作一个思考题吧~

    修改后的代码如下:

    //1创建一个trait类Test1

    name;
    }
    }
    //3.创建Demo1类
    class Demo1
    {
    // use Test1, Test2;
    use Test2;
    }
    //进行测试
    $obj = new Demo1;
    echo $obj->hello1(); //访问trait类Test1中的hello1()
    echo '

    '; echo $obj->name; //访问ttrait类Test1中的$name属性 echo '


    '; echo $obj->hello2(); //访问ttrait类Test1中的hello2()

    刚才说过,类中导入的公共代码,除了trait方法集,还可以有父类,如果在子类中访问父类中的成员,大家应该很熟悉了,现在一个类除了可以从父类继承成员,还可以从trait类中继承,那么有一个问题就不可避免了,如果父类和trait类中的成员命名冲突怎么办?说人话,就是重名了怎么办?下面我们以方法重名来演示一下处理方案。

    再创建一个类Demo,做为Demo1类的父类。

    //3.创建父类Demo

    class Demo
    {
    //在父类中创建一个与Test2重名的方法hello2()
    public function hello2()
    {
    return '父类Demo::hello2()';
    }
    }

    代码如下:

    //1创建一个trait类Test1
    trait Test1
    {
    public $name = 'PHP中文网'; //trait类中可以用属性
    public function hello1() //trait类中主要成员是方法
    {
    return 'Test1::hello1()';
    }
    }
    //2.创建triat类Test2
    trait Test2
    {
    use Test1;
    function hello2()
    {
    //在Test2中访问Test1中的属性name,注意语法与普通类是一样的
    return 'Test2::hello2()'.$this->name;
    }
    }
    //3.创建父类Demo
    class Demo
    {
    public function hello2()
    {
    return '父类Demo::hello2()';
    }
    }
    //4.创建Demo1类
    class Demo1 extends Demo
    {
    // use Test1, Test2;
    use Test2;
    }
    //进行测试
    $obj = new Demo1;
    echo $obj->hello1(); //访问trait类Test1中的hello1()
    echo '

    '; echo $obj->name; //访问ttrait类Test1中的$name属性 echo '


    '; echo $obj->hello2(); //访问ttrait类Test1中的hello2()

    再次访问,会发现,结果与之前完全一样没有任何变化,父类Demo中的hello2方法好像隐身了,压根不存在一样的。事实上,父类Demo中的hello2方法当然是存在的,只是被trat类Test2中的同名方法hello2覆盖掉了,原因就是:trait类中的同名方法,访问优先级大于父类的同名方法。

    如果我们就想访问父类中的hello2方法,怎么办呢?只有一个办法,要么父类方法改名,要么Test2中的方法改名,我们把Test2中的hello2方法改成hello3,再次访问,就可以看到父类的执行结果了。

    那么,我们再进一点想一下,如果在子类也有一个hello2方法呢?那么结果会是什么样?

    我们来试一下,在Demo1类中添加如下代码:

    //4.创建Demo1类
    class Demo1 extends Demo
    {
    // use Test1, Test2;
    use Test2;
    //在Demo1类中创建与Test2和父类Demo中同名的方法hello2()
    public function hello2()
    {
    return 'Demo1::hello()';
    }
    }

    浏览器再次方法,果然不出所料,子类Demo1中的hello2方法的执行结果覆盖掉了Test2中的同名方法

    现在我们总结一下在同一个类中,同名方法的优先级:子类>Trait类>父类,与就是说,谁离调用者越近,谁的优先级就越高。

    下面我们再讨论最后一个问题:如果trait类中方法重名了,怎么办?如果是trait类中被所有类共享的方法集,重名的可能性是非常大的。

    下面我们修改一下代码,删除一些用不到代码:

    //1创建一个trait类Test1
    trait Test1
    {
    public function hello()
    {
    return 'Test1::hello()';
    }
    }
    //2.创建triat类Test2
    trait Test2
    {
    function hello()
    {
    return 'Test2::hello()';
    }
    }
    //3.创建类Demo
    class Demo
    {
    use Test1, Test2{
    //用Test1中的hello()方法替代Test2中的同名方法
    Test1::hello insteadof Test2;
    //Test2中的hello()方法用别名访问
    Test2::hello as test2Hello;
    } //这里千万不要加分号 ;
    }
    
    //进行测试
    $obj = new Demo;
    echo $obj->hello(); //访问Test1中的hello()
    echo '

    '; echo $obj->test2Hello();//别名访问Test2中的hello()

    点击复制链接 与好友分享!回本站首页
    上一篇:PHP 身份证验证功能代码实现
    下一篇:在php里判断手机号的代码教程
    相关文章
    图文推荐
    点击排行

    关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 神奇公式秒杀全国11选5

    版权所有: 神奇公式秒杀全国11选5--致力于做实用的IT技术学习网站

  • 西安市:构建“五方联动”社会治理新格局 2019-06-23
  • IP定向--云南频道--人民网 2019-06-23
  • 育儿十大坎 新手妈妈快快get起来 2019-06-21
  • 吉林:让更多农村孩子参加少年宫活动 2019-06-21
  • 美国发起贸易战,我们要让世界知道美元、美债并不可靠 2019-06-05
  • 紫光阁中共中央国家机关工作委员会 2019-05-31
  • 监察体制改革后 湘西半年72名公职人员主动交代问题 2019-05-12
  • 媒体宣传报道重庆日报 王国平:扮靓重庆两江四岸” 让城市有机更新 2019-04-26
  • 我相信“交警雨中护送高考生”是真,“交警雨中护送高考生”反被该高考生家长投诉是假。 2019-04-16
  • 14名消防员日巡逻28公里 洗冷水澡 2019-04-10
  • 靶壕有了“蓝军”,百发百中的“神枪手”练起来 2019-04-10
  • 不是秀强大了,别人就会来做朋友,这逻辑不对 2019-04-01
  • 候选企业:中国石油呼和浩特石化公司 2019-03-26
  • 航天员沙漠野外生存训练完美收官!为第一天团打call 2019-03-25
  • 请问,建立市场经济后,原计划经济哪里去?改革后,我们还在实行计划经济,为何没有提及? 2019-03-25
  • 22选5复式一等奖多少钱 8波篮球比分 056期六肖中特 彩票中奖后惨痛的教训 p3开机号近十期号码查询 安徽快3预测一定牛 中国体彩老11选5 体彩十一运夺金玩法 黑龙江22选5五行走势图 2019年福州市彩票中奖 安徽十一选五最新开奖 彩票论坛1700 云南时时彩五星走势图 3d011期精英心水论坛 新疆11选5专家推荐号码