首先重要的事情说三遍:

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. 评分卡模型、WOE(Weight of Evidence)和IV(Information Value)
  2. 10.1 国庆 考试
  3. wxWidgets:wxAuiTabArt类用法
  4. 卸载 PyCharm!这才是 Python 小白的最理想的 IDE
  5. 线性规划 - 用单纯形法解决LP问题 - (Matlab、Lingo建模)
  6. 揭秘阿里云 RTS SDK 是如何实现直播降低延迟和卡顿
  7. 只调用一次_邹军:数控宏程序编程入门之程序的调用,老师傅用了都说好
  8. 一封程序员的苦逼辞职信
  9. 数字逻辑_逻辑函数化简(配项法)例子
  10. linux只打包空目录,linux 打包当前文件夹下所有文件的方法
  11. 数学分析教程(科大)——4.2笔记+习题
  12. 微信小程序 启动页自动跳转
  13. PS的对图像一些简单处理
  14. 银行会计记账方法的种类
  15. <论文阅读> DI-FODO — 3D距离传感器的快速视觉里程计
  16. pscc2018更新内容
  17. 动态规划——宠物小精灵之收服
  18. 华为路由器负载均衡_华为OSPF路由负载分担配置示例
  19. html简洁的错误页面设计,40个非常有创意的404错误页面设计
  20. python有向图遍历_用Networkx进行有向图遍历

热门文章

  1. 如何制作在线html游戏,如何做一个成功的网页游戏网站
  2. 浪子换钱系统 更新版源码
  3. oracle建表空间
  4. SQLite之C#连接SQLite
  5. 自暴自弃庸庸碌碌,或许也能活得下来,但这绝不是生活
  6. 数据结构篇十七:图的最小生成树
  7. Python备份CSDN博客的完整页面
  8. Final Cut Pro 10.4.9中文版
  9. 李开复谈苹果、微软、Google的优点和弱点是什么?
  10. FPGA入门嵌入式 块RAM双口RAM使用