Сравнивай себя не с другими, а с собой вчера

PHP и YAML

По следам публикации: PHP, Meet YAML

Каждому PHP приложению необходим какой-либо тип конфигурации. Как минимум, это конфигурационные параметры для подключения к серверу баз данных. Один из способов - сохранение конфигурационных данных непосредственно в PHP файле, это сподручно и обеспечивает быстрое считывание.

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

Что такое YAML

Самый популярный конфигурационный формат для PHP приложений, только если мы не говорим о хранении всей конфигурации в базе данных, это INI и XML. Большинство из нас понимает эти форматы, но у каждого из них есть свои слабые стороны: INI невозможно представить в сложной иерархической форме, а XML не так прост в понимании и использовании, как INI.

В погоне за простотой и гибкостью, сообщество Ruby and Rails предлагает формат YAML (Yet Another Markup Language, произносится как "ямл" ("yaamel")), который включает в себя гибкость XML и простоту INI. Похоже, до создателей XML уже начинает доходить, что если программисты http://www.xmlsuck.com/ и создают http://www.yaml.org/, то, наверное, у XML формата и правда есть недостатки, не позволяющие ему быть действительно универсальным. (hb: взято из wiki)

Посмотрим сразу на комплексный пример счет-фактуры на YAML (последовательность элементов обозначается через тире, а ключевые пары, переменная и ее значение, разделяются двоеточием):


--- !clarkevans.com/^invoice

invoice: 34843
date   : 2001-01-23
bill-to: &id001
    given  : Chris
    family : Dumars
    address:
        lines: |
            458 Walkman Dr.
            Suite #292
        city    : Royal Oak
        state   : MI
        postal  : 48046
ship-to: *id001
product:
    - sku         : BL394D
      quantity    : 4
      description : Basketball
      price       : 450.00
    - sku         : BL4438H
      quantity    : 1
      description : Super Hoop
      price       : 2392.00
tax  : 251.42
total: 4443.52
comments: >
    Late afternoon is best.
    Backup contact is Nancy
    Billsmer @ 338-4338.

На первый взгляд все очень лаконично, почти все понятно и нет практически никакой перегрузки лишней информацией (тэгами и т.п.). Вообще YAML позиционируют как формат для сериализации данных, хранения конфигураций, логов, интернет сообщений и фильтров. Если есть недопонимания, Вам помогут следующие ссылки:

сейчас же наша цель немного не та.

Как заставить PHP понимать YAML

Пока поддержка YAML не встроена в PHP, но существует несколько решений этого упущения:

  • Spyc - обычный PHP класс для поддержки YAML, есть версия как для PHP4, так и для PHP5. Быстро ставится, легко используется.
  • Pecl/syck - очень быстрый YAML парсер (написан на C), который портирован Алексеем Захлестиным из проекта Syck в PECL как PHP расширение (PHP extension). Последний релиз (0.9.2) требует не менее: PHP 5.2.1 и PEAR Installer 1.4.0. (.DLL PECL для Windows я не нашел, если есть острая необходимость, DLL придется компилировать самостоятельно).
    Расширение содержит две функции:
    - array syck_load(string str)
    - string syck_dump(mixed data)
  • Horde/Yaml - PEAR пакет для парсинга YAML файлов в PHP массивы, и обратной "выгрузки" PHP массивов в YAML формат. Базируется на вышеназванном Spyc. Родной PHP парсер пока еще не полностью поддерживает всю спецификацию YAML, но если доступно Pecl/syck расширение, использует для парсинга его. Требования для версии 1.0.0 не менее: PHP 5.1.0 и PEAR Installer 1.4.0b1.

Таким образом, на сегодняшний момент, наиболее универсальной связкой PHP+YAML является последний пакет: Horde/Yaml.

Инсталлируем Horde/Yaml

Если у Вас настроен и установлен PEAR и есть доступ в интернет, можно воспользоваться его "магическими" командами:

pear channel-discover pear.horde.org
pear install horde/yaml

а нет, так можно просто скачать пакет Horde/Yaml, разархивировать его, и скопировать все содержимое директории Horde в доступную папку, указанную в include_path вашего PHP.

Используем Yaml

Вот простейший пример использования Horde/Yaml:


<?php


function sample_autoloader($class) {
    require 
str_replace('_''/'$class) . '.php';
}
spl_autoload_register('sample_autoloader');

$a Horde_Yaml::load("foo: bar baz: qux");
 
var_export($a);
echo 
" ";
echo 
Horde_Yaml::dump($a);

?>

А это его результат:

array (
  'foo' => 'bar',
  'baz' => 'qux',
)

---
foo: bar
baz: qux

Кроме вышеисполненных методов у Horde/Yaml есть еще два метода:
- loadFile(filename) - загружает Yaml содержимое из файла и
- loadStream(stream) - загружает Yaml содержимое из потока

На этом все, удачи, в освоении и применении Yaml!

5 комментариев на статью:
Ответить
Обязательные поля помечены *