Skip to content

Commit d48e439

Browse files
committed
Add Italian translation for attributes, expressions and generators
1 parent 87512ff commit d48e439

3 files changed

Lines changed: 1231 additions & 0 deletions

File tree

language/attributes.xml

Lines changed: 389 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,389 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<!-- EN-Revision: 0f14761ba340c6e49797706ac3f0cf1147d97253 Maintainer: lacatoire Status: ready -->
3+
<chapter xml:id="language.attributes" xmlns="http://docbook.org/ns/docbook">
4+
<title>Attributi</title>
5+
<sect1 xml:id="language.attributes.overview">
6+
<title>Panoramica sugli attributi</title>
7+
<?phpdoc print-version-for="attributes"?>
8+
9+
<para>
10+
Gli attributi PHP forniscono metadati strutturati e leggibili dalla macchina per classi, metodi,
11+
funzioni, parametri, proprietà e costanti. Possono essere ispezionati a runtime
12+
tramite la <link linkend="book.reflection">Reflection API</link>, abilitando un comportamento
13+
dinamico senza modificare il codice. Gli attributi forniscono un modo dichiarativo per annotare
14+
il codice con metadati.
15+
</para>
16+
<para>
17+
Gli attributi permettono di disaccoppiare l'implementazione di una funzionalità dal suo utilizzo. Mentre
18+
le interfacce definiscono la struttura imponendo metodi, gli attributi forniscono metadati su più
19+
elementi, inclusi metodi, funzioni, proprietà e costanti. A differenza delle interfacce,
20+
che impongono l'implementazione dei metodi, gli attributi annotano il codice senza alterarne la struttura.
21+
</para>
22+
<para>
23+
Gli attributi possono completare o sostituire i metodi opzionali delle interfacce fornendo metadati invece di
24+
una struttura imposta. Si consideri un'interfaccia <literal>ActionHandler</literal> che rappresenta
25+
un'operazione in un'applicazione. Alcune implementazioni possono richiedere un passo di configurazione mentre altre no.
26+
Invece di forzare tutte le classi che implementano <literal>ActionHandler</literal> a definire un
27+
metodo <literal>setUp()</literal>, un attributo può indicare i requisiti di configurazione. Questo approccio
28+
aumenta la flessibilità, permettendo di applicare gli attributi più volte quando necessario.
29+
</para>
30+
31+
<example>
32+
<title>Implementazione di metodi opzionali di un'interfaccia con gli Attributi</title>
33+
<programlisting role="php">
34+
<![CDATA[
35+
<?php
36+
interface ActionHandler
37+
{
38+
public function execute();
39+
}
40+
41+
#[Attribute]
42+
class SetUp {}
43+
44+
class CopyFile implements ActionHandler
45+
{
46+
public string $fileName;
47+
public string $targetDirectory;
48+
49+
#[SetUp]
50+
public function fileExists()
51+
{
52+
if (!file_exists($this->fileName)) {
53+
throw new RuntimeException("File does not exist");
54+
}
55+
}
56+
57+
#[SetUp]
58+
public function targetDirectoryExists()
59+
{
60+
if (!file_exists($this->targetDirectory)) {
61+
mkdir($this->targetDirectory);
62+
} elseif (!is_dir($this->targetDirectory)) {
63+
throw new RuntimeException("Target directory $this->targetDirectory is not a directory");
64+
}
65+
}
66+
67+
public function execute()
68+
{
69+
copy($this->fileName, $this->targetDirectory . '/' . basename($this->fileName));
70+
}
71+
}
72+
73+
function executeAction(ActionHandler $actionHandler)
74+
{
75+
$reflection = new ReflectionObject($actionHandler);
76+
77+
foreach ($reflection->getMethods() as $method) {
78+
$attributes = $method->getAttributes(SetUp::class);
79+
80+
if (count($attributes) > 0) {
81+
$methodName = $method->getName();
82+
83+
$actionHandler->$methodName();
84+
}
85+
}
86+
87+
$actionHandler->execute();
88+
}
89+
90+
$copyAction = new CopyFile();
91+
$copyAction->fileName = "/tmp/foo.jpg";
92+
$copyAction->targetDirectory = "/home/user";
93+
94+
executeAction($copyAction);
95+
]]>
96+
</programlisting>
97+
</example>
98+
</sect1>
99+
100+
<sect1 xml:id="language.attributes.syntax">
101+
<title>Sintassi degli attributi</title>
102+
103+
<para>
104+
La sintassi degli attributi è composta da diversi elementi chiave. Una dichiarazione
105+
di attributo inizia con <literal>#[</literal> e termina con
106+
<literal>]</literal>. All'interno, è possibile elencare uno o più attributi,
107+
separati da virgole. Il nome dell'attributo può essere non qualificato, qualificato
108+
o completamente qualificato, come descritto in <link linkend="language.namespaces.basics">Utilizzo base dei Namespace</link>.
109+
Gli argomenti dell'attributo sono opzionali e racchiusi tra parentesi
110+
<literal>()</literal>. Gli argomenti possono essere solo valori letterali o espressioni
111+
costanti. È supportata sia la sintassi con argomenti posizionali che quella con argomenti nominati.
112+
</para>
113+
114+
<para>
115+
I nomi degli attributi e i loro argomenti vengono risolti in una classe, e gli argomenti
116+
vengono passati al suo costruttore quando un'istanza dell'attributo viene richiesta
117+
tramite la Reflection API. Pertanto, è raccomandato introdurre una classe
118+
per ogni attributo.
119+
</para>
120+
121+
<example>
122+
<title>Sintassi degli Attributi</title>
123+
124+
<programlisting role="php">
125+
<![CDATA[
126+
<?php
127+
// a.php
128+
namespace MyExample;
129+
130+
use Attribute;
131+
132+
#[Attribute]
133+
class MyAttribute
134+
{
135+
const VALUE = 'value';
136+
137+
private $value;
138+
139+
public function __construct($value = null)
140+
{
141+
$this->value = $value;
142+
}
143+
}
144+
145+
// b.php
146+
147+
namespace Another;
148+
149+
use MyExample\MyAttribute;
150+
151+
#[MyAttribute]
152+
#[\MyExample\MyAttribute]
153+
#[MyAttribute(1234)]
154+
#[MyAttribute(value: 1234)]
155+
#[MyAttribute(MyAttribute::VALUE)]
156+
#[MyAttribute(array("key" => "value"))]
157+
#[MyAttribute(100 + 200)]
158+
class Thing
159+
{
160+
}
161+
162+
#[MyAttribute(1234), MyAttribute(5678)]
163+
class AnotherThing
164+
{
165+
}
166+
]]>
167+
</programlisting>
168+
</example>
169+
</sect1>
170+
171+
172+
<sect1 xml:id="language.attributes.reflection">
173+
<title>Leggere gli attributi con la Reflection API</title>
174+
175+
<para>
176+
Per accedere agli attributi da classi, metodi, funzioni, parametri, proprietà
177+
e costanti di classe, si utilizza il metodo <function>getAttributes</function> fornito
178+
dalla Reflection API. Questo metodo restituisce un array di istanze di <classname>ReflectionAttribute</classname>.
179+
Queste istanze possono essere interrogate per ottenere il nome dell'attributo, gli argomenti, e
180+
possono essere utilizzate per creare un'istanza dell'attributo rappresentato.
181+
</para>
182+
183+
<para>
184+
Separare la rappresentazione riflessa dell'attributo dalla sua istanza effettiva fornisce un maggiore
185+
controllo sulla gestione degli errori, come classi di attributi mancanti, argomenti errati
186+
o valori mancanti. Gli oggetti della classe attributo vengono istanziati solo dopo la chiamata a
187+
<function>ReflectionAttribute::newInstance</function>, garantendo che la validazione degli argomenti
188+
avvenga in quel momento.
189+
</para>
190+
191+
<example>
192+
<title>Lettura degli attributi utilizzando la Reflection API</title>
193+
194+
<programlisting role="php">
195+
<![CDATA[
196+
<?php
197+
198+
#[Attribute]
199+
class MyAttribute
200+
{
201+
public $value;
202+
203+
public function __construct($value)
204+
{
205+
$this->value = $value;
206+
}
207+
}
208+
209+
#[MyAttribute(value: 1234)]
210+
class Thing
211+
{
212+
}
213+
214+
function dumpAttributeData($reflection) {
215+
$attributes = $reflection->getAttributes();
216+
217+
foreach ($attributes as $attribute) {
218+
var_dump($attribute->getName());
219+
var_dump($attribute->getArguments());
220+
var_dump($attribute->newInstance());
221+
}
222+
}
223+
224+
dumpAttributeData(new ReflectionClass(Thing::class));
225+
/*
226+
string(11) "MyAttribute"
227+
array(1) {
228+
["value"]=>
229+
int(1234)
230+
}
231+
object(MyAttribute)#3 (1) {
232+
["value"]=>
233+
int(1234)
234+
}
235+
*/
236+
237+
]]>
238+
</programlisting>
239+
</example>
240+
241+
<para>
242+
Invece di iterare su tutti gli attributi dell'istanza di riflessione,
243+
è possibile recuperare solo quelli di una specifica classe di attributo passando
244+
il nome della classe attributo come argomento.
245+
</para>
246+
247+
<example>
248+
<title>Lettura di attributi specifici utilizzando la Reflection API</title>
249+
250+
<programlisting role="php">
251+
<![CDATA[
252+
<?php
253+
254+
function dumpMyAttributeData($reflection) {
255+
$attributes = $reflection->getAttributes(MyAttribute::class);
256+
257+
foreach ($attributes as $attribute) {
258+
var_dump($attribute->getName());
259+
var_dump($attribute->getArguments());
260+
var_dump($attribute->newInstance());
261+
}
262+
}
263+
264+
dumpMyAttributeData(new ReflectionClass(Thing::class));
265+
]]>
266+
</programlisting>
267+
</example>
268+
</sect1>
269+
270+
<sect1 xml:id="language.attributes.classes">
271+
<title>Dichiarazione delle classi attributo</title>
272+
273+
<para>
274+
È raccomandato definire una classe separata per ogni attributo. Nel caso più semplice,
275+
è sufficiente una classe vuota con la dichiarazione <literal>#[Attribute]</literal>.
276+
L'attributo può essere importato dal namespace globale utilizzando un'istruzione
277+
<literal>use</literal>.
278+
</para>
279+
280+
<example>
281+
<title>Classe attributo semplice</title>
282+
283+
<programlisting role="php">
284+
<![CDATA[
285+
<?php
286+
287+
namespace Example;
288+
289+
use Attribute;
290+
291+
#[Attribute]
292+
class MyAttribute
293+
{
294+
}
295+
]]>
296+
</programlisting>
297+
</example>
298+
299+
<para>
300+
Per limitare i tipi di dichiarazioni a cui un attributo può essere applicato,
301+
è possibile passare una bitmask come primo argomento alla dichiarazione
302+
<literal>#[Attribute]</literal>.
303+
</para>
304+
305+
<example>
306+
<title>Utilizzo della specifica del target per limitare dove gli attributi possono essere usati</title>
307+
308+
<programlisting role="php">
309+
<![CDATA[
310+
<?php
311+
312+
namespace Example;
313+
314+
use Attribute;
315+
316+
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION)]
317+
class MyAttribute
318+
{
319+
}
320+
]]>
321+
</programlisting>
322+
323+
<para>
324+
Dichiarare <classname>MyAttribute</classname> su un altro tipo genererà ora un'eccezione durante
325+
la chiamata a <function>ReflectionAttribute::newInstance</function>
326+
</para>
327+
</example>
328+
329+
<para>È possibile specificare i seguenti target:</para>
330+
331+
<simplelist>
332+
<member><constant>Attribute::TARGET_CLASS</constant></member>
333+
<member><constant>Attribute::TARGET_FUNCTION</constant></member>
334+
<member><constant>Attribute::TARGET_METHOD</constant></member>
335+
<member><constant>Attribute::TARGET_PROPERTY</constant></member>
336+
<member><constant>Attribute::TARGET_CLASS_CONSTANT</constant></member>
337+
<member><constant>Attribute::TARGET_PARAMETER</constant></member>
338+
<member><constant>Attribute::TARGET_ALL</constant></member>
339+
</simplelist>
340+
341+
<para>
342+
Per impostazione predefinita, un attributo può essere utilizzato solo una volta per dichiarazione. Per
343+
permettere a un attributo di essere ripetibile, è necessario specificarlo nella bitmask della
344+
dichiarazione <literal>#[Attribute]</literal> utilizzando il flag
345+
<constant>Attribute::IS_REPEATABLE</constant>.
346+
</para>
347+
348+
<example>
349+
<title>Utilizzo di IS_REPEATABLE per permettere un attributo su una dichiarazione più volte</title>
350+
351+
<programlisting role="php">
352+
<![CDATA[
353+
<?php
354+
355+
namespace Example;
356+
357+
use Attribute;
358+
359+
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION | Attribute::IS_REPEATABLE)]
360+
class MyAttribute
361+
{
362+
}
363+
]]>
364+
</programlisting>
365+
366+
</example>
367+
</sect1>
368+
</chapter>
369+
370+
<!-- Keep this comment at the end of the file
371+
Local variables:
372+
mode: sgml
373+
sgml-omittag:t
374+
sgml-shorttag:t
375+
sgml-minimize-attributes:nil
376+
sgml-always-quote-attributes:t
377+
sgml-indent-step:1
378+
sgml-indent-data:t
379+
indent-tabs-mode:nil
380+
sgml-parent-document:nil
381+
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
382+
sgml-exposed-tags:nil
383+
sgml-local-catalogs:nil
384+
sgml-local-ecat-files:nil
385+
End:
386+
vim600: syn=xml fen fdm=syntax fdl=2 si
387+
vim: et tw=78 syn=sgml
388+
vi: ts=1 sw=1
389+
-->

0 commit comments

Comments
 (0)