生成器
生成器基本使用
生成器提供了一种更容易的方法来实现简单的对象迭代(可以被遍历的对象),相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。
<?php
function xrange($start, $limit, $step = 1) {
if ($start <= $limit) {
if ($step <= 0) {
throw new LogicException('Step must be positive');
}
for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
} else {
if ($step >= 0) {
throw new LogicException('Step must be negative');
}
for ($i = $start; $i >= $limit; $i += $step) {
yield $i;
}
}
}
/*
* 注意下面range()和xrange()输出的结果是一样的。
*/
echo 'Single digit odd numbers from range(): ';
foreach (range(1, 9, 2) as $number) {
echo "$number ";
}
echo "\n";
echo 'Single digit odd numbers from xrange(): ';
foreach (xrange(1, 9, 2) as $number) {
echo "$number ";
}
?>
yield 关键字
生成器函数的核心是yield关键字。它最简单的调用形式看起来像一个return申明,不同之处在于普通return会返回值并终止函数的执行,而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。
魔术方法
__construct __destruct
__construct()
:类的构造函数
__destruct()
:类的析构函数
__toString
__toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。
class Foo {
public function __toString() {
return __CLASS__;
}
}
echo new Foo();
__invoke
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
class Foo {
function __invoke() {
echo "in invoke function";
}
}
$c = new Foo();
$c()