Пятница. Говнокод. Парсинг плейсхолдеров.

про yield - ну это тот же while ($row = $db->fetch()) получится
да но звучать будет современней, привычней, человечней...
PHP:
foreach($db->getAll(...) as $row){}
а делать будет то как ты сказал (или я непонял как елда работает)
 
Последнее редактирование:
application (не система в смысле) так завелось
 
fixxxer, а я придумал вариант где этот способ не подойдет - когда нужно ответ куда-то передать, куда-то, где ждут массива, например в шаблон.
 
PHP:
function getAll() {
  $data = array(
      array('a' => 1),array('a' => 2),array('a' => 3)
  );
  foreach($data as $key => $val ) {
      yield $key => $val;
  }
}
$data = getAll();
echo $data[1];

Код:
Fatal error:  Cannot use object of type Generator as array in [...][...] on line 10
не говно
 
так да, работает
PHP:
$data = getAll();
print_r(iterator_to_array($data)[1]);
Код:
Array
(
  [a] => 2
)
захотелось ArrayAccess написать, который будет ленивым и данные подгружать порциями до первого найденного результата
чтоб iterator_to_array не использовать
 
WMix, ага, тоже о таком подумал) Плюс можно сделать
PHP:
foreach($data['name'] as $name => $data) {}
 
с индексами? ) иппаться, так по настоящему?
 
Я вот кстати хочу ещё сделать небольшой наброс про типизированные плейсхолдеры и их замену на значения.

Вот например, у нас есть в запросе конструкция 'where ... foo = :bar%!$@# ...', где троеточиями обозначены какие-то другие операторы в where, а конструкция '%!$@#' обозначает, что подстановку '= :bar' нам надо заменить на IS NULL, если значение 'bar' --- null, и на IN (?, ?, ..., ?), если в 'bar' находится массив.

Так вот, если заглянуть в файл грамматики для того же Постгреса (в мысклёвый не заглядывал, но думаю там что-то близкое), то можно увидеть:
Код:
/* Precedence: lowest to highest */
...
%right     '='
...
%nonassoc   IN_P
...
%nonassoc   NOTNULL
%nonassoc   ISNULL
%nonassoc   IS         /* sets precedence for IS NULL, etc */
то есть в результате наивной обработки запроса регексами мы можем получить запрос который, вообще говоря, не эквивалентен исходному (или синтаксически неправилен?)
 
Я, например, не понял.
Ну это так, мысли вслух: если достаточно продвинутая библиотека подстановки значений захочет автоматически менять в запросе оператор равенства на оператор IS NULL или оператор IN в зависимости от типа подставляемого значения, то не надо забывать, что приоритет и ассоциативность у этих операторов разная.
 
  • Like
Реакции: AmdY
достаточно продвинутая библиотека подстановки значений захочет автоматически менять

Не стоит такую магию городить, багодром гарантирован.

IS (NOT) NULL - это довольно особый случай, в 99% случаев туда и подставлять ничего не надо. А если надо, в обсуждаемой библиотеке это выносится в отдельный вызов parse. А вообще это одна из причин, почему я предпочитаю использовать для построения sql-запросов template engines. =)
 
Sad Spirit, Я пока ни за ни против, просто уточнить.
Добавив некий флаг, плейсхолдер будет обработан по особому?

(Так как я не понял "%!$@#", то) условно написав:
Код:
WHERE field = s:#value (вместо стандартного s:value)
    при value=null будет WHERE field IS NULL
    при value=array будет WHERE field IN (...)
в качестве такого флага, я сейчас написал #
 
Sad Spirit, Я пока ни за ни против, просто уточнить.
Добавив некий флаг, плейсхолдер будет обработан по особому?
Ну да, либо с флагом, либо вообще автоматически. Не уверен, что видел где-либо автоматическую замену = на in(...), но вот автоматическая замена = на is [not] null таки есть в библиотеке yaff-db, которую я выше упомянул. Я просто несколько протупил, она здесь на форуме вроде не обсуждалась, мне Фанат в личку ссылку кидал.
 
Сверху