Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions language/predefined/attributes.xml
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 02bee41067ab2822cbffcb4b3b2387f79488dffd Maintainer: sergey Status: ready -->
<!-- EN-Revision: efda0bb311990257715bd3a41ab2b04769ce2e4e Maintainer: sergey Status: ready -->
<!-- Reviewed: no -->
<part xml:id="reserved.attributes" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Предопределённые атрибуты</title>

<partintro>
<para>
<simpara>
В PHP предусмотрели и предопределили ряд атрибутов.
</para>
</simpara>
</partintro>

&language.predefined.attributes.attribute;
&language.predefined.attributes.allowdynamicproperties;
&language.predefined.attributes.delayedtargetvalidation;
&language.predefined.attributes.deprecated;
&language.predefined.attributes.nodiscard;
&language.predefined.attributes.override;
Expand Down
136 changes: 136 additions & 0 deletions language/predefined/attributes/delayedtargetvalidation.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: efda0bb311990257715bd3a41ab2b04769ce2e4e Maintainer: lacatoire Status: ready -->
<!-- Reviewed: no -->
<reference xml:id="class.delayedtargetvalidation" role="class" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Атрибут DelayedTargetValidation</title>
<titleabbrev>DelayedTargetValidation</titleabbrev>

<partintro>

<section xml:id="delayedtargetvalidation.intro">
&reftitle.intro;
<simpara>
Этот атрибут откладывает ошибки проверки цели для внутренних атрибутов
со времени компиляции до момента, когда атрибут создаётся через Reflection API.
</simpara>
<simpara>
Когда атрибут применяют к объявлению, любое некорректное использование
внутренних атрибутов на той же цели не вызовет ошибку времени компиляции.
Вместо этого проверка откладывается и выполняется, когда атрибут создаётся
через <link linkend="reflectionattribute.newinstance">ReflectionAttribute::newInstance()</link>.
</simpara>
<simpara>
В основном это предназначено для прямой совместимости и позволяет коду
использовать атрибуты, которые могут получить дополнительные допустимые цели
в будущих версиях PHP, не ломаясь на старых версиях.
</simpara>
</section>

<section xml:id="delayedtargetvalidation.synopsis">
&reftitle.classsynopsis;

<classsynopsis class="class">
<ooclass>
<modifier role="attribute">#[\Attribute]</modifier>
<modifier>final</modifier>
<classname>DelayedTargetValidation</classname>
</ooclass>
</classsynopsis>

</section>

<section xml:id="delayedtargetvalidation.examples">
&reftitle.examples;

<example>
<title>Откладывание проверки недопустимой цели</title>
<programlisting role="php"><![CDATA[
<?php

class Base {
protected function foo(): void {}
}

class Child extends Base {

#[\DelayedTargetValidation]
#[\Override]
public const NAME = 'child';

#[\Override]
protected function foo(): void {}
}
]]></programlisting>

<simpara>
На версиях PHP, где <classname>Override</classname> не разрешён на
константах класса, это не приводит к ошибке времени компиляции.
</simpara>
</example>

<example>
<title>Проверка происходит во время рефлексии</title>
<programlisting role="php"><![CDATA[
<?php

$reflection = new ReflectionClassConstant(Child::class, 'NAME');

foreach ($reflection->getAttributes() as $attribute) {
$attribute->newInstance(); // Может выбросить исключение, если недопустимо
}
]]></programlisting>

<simpara>
Когда любой атрибут, применённый к той же цели (кроме самого
DelayedTargetValidation), создаётся через рефлексию с помощью
<link linkend="reflectionattribute.newinstance">ReflectionAttribute::newInstance()</link>,
выполняется проверка цели, и может быть выброшено исключение, если атрибут
используется на неподдерживаемой цели.
</simpara>
</example>

</section>

<section xml:id="delayedtargetvalidation.notes">
&reftitle.notes;
<simpara>
Этот атрибут влияет только на проверку цели внутренних атрибутов.
</simpara>
<simpara>
Он не подавляет функциональную проверку, выполняемую этими атрибутами.
Например, <classname>Override</classname> всё равно выдаст ошибку, если
метод фактически не переопределяет родительский метод.
</simpara>
</section>

<section xml:id="delayedtargetvalidation.seealso">
&reftitle.seealso;
<simplelist>
<member><link linkend="language.attributes">Обзор атрибутов</link></member>
<member><link linkend="class.override">Override</link></member>
</simplelist>
</section>

</partintro>

</reference>
<!-- 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
-->