mirror of
https://github.com/php/doc-ru.git
synced 2025-07-22 18:26:31 +00:00
163 lines
5.2 KiB
XML
163 lines
5.2 KiB
XML
<?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-функция должна вернуть массив с двумя ключами:
|
||
"<literal>tag</literal>" и "<literal>data</literal>".
|
||
Значение, связанное с ключом "<literal>tag</literal>" должно быть
|
||
строкой, содержащей тег YAML для вывода. Значение, связанное с ключом
|
||
"<literal>data</literal>" должно быть закодировано как 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
|
||
-->
|