Есть ли что-то в PHP, эквивалентное LINQ в C #?
Существует PHPLinq – LINQ для PHP .
Попробуйте YaLinqo . Это лучший LINQ для PHP.
Вот сравнительная таблица:
(Разработчик YaLinqo здесь.)
В настоящее время существует три основные реализации LINQ в PHP:
YaLinqo – самая минималистическая библиотека-архитектура (4 класса), но самая функциональная, самая результативная, с лучшей документацией и единственной поддержкой «струнных лямбдов».
Ginq – библиотека среднего размера (70 классов), наравне с YaLinqo в количестве функций, примерно в 1,5-3 раза медленнее, содержит пользовательские коллекции, итераторы и сопоставления, документация содержит в лучшем случае типы аргументов.
Pinq – огромная библиотека (500 классов), поддерживает синтаксический анализ PHP и преобразование в SQL и все остальное, намного медленнее, чем остальные, имеет красивый веб-сайт, но его документация средняя, а функциональность отсутствует.
Другие библиотеки не стоит упоминать (um, ладно, LINQ для PHP, Phinq, PHPLinq и Plinq). Они едва тестируются, оценки в них не ленивы, они полагаются на странные концепции, чуждые как PHP, так и .NET-разработчикам. PHPLinq является единственным, который фактически поддерживает базы данных, но он больше похож на DAL для генерации SQL с фиксированным порядком вызовов, а не LINQ.
Если вы спросите меня, какую библиотеку выбрать, я бы просто сказал использовать YaLinqo, если вам нужно работать с массивами и объектами и любой библиотекой ORM (не LINQ), когда вам нужно работать с базами данных. Но я попытаюсь объяснить, почему.
YaLinqo, безусловно, самый быстрый из библиотек. Он разработан так, чтобы быть быстрым: он полагается только на генераторы (которые производят самые быстрые итераторы); он использует только массивы (без специальных коллекций, реализованных как оболочки вокруг массивов). Его эволюция избавляет от медленных и устаревших функций: удаление пользовательских коллекций, удаление явных итераторов; и ухудшение качества кода, если оно повышает производительность: выбор между несколькими функциями сортировки вместо использования одного универсального решения, копирование кода для уменьшения количества вызовов функций.
Ginq и Pinq использовали другой подход, они используют явные классы итераторов. Он укусит большой кусок из производительности, но позволяет использовать итераторы отдельно от сильного синтаксиса метода.
Кроме того, они оба имеют ловушки производительности . Когда вы используете синтаксис атрибутов свойств в Ginq, ваш код становится в 5 раз медленнее. Вас ждут сюрпризы, когда вы пытаетесь использовать массивы в качестве ключей. Когда вы используете соединение в Pinq, ваш код становится сотнями или тысячами раз медленнее (я не шучу, см. Ссылки ниже). После соединения с ошибкой был зафиксирован результат присоединения к Pinq.
С YaLinqo это проще: либо он не работает (например, массивы в ключах), либо работает с ожидаемой производительностью. Версия 1 имела некоторые хаки, чтобы сделать это возможным, как в оригинальной LINQ, но в текущей версии этого нет. Это может потребовать некоторых корректировок: например, вместо использования сопоставления равенства вам нужно будет создавать ключи, которые равны в тех же случаях.
См. Статьи: Сравнение LINQ для PHP: YaLinqo, Ginq, Pinq на CodeProject, LINQ для PHP: вопросы скорости в Habrahabr (русский). Они охватывают YaLinqoPerf , git repository, тесты производительности, сравнивающие сырые PHP, YaLinqo, Ginq и Pinq.
Количество методов LINQ в YaLinqo и Ginq, а также их функциональность, довольно близки. Я бы сказал, что нет явного победителя, поскольку обе библиотеки предоставляют методы другим, которых нет. В основном это дополнительные методы, недоступные в исходном LINQ, поэтому я не стал бы слишком беспокоиться об этом.
Пинк выглядит как пустынный город. Методы являются barebone и часто едва пригодны для использования. При написании тестов на выборку мне часто приходилось прибегать к пользовательским более сложным решениям для Pinq, тогда как код для YaLinqo и Pinq обычно отличался только именами методов (различные соглашения об именах: «desc» и «descending» и тому подобное).
С другой стороны, Pinq является единственным, который поддерживает разбор PHP и генерирование SQL из него. К сожалению, единственным поставщиком запросов является MySQL, и его состояние является «демонстрацией». Итак, в то время как Pinq обладает этой уникальной особенностью, он пока не может быть использован, к сожалению.
Если вы хотите, чтобы LINQ для баз данных стала реальностью, я думаю, у вас нет выбора, кроме как начать работу с поставщиком запросов для Pinq. Это очень сложная задача, и я сомневаюсь, что один разработчик может создавать высококачественные поставщики запросов для всех баз данных.
Что Ginq имеет, что YaLinqo не является более продвинутой архитектурой. Если в Ginq используются классы Set
и Dictionary
, вы увидите массивы и только массивы в YaLinqo. Где Comparer
и EqualityComparer
используются в Ginq, вы увидите закрытие (или отсутствие эквивалента) в YaLinqo. По сути, это дизайнерское решение – должна ли библиотека использовать концепции, естественные для программистов на этом языке, или для программистов, используемых в библиотеке на других языках. Библиотеки просто сделали выбор.
Следует отметить, что более сложная архитектура не соответствует хорошей реализации. Ginq использует public function hash($v) { return sha1(serialize($v)); }
public function hash($v) { return sha1(serialize($v)); }
для вычисления хэшей ключей в «наборах», например.
YaLinqo выделяется хорошей справочной документацией в PHPDoc и онлайн (сгенерирован из PHPDoc). Это в основном документация LINQ в .NET из MSDN, адаптированная к PHP. Если вы знаете, что такое MSDN, вы знаете его качество.
Документация Ginq почти не существует, она обычно содержит только подсказки типа аргумента.
Документация Пинка относительно хороша (каждый главный метод имеет предложение или два, объясняющее, что он делает), но это не соответствует документации YaLinqo.
Оба Ginq и Pinq имеют хорошие вводные артикули в Интернете, которые объясняют концепции для новых разработчиков. У YaLinqo нет никакой вводной документации, кроме сумасшедшего примера в ReadMe, который ничего не объясняет.
У Pinq есть довольно веб-сайт, единственная из трех библиотек.
Все три библиотеки имеют хорошее покрытие тестов, интеграцию композиторов, разрешительные лицензии с открытым исходным кодом и другие свойства libararies, которые готовы к использованию в процессе производства.
Для тех, кто интересуется древними версиями PHP, YaLinqo 1.x требует PHP 5.3, YaLinqo 2.x требует PHP 5.5, Ginq требует PHP 5.3, для Pinq требуется PHP 5.4.
PS Если у вас есть какие-либо дополнения или я думаю, что я предвзятый, прокомментируйте. Комментарии – это то, что я пропустил, написав так много текста. 🙂
За последние пару лет многое изменилось в мире PHP, в результате чего большинство предыдущих ответов устарели.
Ниже приведена новая таблица сравнения основных реализаций LINQ для PHP:
Эти библиотеки могут быть установлены через композитор .
В целом я бы рекомендовал библиотеку PINQ (я предвзятый, поскольку я автор), потому что он активно поддерживается, хорошо документирован и протестирован и обеспечивает реализацию истинного LINQ в PHP.
По истинному LINQ я имею в виду, что библиотека – это не только свободный API-интерфейс коллекции для массивов в памяти, но и реализует реальный синтаксический анализ запросов с деревьями выражений. Это позволяет интегрировать этот API с внешними источниками данных, следовательно, P HP In tegrated Q uery. Демонстрация такой функциональности можно просмотреть здесь, где запросы компилируются в SQL и выполняются в базе данных MySQL:
Существует также phinq, который имеет более поздний выпуск PHPLinq и, похоже, больше похож на LINQ на объекты для C #, чем PHPLinq.
Хорошая библиотека PHP ORM?
Ответ на этот вопрос гласит:
Посмотрите на Доктрину.
Doctrine 1.2 реализует Active Record. Доктрина 2+ – это ORM DataMapper.
Кроме того, проверьте Xyster. Он основан на шаблоне Data Mapper.
Кроме того, взгляните на DataMapper и Active Record.
Существует также Pinq . После непродолжительного прохождения большинства документации по проектам PHP Linq это произвело на меня лучшее впечатление.
См. PHPLinq (набор классов PHP, имитирующий LINQ).