Skip to content
Merged
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
140 changes: 140 additions & 0 deletions language/predefined/attributes/delayedtargetvalidation.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: efda0bb311990257715bd3a41ab2b04769ce2e4e Maintainer: malferov 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>
Атрибут откладывает проверку цели внутренних атрибутов и генерацию ошибок
с этапа компиляции до момента создания экземпляра объекта отражения атрибута через API-интерфейс модуля Reflection.
</simpara>
<simpara>
После нацеливания атрибута на объявление
недопустимое нацеливание других внутренних атрибутов на той же цели
не вызовет ошибку компиляции. Проверка откладывается и выполняется
только в момент создания объекта отражения атрибута методом
<link linkend="reflectionattribute.newinstance">ReflectionAttribute::newInstance()</link>.
</simpara>
<simpara>
Главное назначение атрибута — сделать текущий код совместимым с будущими версиями языка:
атрибут разрешает текущему коду работать без ошибок при разметке атрибутами целей,
совместимость с которыми появится только в новых версиях языка.
</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>,
когда создаётся объект отражения атрибута.
При разметке несовместимой цели выбрасывается ошибка.
Проверка цели самого́ атрибута DelayedTargetValidation не выполняется.
</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
-->
Loading