|
1 | 1 | <?xml version="1.0" encoding="utf-8"?>
|
2 | 2 | <!-- $Revision$ -->
|
3 | 3 | <!-- $Author$ -->
|
4 |
| -<!-- EN-Revision: db2ac1420fa7946f15518a9e42e1474159b765fd Maintainer: radical Status: ready --> |
| 4 | +<!-- EN-Revision: a6338d747762e36e01061eae19aadca4167375b6 Maintainer: radical Status: ready --> |
5 | 5 | <!-- CREDITS: simionea -->
|
6 | 6 |
|
7 | 7 | <sect1 xml:id="language.oop5.decon" xmlns="http://docbook.org/ns/docbook">
|
|
11 | 11 | <title>Constructor</title>
|
12 | 12 | <methodsynopsis xml:id="object.construct">
|
13 | 13 | <type>void</type><methodname>__construct</methodname>
|
14 |
| - <methodparam choice="opt"><type>mixed</type><parameter>args</parameter><initializer>""</initializer></methodparam> |
15 |
| - <methodparam choice="opt"><parameter>...</parameter></methodparam> |
| 14 | + <methodparam rep="repeat"><type>mixed</type><parameter>values</parameter><initializer>""</initializer></methodparam> |
16 | 15 | </methodsynopsis>
|
17 | 16 | <para>
|
18 | 17 | PHP 5 permite programatorilor să definească constructori pentru clase.
|
@@ -61,57 +60,186 @@ $obj = new SubClass();
|
61 | 60 |
|
62 | 61 | // In BaseClass constructor
|
63 | 62 | $obj = new OtherSubClass();
|
64 |
| -?> |
| 63 | +?> |
65 | 64 | ]]>
|
66 | 65 | </programlisting>
|
67 | 66 | </example>
|
68 |
| - <para> |
69 |
| - Pentru compatibilitate cu PHP 3 și 4, dacă PHP nu poate găsi funcția |
70 |
| - <link linkend="object.construct">__construct()</link> pentru o clasă dată, |
71 |
| - va fi căutată funcția constructor de stil vechi, cu numele clasei. |
72 |
| - Drept urmare, singurul caz care va duce la probleme de compatibilitate este |
73 |
| - dacă clasa a avut o metodă <link linkend="object.construct">__construct()</link> |
74 |
| - folosită cu alt scop semantic. |
75 |
| - </para> |
76 |
| - <!-- Not using an entity because I want specific wording here, since we're |
77 |
| - not deprecating constructors in general. --> |
78 |
| - <warning> |
79 |
| - <simpara> |
80 |
| - Constructorii de stil vechi sunt <emphasis>ÎNVECHIȚI</emphasis> în PHP 7.0 |
81 |
| - și vor fi eliminați într-o versiune ulterioară. Trebuie întotdeauna să |
82 |
| - utilizați <link linkend="object.construct">__construct()</link> în |
83 |
| - coduri-sursă noi. |
84 |
| - </simpara> |
85 |
| - </warning> |
86 | 67 | <para>
|
87 | 68 | Spre deosebire de alte metode, PHP nu va genera un mesaj de eroare de nivel
|
88 | 69 | <constant>E_STRICT</constant> atunci când <link linkend="object.construct">__construct()</link>
|
89 | 70 | este suprascrisă cu alți parametri decât cei ai metodei
|
90 | 71 | <link linkend="object.construct">__construct()</link> din clasa-părinte.
|
91 | 72 | </para>
|
92 | 73 | <para>
|
93 |
| - Începând cu PHP 5.3.3, metodele cu același nume ca și ultimul element al |
94 |
| - unei clase din spațiul de nume nu vor mai fi tratate ca constructor. Această |
95 |
| - schimbare nu afectează clasele fără spații de nume. |
| 74 | + Constructorii sunt metode apelate la inițializarea obiectelor. |
| 75 | + Aceștia pot fi definiți cu un număr arbitrar de argumente, care |
| 76 | + pot fi opționali sau nu, pot ave tip, și pot avea valoare implicită. Argumentele pentru |
| 77 | + constructori se pun între paranteze după numele clasei. |
96 | 78 | </para>
|
97 | 79 | <example>
|
98 | 80 | <title>Constructori în clasele cu spații de nume</title>
|
99 | 81 | <programlisting role="php">
|
100 | 82 | <![CDATA[
|
101 | 83 | <?php
|
102 |
| -namespace Foo; |
103 |
| -class Bar { |
104 |
| - public function Bar() { |
105 |
| - // tratată ca constructor în PHP 5.3.0-5.3.2 |
106 |
| - // tratată ca o metodă obișnuită începând cu PHP 5.3.3 |
| 84 | +class Point { |
| 85 | + protected int $x; |
| 86 | + protected int $y; |
| 87 | +
|
| 88 | + public function __construct(int $x, int $y = 0) { |
| 89 | + $this->x = $x; |
| 90 | + $this->y = $y; |
107 | 91 | }
|
108 | 92 | }
|
| 93 | +
|
| 94 | +// Apel cu ambii parametrii |
| 95 | +$p1 = new Point(4, 5); |
| 96 | +// Apel cu argumentul necesar. $y va prelua valoare implictă 0. |
| 97 | +$p2 = new Point(4); |
| 98 | +// Cu argumente numite (începând cu PHP 8.0): |
| 99 | +$p3 = new Point(y: 5, x: 4); |
109 | 100 | ?>
|
110 | 101 | ]]>
|
111 | 102 | </programlisting>
|
112 | 103 | </example>
|
113 |
| - </sect2> |
| 104 | + <para> |
| 105 | + Dacă o clasă nu are constructor, sau constructorul nu are nici un argument necesar, parantezele |
| 106 | + pot fi omise. |
| 107 | + </para> |
| 108 | + <sect3> |
| 109 | + <title>Constructorii de stil vechi</title> |
| 110 | + <para> |
| 111 | + Înainte de PHP 8.0.0, clasele din namespaceul global interpretau o metodă cu același nume |
| 112 | + ca și clasa ca un constructor de stil vechi. Acea syntaxă este învechită și nerecomandată, |
| 113 | + iar utilizarea ei va genera or eroare de tip <constant>E_DEPRECATED</constant> dar metoda constructor va fi apelată. |
| 114 | + Dacă atât <link linkend="object.construct">__construct()</link> cât și o motodă cu acelasi nume cu al clasei sunt |
| 115 | + definite, numai <link linkend="object.construct">__construct()</link> va fi apelat. |
| 116 | + </para> |
| 117 | + <para> |
| 118 | + În clasele din namespace-uri, sau orice altă clasă începând cu PHP 8.0.0, o metodă cu același nume |
| 119 | + cu al clasei nu are însemnătate specială. |
| 120 | + </para> |
| 121 | + <para>Folosiți întotdeauna <link linkend="object.construct">__construct()</link> în cod nou. |
| 122 | + </para> |
| 123 | + </sect3> |
| 124 | + <sect3 xml:id="language.oop5.decon.constructor.promotion"> |
| 125 | + <title>Promovarea prin constructor</title> |
| 126 | + <para> |
| 127 | + Începând cu PHP 8.0.0, parametrii constructorului pot fi promovati să corespundă cu o |
| 128 | + proprietate a objectului. Este foarte des întâlnit ca parametrii constructorului să fie asignat |
| 129 | + unei proprietăți în constructor și apoi să nu se mai lucreze cu acea proprietate. Promovarea prin constructor |
| 130 | + oferă o scurtătură a acestul caz. Exemplul de mai sus poate fi rescris în forma următoare. |
| 131 | + </para> |
| 132 | + <example> |
| 133 | + <title>Folosirea promovării prin constructor</title> |
| 134 | + <programlisting role="php"> |
| 135 | +<![CDATA[ |
| 136 | +<?php |
| 137 | +class Point { |
| 138 | + public function __construct(protected int $x, protected int $y = 0) { |
| 139 | + } |
| 140 | +} |
| 141 | +]]> |
| 142 | + </programlisting> |
| 143 | + </example> |
| 144 | + <para> |
| 145 | + Atunci când argumentele constructorului include modificatori de vizibilitate, PHP îl va interpreta atât ca |
| 146 | + o proprietate a obiectului cât și drept argument al constructorului, va asigna valoarea argumentului la |
| 147 | + proprietatea respectivă. Corpul constructorului poate fi gol sau poate contine alte declarații. |
| 148 | + Declarațiile vor fi executate după ce valorile au fost asignate |
| 149 | + la proprietățile corespunzătoare. |
| 150 | + </para> |
| 151 | + <para> |
| 152 | + Nu este necesar să fie promovate toate argumentele. Este posibil să se amestece argumente/proprietăți promovate și nepromovate, |
| 153 | + în orice ordine. Argumentele promovate nu au nici un impact asupra codului care apelează constructorul. |
| 154 | + </para> |
| 155 | + <note> |
| 156 | + <para> |
| 157 | + Proprietățile obiectelor nu pot fi de tipul <type>callable</type> pentru că ar introduce ambiguități. |
| 158 | + Argumentele promovate, de asemenea, nu pot fi de tipul <type>callable</type>. Orice |
| 159 | + alte <link linkend="language.types.declarations">declarații de tip</link> sunt permise. |
| 160 | + </para> |
| 161 | + </note> |
| 162 | + <note> |
| 163 | + <para> |
| 164 | + <!-- This should be linked once attributes are documented. --> |
| 165 | + Atributele plasate ca argumente la un constructor promovat vor fi replicate și ca proprietăți dar |
| 166 | + și ca argumente. |
| 167 | + </para> |
| 168 | + </note> |
| 169 | + </sect3> |
| 170 | + <sect3 xml:id="language.oop5.decon.constructor.static"> |
| 171 | + <title>Metode de creare statice</title> |
| 172 | + <para> |
| 173 | + PHP suportă un singur constructor într-o clasă. În unele cazuri, însă, este nevoie |
| 174 | + să permitem crearea unui obiect în diferite feluri cu intrări diferite. |
| 175 | + Metoda recomandată este folosind metode statice care împacheterază constructorul. |
| 176 | + </para> |
| 177 | + <example> |
| 178 | + <title>Folosirea metodelor de creare statice</title> |
| 179 | + <programlisting role="php"> |
| 180 | +<![CDATA[ |
| 181 | +<?php |
| 182 | +class Product { |
| 183 | +
|
| 184 | + private ?int $id; |
| 185 | + private ?string $name; |
| 186 | +
|
| 187 | + private function __construct(?int $id = null, ?string $name = null) { |
| 188 | + $this->id = $id; |
| 189 | + $this->name = $name; |
| 190 | + } |
| 191 | +
|
| 192 | + public static function fromBasicData(int $id, string $name): static { |
| 193 | + $new = new static($id, $name); |
| 194 | + return $new; |
| 195 | + } |
| 196 | +
|
| 197 | + public static function fromJson(string $json): static { |
| 198 | + $data = json_decode($json); |
| 199 | + return new static($data['id'], $data['name']); |
| 200 | + } |
| 201 | +
|
| 202 | + public static function fromXml(string $xml): static { |
| 203 | + // Put your own logic here. |
| 204 | + $data = convert_xml_to_array($xml); |
| 205 | + $new = new static(); |
| 206 | + $new->id = $data['id']; |
| 207 | + $new->name = $data['name']; |
| 208 | + return $new; |
| 209 | + } |
| 210 | +} |
114 | 211 |
|
| 212 | +$p1 = Product::fromBasicData(5, 'Widget'); |
| 213 | +$p2 = Product::fromJson($some_json_string); |
| 214 | +$p3 = Product::fromXml($some_xml_string); |
| 215 | +]]> |
| 216 | + </programlisting> |
| 217 | + </example> |
| 218 | + <para> |
| 219 | + Constructorul poate fi făcut private sau protected pentru a preveni apelarea din exterior. |
| 220 | + Dacă se alege această cale, numai o metodă statică va putea instanția classa. Pentru că sunt definite în |
| 221 | + aceeași clasă au access la metodele private, chiar dacă obiectele instanțiate sunt |
| 222 | + diferite. Un constructor private este opțional și poate fi o alegere bună în funcție |
| 223 | + de cerințe... |
| 224 | + </para> |
| 225 | + <para> |
| 226 | + Cele trei metode statice publice demonstrează feluri diferite de instanțiere a obiectelor. |
| 227 | + </para> |
| 228 | + <simplelist> |
| 229 | + <member><code>fromBasicData()</code> permite exact parametrii necesari, și apoi crează |
| 230 | + obiectul apelând constructorul și returnând rezultatul.</member> |
| 231 | + <member><code>fromJson()</code> acceptă un text în format JSON și îl pre-procesează pentru într-un |
| 232 | + format necesar constructorului. Apoi returnează obiectul nou.</member> |
| 233 | + <member><code>fromXml()</code> acceptă un text XML, în pro-procesează, apoi crează un obiect |
| 234 | + gol. Constructorul este apelat, dar pentru că toți parapetrii sunt opționali nu sunt |
| 235 | + pasați. Apoi asignează valori corecte proprietăților obiectului înainte de a întoarce rezultatul.</member> |
| 236 | + </simplelist> |
| 237 | + <para> |
| 238 | + În toate cele trei cazuri, cuvântul cheie <code>static</code>este tradus în numele clasei în care este scris acest cod. |
| 239 | + În acest caz, <code>Product</code>. |
| 240 | + </para> |
| 241 | + </sect3> |
| 242 | + </sect2> |
115 | 243 | <sect2 xml:id="language.oop5.decon.destructor">
|
116 | 244 | <title>Destructori</title>
|
117 | 245 | <methodsynopsis xml:id="object.destruct">
|
|
0 commit comments