Подтвердить что ты не робот

Есть ли что-то в PHP, эквивалентное LINQ в С#?

Есть ли что-то в PHP, эквивалентное LINQ в С#?

4b9b3361

Ответ 2

Попробуйте YaLinqo. Это лучший LINQ для PHP.

Вот таблица сравнения:

Enter image description here

Ответ 3

(разработчик YaLinqo здесь.)

В настоящее время существует три основные реализации LINQ в PHP:

  • YaLinqo - самая минималистическая архитектура, основанная на архитектуре (4 класса), но самая функциональная, самая результативная, с лучшей документацией и единственным, поддерживающим "струнные лямбды".

  • Ginq - библиотека среднего размера (70 классов), наравне с YaLinqo в количестве функций, вокруг В 1,5-3 раза раз медленнее, содержит пользовательские коллекции, итераторы и сопоставления, документация содержит в лучшем случае типы аргументов.

  • Pinq - огромная библиотека (500 классов), поддерживает разбор PHP и преобразование в SQL и все остальное, намного медленнее чем остальные, имеет красивый веб-сайт, но его документация средняя, ​​а функциональность отсутствует.

Другие библиотеки не стоит упоминать (um, okay, 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 for PHP: вопросы скорости по Хабрахабру (рус.). Они охватывают хранилище YaLinqoPerf, git с тестами производительности, сравнивающими исходные PHP, YaLinqo, Ginq и Pinq.

Функции

Число методов LINQ в YaLinqo и Ginq, а также их функциональность, довольно близки. Я бы сказал, что нет явного победителя, поскольку обе библиотеки предоставляют методы, которых у другого нет. В основном это дополнительные методы, недоступные в исходном LINQ, поэтому я не стал бы слишком беспокоиться об этом.

Пинк выглядит как заброшенный город. Методы являются barebone и часто едва пригодны для использования. При написании тестов на выборку мне часто приходилось прибегать к пользовательским более сложным решениям для Pinq, тогда как код для YaLinqo и Pinq обычно отличался только именами методов (разные соглашения об именах: "desc" и "descending" и тому подобное).

С другой стороны, Pinq является единственным, который поддерживает разбор PHP и генерирование SQL из него. К сожалению, единственным поставщиком запросов является MySQL, и его состояние является "демонстрацией". Таким образом, хотя Pinq обладает этой уникальной функцией, к сожалению, он пока не может быть использован.

Если вы хотите, чтобы LINQ в базах данных стала реальностью, я думаю, у вас нет выбора, кроме как начать работу с поставщиком запросов для Pinq. Это очень сложная задача, и я сомневаюсь, что один разработчик способен создавать высококачественные поставщики запросов для всех баз данных.

Что Ginq имеет, что YaLinqo не является более продвинутой архитектурой. Где классы Set и Dictionary используются в Ginq, вы увидите массивы и только массивы в YaLinqo. Где Comparer и EqualityComparer используются в Ginq, вы увидите закрытие (или отсутствие эквивалента) в YaLinqo. По сути, это дизайнерское решение - должна ли библиотека использовать концепции, естественные для программистов на этом языке, или для программистов, используемых в библиотеке на других языках. Библиотеки просто сделали выбор.

Следует отметить, что более сложная архитектура не соответствует хорошей реализации. Например, Ginq использует public function hash($v) { return sha1(serialize($v)); } для вычисления хешей ключей в "наборах".

Документация

YaLinqo выделяется хорошей справочной документацией в PHPDoc и онлайн (сгенерирован из PHPDoc). Это в основном документация LINQ в .NET из MSDN, адаптированная к PHP. Если вы знаете, что такое MSDN, вы знаете его качество.

Документация Ginq почти не существует, она обычно содержит только подсказки типа аргументов.

Документация Pinq относительно хороша (у каждого основного метода есть предложение или два, объясняющего, что он делает), но это не соответствует документации YaLinqo.

Оба Ginq и Pinq имеют хорошие вводные артикулы в Интернете, которые объясняют концепции для новых разработчиков. YaLinqo не имеет никакой вводной документации, кроме сумасшедшего примера в ReadMe, который ничего не объясняет.

У Pinq есть симпатичный веб-сайт, единственная из трех библиотек.

Все остальное

Все три библиотеки имеют хорошее тестовое покрытие, интеграцию с Composer, разрешительные лицензии с открытым исходным кодом и другие свойства libararies, которые готовы к использованию в процессе производства.

Для тех, кто интересуется древними версиями PHP, YaLinqo 1.x требует PHP 5.3, YaLinqo 2.x требует PHP 5.5, для Ginq требуется PHP 5.3, Pinq требует PHP 5.4.

P.S. Если у вас есть какие-либо дополнения, или я думаю, что я предвзятый, прокомментируйте. Комментарии - это то, что я пропустил, написав так много текста.:)

Ответ 4

За последние пару лет в мире PHP многое изменилось, в результате чего большинство предыдущих ответов устарели.

Вот новая таблица сравнения основных реализаций LINQ для PHP:

LINQ Library Comparison Table

Все эти библиотеки могут быть установлены через composer.

В заключение я бы рекомендовал PINQ библиотеку (я предвзятый, поскольку я автор), потому что он активно поддерживается, хорошо документированы и протестированы и обеспечивает реализацию истинного LINQ в PHP.

По истинному LINQ я имею в виду, что библиотека - это не только свободный API-интерфейс коллекции для массивов в памяти, но и реализует реальный синтаксический анализ запросов с деревьями выражений. Это позволяет интегрировать этот API с внешними источниками данных, следовательно, P HP В тегированный Q uery. Демонстрация такой функциональности можно просмотреть здесь здесь, где запросы компилируются в SQL и выполняются в базе данных MySQL:

Ответ 5

Существует также phinq, у которого более поздняя версия PHPLinq, и похоже, она больше похожа на LINQ to Объекты для С#, чем PHPLinq.

Ответ 6

Хорошая библиотека PHP ORM?

Ответ на этот вопрос гласит:

Посмотрите на Доктрину.

Doctrine 1.2 реализует Active Record. Доктрина 2+ - это DataMapper ОРМ.

Кроме того, проверьте Xyster. Он основан на шаблоне Data Mapper.

Также обратите внимание на DataMapper и Active Record.

Ответ 7

Существует также Pinq. После непродолжительного прохождения большинства документации по проектам PHP Linq это произвело на меня лучшее впечатление.

Ответ 8

См. PHPLinq (набор классов PHP, имитирующих LINQ с С# 3.0).