有这样一天,我要去找工作了,虽然我是从三月份开始接触PHP,到现在也就四五个月的样子,面试的时候【才接触三个多月】只要不是那种傻叉的面试官,基本不回你过深的PHP知识,也就是围绕你学过的C/C++啥的问问。

一共面了三家,三家都问了同样的一个问题:说说你理解中的C++中的封装、继承、多态。 这个问题吧,你怎么答都行,毕竟是你自己理解的。第一次吱吱呜呜说了一些,最后感觉自己都不知道自己在说什么。后来就自己总结,看到网上有一个从生物学的角度解释了一番,感觉还可以至少通俗易懂。后来又继续深入总结,在继承这一块,发现PHP虽然是单继承的语言,但还有一个比较特殊的东西,就是trait。这个翻译成中文还有比较奇葩的翻译——性状。一般我们都叫特性,或者直接叫trait。

可能好多人跟我一样有一个困惑:之前我接触PHP的时候,至少我在项目中没有发现使用过这个。后来也就是在毕设中,看到laravel的源码就使用了这个,那个时候也没有深入了解这个东西,看着像一个class。其实trait并不是一个很新的东西,在PHP5.4中加入的一种代码复用的语法,只是很少被关注而已。trait让PHP突破单继承的限制。

下面就看看一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
trait Hello
{
public function getHello()
{
echo "Hello";
}
}
trait World
{
public function getWorld()
{
echo "World";
}
}
class HelloWorld
{
use Hello, World;
public function sayHelloWorld()
{
echo "!";
}
}
$hw = new HelloWorld();
$hw->getHello();
$hw->getWorld();
$hw->sayHelloWorld();

上面的例子可以看出,trait像一个class,可以在写各种属性和方法,然后通过use关键字声明列出trait。由于PHP是单继承的语言,如果你想要继承多个基类,这个时候就需要将这些基类组合,而且这种组合是层叠,最终的效果就是一个树状的结构,但有了trait,就可以随意组合,结构简单。是不是很方便?我们在编写自己的代码前,我们可以把一些属性进行合理的划分,放在一个trait,让代码片段复用,耦合性低,代码清晰可读。

当然了还有一些需要注意的是,什么叫代码合理拆分,而不是将三两个相同的代码片段放到trait中,而是根据自己的需求来决定。