玥殇 发表于 2018-12-12 10:45:48

在 PHP 中使用 `yield` 来做内存优化

http://i2.运维网.com/images/blog/201803/14/8a0d134badb211d45253725ba06c544e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  你有没有想过 "在 PHP 中使用 yield 会有什么益处",我将为你节省一些谷歌搜索的时间; 我列出了一些要向你介绍的要点来全面认知 yield:
  1.什么是 yield。

[*]yield & return 的区别。
[*]  yield 有什么选项。
  4.结论。
  5.参考。
[*]什么是 "yield"
  生成器函数看上去就像一个普通函数, 除了不是返回一个值之外, 生成器会根据需求产生更多的值。
  来看以下的例子:
  function getValues() {
  yield 'value';
  }
  // 输出字符串 "value"
  echo getValues();
  当然, 这不是他生效的方式, 前面的例子会给你一个致命的错误: 类生成器的对象不能被转换成字符串, 让我们清楚的说明:

[*]"yield" & "return" 的区别
  前面的错误意味着 getValues() 方法不会如预期返回一个字符串,让我们检查一下他的类型:
  function getValues() {
  return 'value';
  }
  var_dump(getValues()); // string(5) "value"
  function getValues() {
  yield 'value';
  }

  var_dump(getValues()); //>  生成器 类实现了 生成器 接口, 这意味着你必须遍历 getValue() 方法来取值:
  foreach (getValues() as $value) {
  echo $value;
  }
  // 使用变量也是好的
  $values = getValues();
  foreach ($values as $value) {
  echo $value;
  }
  但这不是唯一的不同!
  一个生成器运行你写使用循环来迭代一维数组的代码,而不需要在内存中创建是一个数组,这可能会导致你超出内存限制。
  在下面的例子里我们创建一个有 800,000 元素的数字同时从 getValues() 方法中返回他,同时在此期间,我们将使用函数 memory_get_usage() 来获取分配给次脚本的内存, 我们将会每增加 200,000 个元素来获取一下内存使用量,这意味着我们将会提出四个检查点:
  
页: [1]
查看完整版本: 在 PHP 中使用 `yield` 来做内存优化