关于PHP trait、生成器

来源:互联网 发布:电信宽带免费提速软件 编辑:程序博客网 时间:2024/05/31 18:34

关于PHP trait、生成器

Trait(PHP5.4.0之后才支持)

1、trait跟类相似,但是更轻便,想一下,如果A类和B类都需要一个获取地理位置的功能,我们通常的解决办法是写一个父类,里边定义一个获取地理位置的函数,然后A类和B类都继承它,缺点是让无关的类有了同一个父类,强制了AB的关联;还有一种解决办法是定义一个接口interface,A和B都实现这个接口,这样的缺点是,同样一个获取地理位置的功能要写两遍,不符合DRY(Dotn’t repeat yourself)原则;最后推荐使用trait,这更符合模块化的观念,实现如下

2、trait定义

1
2
3
4
5
6
trait Geo {
protected $myAddress;
public function getAddress() {
return $this->myAddress;
}
}

3、使用trait

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A {
use Geo;
//A类的实现
}
class B {
use Geo;
//B类的实现
}
$a = new A();
$b = new B();
$a->getAddress(); //A类获取地理位置
$b->getAddress(); //B类获取地理位置

4、小结:

其实trait就相当于一个可以放到类里的模块,有啥通用的部分可以提出来,放到trait里边,然后就不用在不同的类里重复实现了。

生成器(PHP5.5.0之后才支持)

1、生成器就是一个PHP函数,在一个函数中使用yield关键字,可以这样理解,yield是一个大数组,yield关键字在这个函数里每出现一次,就会在这个数组里加入一个元素,需要注意的是,生成器不需要返回值,只通过yield产出值,最终返回的是一个Generator对象(就是刚才那个大数组)。

2、优点是占用内存小,下边是一个生成范围内数值的例子

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
//常规做法
function makeRange($length) {
$data = [];
for($i=0;$i<$length;$i++) {
$data[] = $i;
}
return $data;
}
//这样$arr会创建一个99999个元素的数组,这样会占用很大内存
$arr = makeRange(99999);
foreach($arr as $value) {
echo $value;
}
//使用生成器,这样只会在每次迭代的时候生成不同的元素,占用内存跟$length的长度没关系
function makeRange($length) {
for($i=0;$i<$length;$i++) {
yield $i;
}
}
//这里不推荐把makeRange()赋值给一个变量,这个变量是一个Generator对象,并不是我们理解的数组
$arr = makeRange(999999);
foreach($arr as $value) {
echo $value;
}
//<span style="color: #ff0000;">推荐写法</span>
foreach(makeRange(999999) as $value) {
echo $value;
}

 想了解跟多的知识,请加入627336556  技术开发交流群,会有意想不到的收获~~~!!!