svn: /phpdoc/ru/trunk/ language/attributes.xml language/types/numeric-strings.xml reference/apcu/functions/apcu-key-info.xml reference/intl/dateformatter-constants.xml
[email protected] (Andrey Gromov) Mon, 07 Dec 2020 09:46:42 +0000
| Newsgroups | php.doc.ru |
|---|---|
| Message-ID | <[email protected]> |
rjhdby Mon, 07 Dec 2020 09:46:42 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=351945
Log:
new, upd
Changed paths:
A phpdoc/ru/trunk/language/attributes.xml
U phpdoc/ru/trunk/language/types/numeric-strings.xml
A phpdoc/ru/trunk/reference/apcu/functions/apcu-key-info.xml
U phpdoc/ru/trunk/reference/intl/dateformatter-constants.xml
svn-diffs-351945.txt
(text/x-diff, 21.8 KB)
Added: phpdoc/ru/trunk/language/attributes.xml
===================================================================
--- phpdoc/ru/trunk/language/attributes.xml (rev 0)
+++ phpdoc/ru/trunk/language/attributes.xml 2020-12-07 09:46:42 UTC (rev 351945)
@@ -0,0 +1,377 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- $Revision$ -->
+<!-- EN-Revision: 351926 Maintainer: rjhdby Status: ready -->
+<!-- Reviewed: no -->
+
+<chapter xml:id="language.attributes" xmlns="http://docbook.org/ns/docbook">
+ <title>Атрибуты</title>
+ <sect1 xml:id="language.attributes.overview">
+ <title>Введение в атрибуты</title>
+ <?phpdoc print-version-for="attributes"?>
+
+ <para>
+ Атрибуты позволяют добавлять структурированные, машиночитаемые метаданные для
+ следующих деклараций в коде: классы, методы, функции, параметры, свойства и константы класса.
+ Привязанные метаданные можно получить во время исполнения используя
+ <link linkend="book.reflection">Reflection API</link>.
+ Таким образом, атрибуты можно рассматривать как язык конфигурации, встроенный
+ непосредственно в код.
+ </para>
+
+ <para>
+ С помощью атрибутов можно разделить абстрактную реализацию какого
+ либо функционала и особенности его использования в коде. В некотором
+ смасле это можно сравнить с разделением интерфейса и его реализаций.
+ Но интерфейсы и реализации - это про код, а атрибуты - про добавление
+ дополнитебьной информации и конфигурацию. Интерфейсы могут
+ реализовываться только классами, тогда как атрибуты также применимы для
+ методов, функций, параметров, свойств и констант классов. Таким образом
+ они представляют собой гораздо более гибкий механизм, чем интерфейсы.
+ </para>
+
+ <para>
+ Давайте разберём использование атрибутов на простом примере реализации опциональных
+ методов для интерфейса . Примем, что интерфейс <literal>ActionHandler</literal> описывает некую
+ операцию в приложении. Одни реализации этого интерфейса требуют
+ предварительной настройки, а другие нет. И, вместо того, чтобы вносить в
+ интерфейс <literal>ActionHandler</literal> дополнительный метод
+ <literal>setUp()</literal>, который для части реализаций будет пустым,
+ мы используем атрибуты. Одним из преимуществ этого подхода является то,
+ что мы можем использовать атрибут несколько раз.
+ </para>
+
+ <example>
+ <title>Реализация опциональных методов интерфейса с помощью атрибутов</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+interface ActionHandler
+{
+ public function execute();
+}
+
+#[Attribute]
+class SetUp {}
+
+class CopyFile implements ActionHandler
+{
+ public string $fileName;
+ public string $targetDirectory;
+
+ #[SetUp]
+ public function fileExists()
+ {
+ if (!file_exists($this->fileName)) {
+ throw new RuntimeException("Файл не найден");
+ }
+ }
+
+ #[SetUp]
+ public function targetDirectoryExists()
+ {
+ mkdir($this->targetDirectory);
+ }
+
+ public function execute()
+ {
+ copy($this->fileName, $this->targetDirectory . '/' . basename($this->fileName));
+ }
+}
+
+function executeAction(ActionHandler $actionHandler)
+{
+ $reflection = new ReflectionObject($actionHandler);
+
+ foreach ($reflection->getMethods() as $method) {
+ $attributes = $method->getAttributes(SetUp::class);
+
+ if (count($attributes) > 0) {
+ $methodName = $method->getName();
+
+ $actionHandler->$methodName();
+ }
+ }
+
+ $actionHandler->execute();
+}
+
+$copyAction = new CopyFile();
+$copyAction->fileName = "/tmp/foo.jpg";
+$copyAction->targetDirectory = "/home/user";
+
+executeAction($copyAction);
+]]>
+ </programlisting>
+ </example>
+ </sect1>
+
+ <sect1 xml:id="language.attributes.syntax">
+ <title>Синтаксис атрибутов</title>
+
+ <para>
+ Синтаксис атрибутов состоит из нескольких частей. Во-первых, декларация
+ атрибута всегда начинается с символа <literal>#[</literal> и заканчивается
+ <literal>]</literal>. Внутри перечисление из одного или более, разделённых запятой, атрибутов.
+ Атрибуты можно задавать с помощью неполных, полных и абсолютных имён, как описано в разделе
+ <link linkend="language.namespaces.basics">Использование пространства имен: основы</link>.
+ Аргументы атрибутов опциональны, но если они есть, то заключаются в скобки <literal>()</literal>.
+ Аргументы атрибутов могут быть либо конкретными значениями, либо константными выражениями. Для аргументов можно
+ использовать как позиционный синтаксис, так и синтаксис именованных аргументов.
+ </para>
+
+ <para>
+ Когда атрибут запрафивается с помощью Reflection API, его имя трактуется как имя класса, а аргументы передаются в его конструктор.
+ Таким образом, для каждого атрубита должен существовать соответствующий класс.
+ </para>
+
+ <example>
+ <title>Синтаксис атрибутов</title>
+
+ <programlisting role="php">
+<![CDATA[
+<?php
+// a.php
+namespace MyExample;
+
+use Attribute;
+
+#[Attribute]
+class MyAttribute
+{
+ const VALUE = 'value';
+
+ private $value;
+
+ public function __construct($value = null)
+ {
+ $this->value = $value;
+ }
+}
+
+// b.php
+
+namespace Another;
+
+use MyExample\MyAttribute;
+
+#[MyAttribute]
+#[\MyExample\MyAttribute]
+#[MyAttribute(1234)]
+#[MyAttribute(value: 1234)]
+#[MyAttribute(MyAttribute::VALUE)]
+#[MyAttribute(array("key" => "value"))]
+#[MyAttribute(100 + 200)]
+class Thing
+{
+}
+
+#[MyAttribute(1234), MyAttribute(5678)]
+class AnotherThing
+{
+}
+]]>
+ </programlisting>
+ </example>
+ </sect1>
+
+
+ <sect1 xml:id="language.attributes.reflection">
+ <title>Чтение атрибутов с помощью Reflection API</title>
+
+ <para>
+ Для доступа к атрибутам классов, методов, функций, параметров, свойств и констант класса, в Reflection API
+ присутствует метод <function>getAttributes</function> для каждого из перечисленных объектов рефлексии.
+ Этот метод возвращает массив экземпляров <classname>ReflectionAttribute</classname>, у которого можно запросить
+ имя атрибута и его аргументы, а также и инстанцировать объект представляющий атрибут.
+ </para>
+
+ <para>
+ Такое отделение свойств атрибута от явного инстанцирования даёт программисту более полный контроль над
+ обработкой ошибок, связанных с отсутствующим классом атрибута и некорректностью его аргументов.
+ Объект атрибута будет создан и проверен на корректность аргументов только после вызова
+ <function>newInstance</function>, не раньше.
+ </para>
+
+ <example>
+ <title>Чтение атрибутов с помощью Reflection API</title>
+
+ <programlisting role="php">
+<![CDATA[
+<?php
+
+#[Attribute]
+class MyAttribute
+{
+ public $value;
+
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+}
+
+#[MyAttribute(value: 1234)]
+class Thing
+{
+}
+
+function dumpAttributeData($reflection) {
+ $attributes = $reflection->getAttributes();
+
+ foreach ($attributes as $attribute) {
+ var_dump($attribute->getName());
+ var_dump($attribute->getArguments());
+ var_dump($attribute->newInstance());
+ }
+}
+
+dumpAttributeData(new ReflectionClass(Thing::class));
+/*
+string(11) "MyAttribute"
+array(1) {
+ ["value"]=>
+ int(1234)
+}
+object(MyAttribute)#3 (1) {
+ ["value"]=>
+ int(1234)
+}
+*/
+
+]]>
+ </programlisting>
+ </example>
+
+ <para>
+ Вместо того, чтобы последовательно перебирать все атрибуты объекта рефлексии,
+ можно указать имя класса в качестве аргумента и получить только подходящие атрибуты.
+ </para>
+
+ <example>
+ <title>Чтение конкретных атрибутов с помощью Reflection API</title>
+
+ <programlisting role="php">
+<![CDATA[
+<?php
+
+function dumpMyAttributeData($reflection) {
+ $attributes = $reflection->getAttributes(MyAttribute::class);
+
+ foreach ($attributes as $attribute) {
+ var_dump($attribute->getName());
+ var_dump($attribute->getArguments());
+ var_dump($attribute->newInstance());
+ }
+}
+
+dumpAttributeData(new ReflectionClass(Thing::class));
+]]>
+ </programlisting>
+ </example>
+ </sect1>
+
+ <sect1 xml:id="language.attributes.classes">
+ <title>Объявление классов атрибутов</title>
+
+ <para>
+ Создавать классы для атрибутов не обязательно, но крайне рекомендуется.
+ В самом простом случае, требуется просто пустой класс с атибутом <literal>#[Attribute]</literal>, который
+ можно импортировать из глобального пространства имён с помощью оператора use.
+ </para>
+
+ <example>
+ <title>Ограничение допустимых целей для использования атрибута</title>
+
+ <programlisting role="php">
+<![CDATA[
+<?php
+
+namespace Example;
+
+use Attribute;
+
+#[Attribute]
+class MyAttribute
+{
+}
+]]>
+ </programlisting>
+ </example>
+
+ <para>
+ Для ограничения того, с каким типом деклараций можно использовать конкретный атрибут, можно передать
+ битовую маску первым параметром в <literal>#[Attribute]</literal>.
+ </para>
+
+ <example>
+ <title>Simple Attribute Class</title>
+
+ <programlisting role="php">
+<![CDATA[
+<?php
+
+namespace Example;
+
+use Attribute;
+
+#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION)]
+class MyAttribute
+{
+}
+]]>
+ </programlisting>
+
+ <para>
+ После этого, аннотирование атрибутом <classname>MyAttribute</classname> чего либо, отличного от метода или функции приведёт
+ к выбросу исключения при вызове <function>ReflectionAttribute::newInstance</function>
+ </para>
+ </example>
+
+ <para>
+ По умолчанию, атрибут можно использовать только один раз для каждой сущности. Если нужна возможность указывать
+ несколько одинаковых атрибутов для одной сущности - можно выставить соответствующий флаг в битовой маске
+ для декларации <literal>#[Attribute]</literal>.
+ </para>
+
+ <example>
+ <title>Using IS_REPEATBLE to allow attribute on a declaration multiple times</title>
+
+ <programlisting role="php">
+<![CDATA[
+<?php
+
+namespace Example;
+
+use Attribute;
+
+#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION | Attribute::IS_REPEATABLE)]
+class MyAttribute
+{
+}
+]]>
+ </programlisting>
+
+ </example>
+ </sect1>
+</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
+-->
Property changes on: phpdoc/ru/trunk/language/attributes.xml
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL
\ No newline at end of property
Modified: phpdoc/ru/trunk/language/types/numeric-strings.xml
===================================================================
--- phpdoc/ru/trunk/language/types/numeric-strings.xml 2020-12-07 08:25:14 UTC (rev 351944)
+++ phpdoc/ru/trunk/language/types/numeric-strings.xml 2020-12-07 09:46:42 UTC (rev 351945)
@@ -71,7 +71,8 @@
<title>Поведение до PHP 8.0.0</title>
<para>
До PHP 8.0.0, строка считалась числовой только в случае, если она
- начиналась с пробельных ситмволов. Если она завершалась пробельными символами -
+ <emphasis>начиналась</emphasis> с пробельных ситмволов. Если она
+ <emphasis>завершалась</emphasis> пробельными символами -
она считалась префиксной числовой.
</para>
Added: phpdoc/ru/trunk/reference/apcu/functions/apcu-key-info.xml
===================================================================
--- phpdoc/ru/trunk/reference/apcu/functions/apcu-key-info.xml (rev 0)
+++ phpdoc/ru/trunk/reference/apcu/functions/apcu-key-info.xml 2020-12-07 09:46:42 UTC (rev 351945)
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- $Revision$ -->
+<!-- EN-Revision: 351787 Maintainer: rjhdby Status: ready -->
+<!-- Reviewed: no -->
+
+<refentry xml:id="function.apcu-key-info" xmlns="http://docbook.org/ns/docbook">
+ <refnamediv>
+ <refname>apcu_key_info</refname>
+ <refpurpose>
+ Получить детальную информацию о ключе в кеше
+ </refpurpose>
+ </refnamediv>
+
+ <refsect1 role="description">
+ &reftitle.description;
+ <methodsynopsis>
+ <type>array</type><methodname>apcu_key_info</methodname>
+ <methodparam><type>string</type><parameter>key</parameter></methodparam>
+ </methodsynopsis>
+ <para>
+ Получить детальную информацию о ключе в кеше
+ </para>
+ </refsect1>
+
+ <refsect1 role="parameters">
+ &reftitle.parameters;
+ <para>
+ <variablelist>
+ <varlistentry>
+ <term><parameter>key</parameter></term>
+ <listitem>
+ <para>
+ Получить детальную информацию о ключе в кеше
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ </refsect1>
+
+ <refsect1 role="returnvalues">
+ &reftitle.returnvalues;
+ <para>
+ &null; или массив с информацией
+ </para>
+ </refsect1>
+
+ <refsect1 role="examples">
+ &reftitle.examples;
+ <para>
+ <example>
+ <title>Пример использования <function>apcu_key_info</function></title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+apcu_add('a','b');
+var_dump(apcu_key_info('a'));
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+array(7) {
+ ["hits"]=>
+ int(0)
+ ["access_time"]=>
+ int(1606701783)
+ ["mtime"]=>
+ int(1606701783)
+ ["creation_time"]=>
+ int(1606701783)
+ ["deletion_time"]=>
+ int(0)
+ ["ttl"]=>
+ int(0)
+ ["refs"]=>
+ int(0)
+}
+]]>
+ </screen>
+ </example>
+ </para>
+ </refsect1>
+
+ <refsect1 role="seealso">
+ &reftitle.seealso;
+ <para>
+ <simplelist>
+ <member><function>apcu_store</function></member>
+ <member><function>apcu_fetch</function></member>
+ <member><function>apcu_delete</function></member>
+ </simplelist>
+ </para>
+ </refsect1>
+
+</refentry>
+
+<!-- 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
+-->
\ No newline at end of file
Property changes on: phpdoc/ru/trunk/reference/apcu/functions/apcu-key-info.xml
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL
\ No newline at end of property
Modified: phpdoc/ru/trunk/reference/intl/dateformatter-constants.xml
===================================================================
--- phpdoc/ru/trunk/reference/intl/dateformatter-constants.xml 2020-12-07 08:25:14 UTC (rev 351944)
+++ phpdoc/ru/trunk/reference/intl/dateformatter-constants.xml 2020-12-07 09:46:42 UTC (rev 351945)
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- EN-Revision: 351133 Maintainer: rjhdby Status: ready -->
+<!-- EN-Revision: 351939 Maintainer: rjhdby Status: ready -->
<!-- Reviewed: yes Maintainer: sergey -->
<!-- $Revision$ -->
<section xml:id="intl.intldateformatter-constants" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
@@ -54,6 +54,62 @@
<simpara>Наиболее сокращенный формат, только самые необходимые данные (12/13/52 или 3:30pm)</simpara>
</listitem>
</varlistentry>
+ <varlistentry xml:id="intldateformatter.constants.relative_full">
+ <term>
+ <constant>IntlDateFormatter::RELATIVE_FULL</constant>
+ (<type>int</type>)
+ </term>
+ <listitem>
+ <simpara>
+ То же, что и <constant>IntlDateFormatter::FULL</constant>, но "вчера", "сегодня" и "завтра"
+ выводятся как <literal>yesterday</literal>, <literal>today</literal> и
+ <literal>tomorrow</literal>.
+ Доступно с PHP 8.0.0 только для <parameter>dateType</parameter>.
+ </simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry xml:id="intldateformatter.constants.relative_long">
+ <term>
+ <constant>IntlDateFormatter::RELATIVE_LONG</constant>
+ (<type>int</type>)
+ </term>
+ <listitem>
+ <simpara>
+ То же, что и <constant>IntlDateFormatter::LONG</constant>, но "вчера", "сегодня" и "завтра"
+ выводятся как <literal>yesterday</literal>, <literal>today</literal> и
+ <literal>tomorrow</literal>.
+ Доступно с PHP 8.0.0 только для <parameter>dateType</parameter>.
+ </simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry xml:id="intldateformatter.constants.relative_medium">
+ <term>
+ <constant>IntlDateFormatter::RELATIVE_MEDIUM</constant>
+ (<type>int</type>)
+ </term>
+ <listitem>
+ <simpara>
+ То же, что и <constant>IntlDateFormatter::MEDIUM</constant>, но "вчера", "сегодня" и "завтра"
+ выводятся как <literal>yesterday</literal>, <literal>today</literal> и
+ <literal>tomorrow</literal>.
+ Доступно с PHP 8.0.0 только для <parameter>dateType</parameter>.
+ </simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry xml:id="intldateformatter.constants.relative_short">
+ <term>
+ <constant>IntlDateFormatter::RELATIVE_SHORT</constant>
+ (<type>int</type>)
+ </term>
+ <listitem>
+ <simpara>
+ То же, что и <constant>IntlDateFormatter::SHORT</constant>, но "вчера", "сегодня" и "завтра"
+ выводятся как <literal>yesterday</literal>, <literal>today</literal> и
+ <literal>tomorrow</literal>.
+ Доступно с PHP 8.0.0 только для <parameter>dateType</parameter>.
+ </simpara>
+ </listitem>
+ </varlistentry>
</variablelist>
</para>