Files
php-doc-ru/reference/yaml/callbacks.xml
Sergey Panteleev daef8df962 Обнуление тега Reviewed (#364)
[skip-lint]
[skip-spellcheck]
2021-11-16 13:03:53 +03:00

163 lines
5.2 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 80872147aa52367137bd3d168412f70cbe2ddf9c Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="yaml.callbacks" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Callback-функции</title>
<section xml:id="yaml.callbacks.parse">
<title>Callback-функции парсинга</title>
<para>
Callback-функций (<type>callback</type>) для парсинга вызывается
функциями <function>yaml_parse</function>, <function>yaml_parse_file</function> или
<function>yaml_parse_url</function> при обнаружении зарегистрированного
тега YAML. В callback-функцию передаётся значение тегированной записи, сам тег и
флаги, определяющие скалярный тип записи. Callback-функция должна вернуть данные,
которые парсер YAML должен использовать для этой записи.
</para>
<example>
<title>Пример использования callback-функции парсинга</title>
<programlisting role="php">
<![CDATA[
<?php
/**
* Callback-функция парсинга для тегов yaml.
* @param mixed $value Данные из файла yaml
* @param string $tag Тег, для которого срабатывает функция
* @param int $flags Стиль скаляра записи (смотрите YAML_*_SCALAR_STYLE)
* @return mixed Значение, которое должен выдать парсер YAML
*/
function tag_callback ($value, $tag, $flags) {
var_dump(func_get_args()); // отладка
return "Hello {$value}";
}
$yaml = <<<YAML
greeting: !example/hello World
YAML;
$result = yaml_parse($yaml, 0, $ndocs, array(
'!example/hello' => 'tag_callback',
));
var_dump($result);
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
array(3) {
[0]=>
string(5) "World"
[1]=>
string(14) "!example/hello"
[2]=>
int(1)
}
array(1) {
["greeting"]=>
string(11) "Hello World"
}
]]>
</screen>
</example>
</section>
<section xml:id="yaml.callbacks.emit">
<title>Публикующие callback-функции</title>
<para>
Публикующие callback-функции вызываются тогда, когда с помощью
<function>yaml_emit</function> или <function>yaml_emit_file</function>
публикуются экземпляры зарегистрированных классов . В функцию
передаётся публикуемый объект. Callback-функция должна вернуть массив с двумя ключами:
&quot;<literal>tag</literal>&quot; и &quot;<literal>data</literal>&quot;.
Значение, связанное с ключом &quot;<literal>tag</literal>&quot; должно быть
строкой, содержащей тег YAML для вывода. Значение, связанное с ключом
&quot;<literal>data</literal>&quot; должно быть закодировано как YAML
и опубликовано вместо перехваченного объекта.
</para>
<example>
<title>Пример публикующей callback-функции</title>
<programlisting role="php">
<![CDATA[
<?php
class EmitExample {
public $data; // данные должны быть понятного pecl/yaml типа
public function __construct ($d) {
$this->data = $d;
}
/**
* Публикующая callback-функция Yaml.
*
* Ожидается возвращение массива с двумя значениями 2:
* - 'tag': пользовательский тег для этой сериализации
* - 'data': значение для преобразование в yaml (массив, строка, логическое, число)
*
* @param object $obj Публикуемый объект
* @return array Тег и замещающие данные для публикации
*/
public static function yamlEmit (EmitExample $obj) {
return array(
'tag' => '!example/emit',
'data' => $obj->data,
);
}
}
$emit_callbacks = array(
'EmitExample' => array('EmitExample', 'yamlEmit')
);
$t = new EmitExample(array('a','b','c'));
$yaml = yaml_emit(
array(
'example' => $t,
),
YAML_ANY_ENCODING,
YAML_ANY_BREAK,
$emit_callbacks
);
var_dump($yaml);
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
string(43) "---
example: !example/emit
- a
- b
- c
...
"
]]>
</screen>
</example>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->