Я нахожу его самым полезным в цепочках действий, которые часто включают обнаружение ошибок, и т.д.
if ((rc = first_check(arg1, arg2)) != 0)
{
report error based on rc
}
else if ((rc = second_check(arg2, arg3)) != 0)
{
report error based on new rc
}
else if ((rc = third_check(arg3, arg4)) != 0)
{
report error based on new rc
}
else
{
do what you really wanted to do
}
, альтернатива (не использование присвоения в условии):
rc = first_check(arg1, arg2);
if (rc != 0)
{
report error based on rc
}
else
{
rc = second_check(arg2, arg3);
if (rc != 0)
{
report error based on new rc
}
else
{
rc = third_check(arg3, arg4);
if (rc != 0)
{
report error based on new rc
}
else
{
do what you really wanted to do
}
}
}
С длительной проверкой ошибок, альтернатива может убежать RHS страницы, тогда как версия присвоения в условном выражении не делает этого.
проверки на ошибки могли также быть 'действиями' — first_action()
, second_action()
, third_action()
—, конечно, а не просто проверяют. Таким образом, они могли быть проверены шаги в процессе, которым справляется функция. (Чаще всего в коде я работаю с, функции вроде проверок предварительного условия или выделений памяти, необходимых для функции для работы, или вдоль подобных строк).
Вот что я бы сделал. Я бы расширил DatePeriod
и реализовал метод toArray
:
class MyDatePeriod extends DatePeriod
{
public $dates;
public function toArray()
{
if ($this->dates === null) {
$this->dates = iterator_to_array($this);
}
return $this->dates;
}
}
$p = new MyDatePeriod(date_create('2008-01-01'),
DateInterval::createFromDateString( "+2 days" ),
date_create('2008-12-31'));
echo count($p->toArray()) . "\n"; // 183
echo count($p->toArray()) . "\n"; // 183
Интересно, может быть, итератор не запускается повторно с помощью iterator_to_array (), поэтому второй вызов начинает повторение с курсор в конце. Вы можете попробовать следующее:
$p->rewind()
$a=iterator_to_array($p);
Если итератор не может быть перемотан, вы можете попробовать клонировать объект перед его обходом, например
$p2 = clone $p;
echo count(iterator_to_array($p2));
$array = iterator_to_array($p);
Предположительно, первый вызов проходит все элементы в итераторе (т.е. вызывает next (), пока valid () не станет ложным). Разумным поведением является начало преобразования iterator_to_array с текущей позиции в итераторе - бесшумная перемотка перемотки будет негибкой и, возможно, вызовет ошибку.
Попробуйте перемотать итератор, прежде чем использовать его снова.
$p=new DatePeriod(date_create('2008-01-01'),
DateInterval::createFromDateString( "+2 days" ),
date_create('2008-12-31'));
echo count(iterator_to_array($p)); //183
$p->rewind(); // Newly added!
$a=iterator_to_array($p);
echo count($a); //0