首先重要的事情说三遍:

trait不是继承,和extends不一样。
    trait不是继承,和extends不一样。
    trait不是继承,和extends不一样。

请记住这个大前提,要不然在接下来的讲解中,你会很苦恼。会不断的问自己为什么,为什么!

1.用法

先上个实例:

<?php
trait trait1 {public function ceshi(){echo "ceshi";}
}
class C1{public function ceshi2(){echo "ceshi2";}
}
class C2 extends C1{use trait1;
}
$aa = new C2();
$aa->ceshi();
$aa->ceshi2();
//输出ceshiceshi2
?>

按这个实例来讲解下,不说官方语言。其实就是把一个类的东西,完全复制到你的当前类中了。(或许底层不是这样的哈,但是在使用上,我就是这么理解 的。这也有助于接下来的理解,因为他和继承是不同的。记住!)

2.特性

优先性:

这个顺序在官方的解释是这样的:

官方是把trait中的方法和继承类也做了优先级对比。我告诉你,千万不要作对比。你会蒙圈,也因此需要多记几个东西。

你只要记住。trait的优先级没有本来的类中的方法高就可以了。如果 本来得类中有了trait中相同名字的方法按照本来的类的方法执行。至于继承的类,只要记住。那就是我继承类。因为trait属于本来的类的一部分了。所以对于继承来的类。就是普通继承的特性。

多个:

trait可以有多个,use a,b,c;

抽象成员:

trait 也是有抽象方法的哈。至于用法啥的和类的抽象方法我没发现什么区别,上一段代码简单看下吧。

<?php
trait Hello {public function sayHelloWorld() {echo 'Hello '.$this->getWorld();}abstract public function getWorld();
}class MyHelloWorld {private $world;use Hello;public function getWorld() {return $this->world;}public function setWorld($val) {$this->world = $val;}
}
$a = new MyHelloWorld();
$a->setWorld('world');
$a->sayHelloWorld();
//输出 Hello world
?>

静态方法,静态变量:

静态方法就不说了,一样。静态变量是让我剧恶心的。上段代码自己看下!

可能 很多人一下 就能理解,不过我当时确实没理解,写出来一是给自己提个醒。也为那么蒙在水里的提个醒

<?php
trait Counter {static $d = 1;public function inc() {static $c = 0;$c = $c + 1;echo "$c\n";}public function ww(){self::$d++;}
}class C1 {use Counter;
}class C2 {use Counter;
}$o = new C1();
echo $o::$d;
$o->ww();
echo $o::$d;
$p = new C2();
echo $p::$d;
//输出 121
?>

对于这段代码我就在想为什么不说122。明明trait 都是counter啊。

为什么呢?因为counter已经被辅助到 c1 和  c2 里了 ,他已经变成两份了。互不干扰。

有人会说这有什么 可不明白的。很正常嘛!

那我在上一个代码

<?php
class a{static $rr = 1;
}
class Person extends a{function __construct() {self::$rr++;}static function getId() {return self::$rr;}
}
class Person1 extends a{function __construct() {self::$rr++;}static function getId() {return self::$rr;}
}
echo Person::$rr;   //output 0
echo Person1::$rr;$p1=new Person();
echo $p1::$rr;
$p2=new Person1();
echo $p2::$rr;//1123
?>

看到了吧,这就是我让你注意的,继承和trait 是不同的,就体现在这里。

多个不同的类继承同一个类,这个类的static 是一个。

多个不同的类use不同的trait,这个trait的static,已经被分成多个放到了每个类中。

这里要注意哈!

3.注意点

1.相同的方法名会被覆盖,可是相同的变量名会报有问题(完全相同的变量和赋值,7.0以下警告,7.0以上不报错。不过不要尝试这个东西,别给自己找trouble,好吧!)

4.解决冲突

1.方法冲突

就是本类和trait的方法名相同了。

<?php
trait A {public function smallTalk() {echo 'a';}public function bigTalk() {echo 'A';}
}trait B {public function smallTalk() {echo 'b';}public function bigTalk() {echo 'B';}
}class Talker {use A, B {B::smallTalk insteadof A;A::bigTalk insteadof B;}
}class Aliased_Talker {use A, B {B::smallTalk insteadof A;A::bigTalk insteadof B;B::bigTalk as talk;}
}
$dd = new Aliased_Talker();
$dd->bigTalk();
$dd->talk();
$dd->smallTalk();
//输出 ABb
?>

看代码我觉得聪明的你应该可以明白

讲解下两个关键的东西:

insteadof  前面的是要的 用签名的 替换掉 后面的

as 别名,很简单

trait这个东西在laravel用的很多,所以今天总结了一下

