Почему этот код так странно себя ведет?
Потому что любая функция, содержащая yield, возвращает генератор, даже если этот yield недостижим при вызове функции. То есть, при вызове функции test() возвращается объект-генератор, сама функция не отрабатывает, а уже при вызове генератора срабатывает функция, возвращая значение, если сработает yield.
Идеальный пример опыта "у таракана уши в ногах". 
РНР выдает тебе ошибку, потому что ты неправильно используешь генератор. О чем тебе чистым английским языком и сообщает. А условия тут не при чем. 
Перепиши свой опыт БЕЗ условия, function test(){
    yield 1;
}
echo test();
И подумай, причем здесь вообще if.