Как использовать обратные вызовы пользовательских тегов PHP-YAML? - PullRequest
5 голосов
/ 25 июня 2011

В соответствии с официальной документацией существует способ предоставления обратных вызовов для пользовательских тегов YAML:

mixed yaml_parse ( string $input [, int $pos = 0 [, int &$ndocs [, array $callbacks ]]] )

обратных вызовов
Содержимоеобработчики для узлов YAML.Ассоциативный массив тегов YAML => сопоставлений обратного вызова.

Однако, похоже, нет другой документации по этому вопросу, даже в исходном коде расширения!

Я создал этот скрипт какtest:

<?php

$yaml =<<<YAML
---
prop: !custom val
YAML;

print_r(yaml_parse($yaml,0,$n,array(
  YAML_STR_TAG => function () {
    echo "YAML_STR_TAG\n";
    $args = func_get_args();
    print_r($args);
    return 'x';
  },
  '!custom' => function () {
    echo "!custom\n";
    $args = func_get_args();
    print_r($args);
    return 'y';
  }
)));

И я получил такой вывод:

$ php yaml.php
YAML_STR_TAG
Array
(
    [0] => prop
    [1] => tag:yaml.org,2002:str
    [2] => 1
)
!custom
Array
(
    [0] => val
    [1] => !custom
    [2] => 1
)
Array
(
    [x] => y
)

Из этого я могу сказать несколько вещей:

  • Ключ, используемый при поиске обратного вызоваявляется либо одной из предопределенных констант PHP-YAML , либо пользовательским тегом, используемым в источнике YAML, включая восклицательный знак
  • Каждое значение ключа и в карте получает "tagged "и передается в соответствующий обратный вызов, возможно потому, что в соответствии со спецификацией YAML ключ также может быть любого допустимого типа.
  • В обратный вызов передаются три аргумента:" субъект "тега, тегсамо по себе и некоторое число, вероятно, соответствующее константе YAML_*_SCALAR_STYLE.
  • Возвращаемое значение обратных вызовов заменяет тегированную структуру данных

Может ли кто-нибудь подтвердить ожидаемое поведение этой функции

1 Ответ

4 голосов
/ 27 июня 2011

После долгих исследований и испытаний я нашел несколько ответов.

Как указано в модульных тестах расширения , каждый обратный вызов принимает три аргумента:

  • mixed $data - тегированные данные уже проанализированы
  • string $tag - имя тега, расширенное в соответствии с официальными спецификациями тега YAML :
    • !custom расширяется до !custom, если префикс тега не определен
    • !custom расширяется до prefixcustom, где prefix определяется метаданными документа%TAG ! prefix.Обратите внимание, что , а не , ведущий восклицательный знак
    • !!preset расширяется до определяемого синтаксическим анализатором внутреннего типа.См. YAML_*_TAG константы
    • !<verbatim-tag> expands to дословный тег`.Обратите внимание, что не является ведущим восклицательным знаком.
  • целое число $style - используется скалярный стиль.См. YAML_*_SCALAR_STYLE констант

. Обратный вызов должен возвращать смешанное значение для парсера, который должен излучать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...