Есть интересное сравнение функционального языка Clojure с Python для отложенной загрузки и подобных функций Вот. Это заставило меня задуматься — нет ли в PHP подобной возможности? Например, когда вы делаете запрос WordPress:
$loop = new WP_Query( ... )
У вас сразу есть полный массив постов $loop->posts
и (если я не ошибаюсь), этот массив был полностью создан на конструкторе WP_Query. В Java или Python с итератором у вас обычно есть итератор базы данных-курсора, который вы вызываете функцию get-next для получения следующего элемента по мере необходимости.
Является ли причина, по которой WordPress не делает этого, из-за отсутствия такого понятия итератора в PHP или по какой-то другой причине?
Короткий ответ: да, вы можете перебирать курсор базы данных в PHP. WP_Query()
class — это удобная библиотека, чтобы обернуть это и упростить вам использование фильтров / параметров, предоставленных в этом API. В конечном итоге WordPress использует mysql_*
расширения (не рекомендуется) для текущей версии и более старых установок, однако при использовании более новой версии PHP он использует mysqli
в качестве основного соединителя базы данных.
Что касается WP_Query, его __construct()
звонки query()
который затем вызывает get_posts()
. На линия 3554 он использует global $wpdb
объект для вызова get_results()
. Это в конечном итоге называет query()
метод, (и _do_query()
внутренне) и, наконец, перебирает результаты линия 1615.
Вы можете использовать WP_Query()
, $wpdb
, или даже mysql_*
/mysqli
обрабатывать код вашей базы данных в WordPress, перечисленный от более высокого уровня абстракции до более низкого. Такие вещи, как защита от SQL-инъекций, предоставляются классами более высокого уровня, но вы имеете больший контроль над классом более низкого уровня.
Обсуждалась возможность использования более эффективных операторов доходности. Вот, и, видимо, частью сопротивления является то, что WP должен работать везде даже на древний системы — та же самая причина, по которой он использует серию jQuery 1.x, которая работает с очень старыми версиями IE.
Других решений пока нет …