Документацию поправим.
MoKo 09.10.2012 22:45
Что же касается диагностики ошибок, с этим сложнее. :(
Немного о самой оптимизации. Она весьма эффективна, даже в среднем ее выигрыш виден, а уж в коде, где много действий, эффект часто меряется десятками процентов. Да, самому можно собрать парсер без этой оптимизации.
Суть в том, что при первом запуске метода запоминается, использует метод $result или нет, и далее при последующих вызовах:
- в случае, когда $result не используется, весь вывод метода напрямую добавляется к выводу вызывающего метода.
- в случае, когда $result используется, весь вывод метода вообще игнорируется. А любой перенос строки, пробел между операторами - это тоже вывод.
Ну и теперь по диагностике. В первом случае можно проверять наличие $result и выдавать исключение, если что-то присваивали. Но это лишнее "подглядывание" в хеш локальных переменных, то есть трата времени (но в среднем наверное меньше процента).
Во втором случае тоже можно проверять определенность $result, в этом к переменной уже есть обращение, так что здесь выдача исключения будет дешевой операцией. Но здесь-то как раз то, что возращается пустая строка всех устраивает - мало кто пишет код ^if($a){ yes }{ $result[no] }, и поэтому было решено не выдавать исключение.
Опять же, если не бросать исключение во втором случае, то странно бросать его в первом. А не бросать нельзя, поскольку просто вернуть $result уже нельзя, вывод метода уже добавлен к родителю...
Идеальный вариант - детектировать обращение к $result на этапе компиляции. Это автоматом решит все проблемы, но надо сделать это эффективно, минимально заметив компиляцию кода. Внесу это в to-do, чтобы не забылось снова.
- Про $result, Maxx [M] 09.10.2012 21:10 / 09.10.2012 21:16
- Ответ, max_rip 10.10.2012 11:11
- Ответ, Maxx [M] 10.10.2012 12:53
- Документацию поправим., MoKo 09.10.2012 22:45
- Ответ, Maxx [M] 10.10.2012 12:58
- Ответ, Misha v.3 [M] 10.10.2012 01:22