关于PHP trait、生成器

关于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  技术开发交流群,会有意想不到的收获~~~!!!



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值