Показаны сообщения с ярлыком PHPLinq. Показать все сообщения
Показаны сообщения с ярлыком PHPLinq. Показать все сообщения

среда, 29 июля 2009 г.

"Продвинутый" пример использования PHPLinq

Музыка: Hospital Mix.Six (Mixed By Cyantific)

Продолжая прошлую заметку посвящённую PHPLinq, решил перевести ещё и, как гласит сайт проекта, "продвинутый" пример использования PHPLinq.
Итак, вольный перевод данного материала.

Представим, что есть у нас пять яблок массив объектов Employee (служащий). А нужно нам отсортировать этот массив по имени и возрасту служащих и получить в результате массив только тех служащих, имя которых состоит из четырёх символов. И чтобы уж совсем усложнить задачу, в результате мы хотим получить не массив экземпляров класса Employee, а массив объектов, содержащих мыло и домен почтового сервера служащего. Жестоко, не правдали? ;)
Перво на перво, объявим класс служащих и заполним массив экземплярами этого класса:

class Employee {
public $Name;
public $Email;
public $Age;

public function __construct($name, $email, $age) {
$this->Name = $name;
$this->Email = $email;
$this->Age = $age;
}
}

$employees = array(
new Employee('Maarten', 'maarten@example.com', 24),
new Employee('Paul', 'paul@example.com', 30),
new Employee('Bill', 'bill.a@example.com', 29),
new Employee('Bill', 'bill.g@example.com', 28),
new Employee('Xavier', 'xavier@example.com', 40)
);

А теперь легко и не принуждённо с помощью PHPLinq брюки превращаются... превращаются... выполним, поставленную в начале, задачу:

$result = from('$employee')->in($employees)
->where('$employee => strlen($employee->Name) == 4')
->orderBy('$employee => $employee->Name')
->thenByDescending('$employee => $employee->Age')
->select('new {
"EmailAddress" => $employee->Email,
"Domain" => substr($employee->Email, strpos($employee->Email, "@") + 1)
}');

И снова, как и в предыдущем примере, вы могли заметить странный код 'new { }'. Что он делает? А он конвертируется в объект анонимного типа (класса). Например, конструкция вида new { "name" => "test" } преобразуется в объект содержащий поле "name" со значением "test".

понедельник, 20 июля 2009 г.

PHPLinq: Language Integrated Query for PHP

PHPLinq -- это набор классов PHP имитирующий функциональность предоставляемую расширением LINQ языка C#. LINQ позволят обращаться к данным из программы, способом очень сильно напоминающим SQL, но минуя написание SQL запросов как таковых.
Например, пусть у нас есть массив строк и мы хотим выбрать из него только те строки, длина которых меньше пяти символов. Обычным способом нам потребовалось бы писать цикл, в котором мы бы проверяли длину каждого элемента массива и добавляли бы подходящие по длине элементы во временную переменную:
// Создаём массив строк
$Names = array("John", "Peter", "Joe", "Patrick", "Donald", "Eric");
$Result = array();
foreach ($Name in $Names) {
if (strlen($Name) < 5) {
$Result[] = $Name;
}
}
С помощью PHPLinq это легко сделать следующим способом:
// Создаём массив строк
$Names = array("John", "Peter", "Joe", "Patrick", "Donald", "Eric");
$Result = from('$Name')->in($Names)
->where('$Name => strlen($Name) < 5')
->select('$Name');
Похоже на SQL? ;) Кроме того, решение с использованием PHPLinq гораздо компактнее и выглядит гораздо более красиво. Сам автор PHPLinq, Maarten Balliauw, пишет:
С LINQ есть одна проблемка... Если вы начали использовать его, то вы не захотите больше обращаться к источникам данных иными способами.
P.S.: В четвёртой строчке второго листинга вы могли заметить странную конструкцию '$Name => strlen($Name) < 5. Эта конструкция преобразуется в анонимную функцию или другими словами лямбда-выражение. Эта функция принимает параметр $Name и возвращает булево значение которое является результатом вычисления выражения strlen($Name) < 5.

Домашняя страничка PHPLinq -> http://www.phplinq.net/