trait的用法 解决多继承问题(不过它并不是继承,一定要清楚明白)相关推荐

  1. 【转】PHP之Trait详解 以及 trait 冲突的解决 insteadof

    PHP之Trait学习!! (转)PHP之Trait详解 (转)trait 冲突的解决 insteadof

  2. php中 继承中的概念,JavaScript_JavaScript中的继承方式详解,js继承的概念 js里常用的如下 - phpStudy...

    JavaScript中的继承方式详解 js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于 ...

  3. 黑马毕向东Java课程笔记(day07):面向对象(第三部分)继承+抽象类+模板方法设计模式+接口+final+继承补充(就业班)

      在这一部分中,我们将讲解有关继承的相关内容,包括继承的概述.继承的特点.super关键字.函数覆盖.子类的实例化过程.final关键字这几个部分的内容. 1.继承的概述以及特点 1.1.概述    ...

  4. 继承和多态 3.0 -- 菱形继承

    单继承和多继承 C++的继承方式是支持单继承和多继承的,首先看一下代码,分清单继承和多继承 单继承 class A { public:int _a; };class B :public A { pub ...

  5. JAVA继承类phone_JAVA(9)继承与多态

    继承与多态 .抽象类.接口 继承: 继承是类与类的一种关系 java中的继承是单继承 继承的好处: 子类拥有父类的所有属性和方法.(修饰符不能是private) 实现代码的复用 语法规则: class ...

  6. C++ 面向对象(一)继承:继承、对象切割、菱形继承、虚继承、继承与组合

    目录 继承 继承的概念 继承方式 基类与派生类的赋值转换 作用域与隐藏 派生类的默认成员函数 友元与静态成员 友元 静态成员 多继承 菱形继承 虚继承 继承和组合 什么是组合 如何选择组合和继承 继承 ...

  7. c/c++入门教程 - 2.4.6 继承、公共继承、保护继承、私有继承、virtual虚继承(概念、语法、方式、构造和析构顺序、同名成员处理、继承同名静态成员处理、多继承语法、菱形继承、钻石继承)

    目录 4.6 继承 4.6.1 继承的基本语法 4.6.2 继承方式 4.6.3 继承中的对象模型 4.6.4 继承中构造和析构顺序 4.6.5 继承同名成员处理方式 4.6.6 继承同名静态成员处理 ...

  8. 面向对象:继承(经典类新式类继承原理、属性查找)、派生

    继承: 继承是指类与类之间的关系,是一种"什么"是"什么"的关系. 继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在Python中,新建的类 ...

  9. ☆ C++ 继承与派生(包括虚继承)

    在友元类中我们知道,一旦在一个类中声明了友元类,那么友元类便拥有了访问该类的所有权限,可以在自己的类中对声明自己的类进行一系列操作. 友元类主要目的是为了拓展友元类的功能,但是友元类的权限未免太多了, ...

最新文章

  1. ubuntu16.04安装opencv3.4.1教程
  2. 使用verdaccio 搭建npm私有仓库
  3. 软件测试响应时间原则,对于性能测试结果的分析原则
  4. php 内容自动生成word文档,php生成word文档的例子
  5. Action请求后台出现Response already commited异常解决方法
  6. linux命令awk
  7. 【算法】SVM分类精度为0,结果很烂怎么办?
  8. [功能发布]Excel催化剂2周年巨献-网页数据采集功能发布,满足90%合理场景使用...
  9. Qt UDP的初步使用
  10. gcn语义分割_语义分割该如何走下去?
  11. 通过德雷福斯模型探寻成长之路
  12. BPMN 2.0 流程设计
  13. android6.0 goldfish内核,ubuntu16.04下编译android-goldfish-3.4内核源码(android6.0.1系统源代码)...
  14. 十五道Python小案例,学会这些,Python基础已过关!
  15. 小程序报错 出现脚本错误或者未正确调用 Page()
  16. 计算机安装win10系统还原,解决win10电脑一键还原教程
  17. Javascript面试题 把AaaBbbcccc 变成AaaBbbCcc
  18. 小白学语句:省市区选择(带全国省市区数据)
  19. 《操作系统真象还原》第九章 ---- 终进入线程动斧开刀 豁然开朗拨云见日 还需解决同步机制才能长舒气
  20. 【毕业设计】43-基于单片机的红外无线防盗报警系统设计与实现(原理图工程源文件+源代码+实物图+答辩论文)

热门文章

  1. 香农密码理论汇总:完善保密性
  2. 推荐几款基于 Markdown 语法在线制作简历的平台
  3. Python 从文件in162.txt中连续读入10个以磅为单位的重量值
  4. P2026 求一次函数解析式【题解】
  5. idc服务器排名戴尔型号,IDC排名或gartner的排名
  6. 程序员一小时赚50,这就是别人眼中的高薪职业
  7. stable-baselines3学习之Tensorboard
  8. INT3断点和硬件断点
  9. 微信7种支付应用场景
  10. 漂亮国站-亚马逊跨境电商平台新规定