Skip to content

Commit 91c6c28

Browse files
author
Gabriel PREDA
committed
Bring in line w/ EN version in OOP section
git-svn-id: https://svn.php.net/repository/phpdoc/ro/trunk@352176 c90b9560-bf6c-de11-be94-00142212c4b1
1 parent 55b2aba commit 91c6c28

File tree

1 file changed

+159
-31
lines changed

1 file changed

+159
-31
lines changed

language/oop5/decon.xml

Lines changed: 159 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<!-- $Revision$ -->
33
<!-- $Author$ -->
4-
<!-- EN-Revision: db2ac1420fa7946f15518a9e42e1474159b765fd Maintainer: radical Status: ready -->
4+
<!-- EN-Revision: a6338d747762e36e01061eae19aadca4167375b6 Maintainer: radical Status: ready -->
55
<!-- CREDITS: simionea -->
66

77
<sect1 xml:id="language.oop5.decon" xmlns="http://docbook.org/ns/docbook">
@@ -11,8 +11,7 @@
1111
<title>Constructor</title>
1212
<methodsynopsis xml:id="object.construct">
1313
<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>
1615
</methodsynopsis>
1716
<para>
1817
PHP 5 permite programatorilor să definească constructori pentru clase.
@@ -61,57 +60,186 @@ $obj = new SubClass();
6160
6261
// In BaseClass constructor
6362
$obj = new OtherSubClass();
64-
?>
63+
?>
6564
]]>
6665
</programlisting>
6766
</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>
8667
<para>
8768
Spre deosebire de alte metode, PHP nu va genera un mesaj de eroare de nivel
8869
<constant>E_STRICT</constant> atunci când <link linkend="object.construct">__construct()</link>
8970
este suprascrisă cu alți parametri decât cei ai metodei
9071
<link linkend="object.construct">__construct()</link> din clasa-părinte.
9172
</para>
9273
<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.
9678
</para>
9779
<example>
9880
<title>Constructori în clasele cu spații de nume</title>
9981
<programlisting role="php">
10082
<![CDATA[
10183
<?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;
10791
}
10892
}
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);
109100
?>
110101
]]>
111102
</programlisting>
112103
</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+
}
114211
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>
115243
<sect2 xml:id="language.oop5.decon.destructor">
116244
<title>Destructori</title>
117245
<methodsynopsis xml:id="object.destruct">

0 commit comments

Comments
 (0)