cvs: phpdoc-ro /appendices migration.xml migration4.xml migration5.xml migration51.xml

From: Date: Fri, 14 Dec 2007 08:39:56 +0000
Subject: cvs: phpdoc-ro /appendices migration.xml migration4.xml migration5.xml migration51.xml
Groups: php.doc.ro 
Request: Send a blank email to doc-ro+get-326@lists.php.net to get a copy of this message
simionea Fri Dec 14 08:39:56 2007 UTC Added files: /phpdoc-ro/appendices migration.xml migration4.xml migration5.xml migration51.xml Log: Translated the file.

http://cvs.php.net/viewvc.cgi/phpdoc-ro/appendices/migration.xml?view=markup&rev=1.1 Index: phpdoc-ro/appendices/migration.xml +++ phpdoc-ro/appendices/migration.xml <?xml version="1.0" encoding="utf-8"?> <!-- $Revision: 1.1 $ --> <!-- EN-Revision: 1.27 Maintainer: simionea Status: translated --> <appendix xml:id="migration" xmlns="http://docbook.org/ns/docbook"> <title>Migrarea de la PHP/FI 2 la PHP 3</title> <section xml:id="migration.about"> <title>Despre incompatibilităţile din 3.0</title> <simpara> PHP 3.0 este rescris de la zero. El posedă un analizator potrivit care este mult mai robust şi mai consistent decât cel din 2.0. 3.0 este de asemenea mult mai rapid şi utilizează mai puţină memorie. Însă unele din aceste îmbunătăţiri nu au fost posibile fără schimbări în compatibilitate, atât în sintaxă, cât şi în funcţionalitate. </simpara> <simpara> Suplimentar, programatorii PHP au încercat să curăţe atât sintaxa PHP, cât şi semantica sa în versiunea 3.0, şi aceasta la fel a cauzat unele incompatibilităţi. La scară largă, noi considerăm că aceste schimbări sunt spre bine. </simpara> <simpara> Acest capitol va încerca să vă indice calea prin incompatibilităţile de care vă puteţi ciocni la trecerea de la PHP/FI 2.0 la PHP 3.0 şi să vă ajute să le depăşiţi. Facilităţile noi nu sunt menţionate aici, dacă aceasta nu este necesar. </simpara> <simpara> Există şi un program de convertire, care poate converti automat script-urile dumneavoastră vechi PHP/FI 2.0. El poate fi găsit în subdirectorul <filename class="directory">convertor</filename> al distributivului PHP 3.0. Însă acest program interceptează doar schimbările de sintaxă, de aceea oricum trebuie să citiţi cu atenţie acest capitol. </simpara> </section> <section xml:id="migration.old-function"> <title><literal>old_function</literal></title> <simpara> Declaraţia <literal>old_function</literal> vă permite să declaraţi o funcţie utilizând o sintaxă identică cu PHP/FI2 (cu excepţia că trebuie să înlocuiţi 'function' cu 'old_function'). </simpara> <simpara> Aceasta este o facilitate dezaprobată şi ar trebui utilizată numai de convertorul PHP/FI2-&gt;PHP 3. </simpara> <warning> <para> Funcţiile declarate ca <literal>old_function</literal> nu pot fi apelate din codul-sursă intern al PHP. Printre altele, aceasta înseamnă că nu le puteţi utiliza în funcţii ca <function>usort</function>, <function>array_walk</function> şi <function>register_shutdown_function</function>. Puteţi să depăşiţi această limitare scriind o funcţie-înveliş (în forma normală PHP 3) care să apeleze <literal>old_function</literal>. </para> </warning> </section> <section xml:id="migration.startendtags"> <title>Etichetele de start/sfârşit</title> <para> Primul lucru pe care probabil îl veţi observa este că etichetele de start şi de sfârşit ale PHP s-au schimbat. Forma veche <literal>&lt;? &gt;</literal> a fost înlocuită de alte trei forme noi posibile: <example> <title>Migrarea: etichetele de start/sfârşit vechi</title> <programlisting role="php"> <![CDATA[ <? echo "Acesta este cod PHP/FI 2.0.\n"; > ]]> </programlisting> </example> Începând cu versiunea 2.0, PHP/FI de asemenea susţine această variaţie: <example> <title>Migrarea: primele etichete de start/sfârşit</title> <programlisting role="php"> <![CDATA[ <? echo "Acesta este cod PHP 3.0!\n"; ?> ]]> </programlisting> </example> Observaţi că acum eticheta de sfârşit constă dintr-un semn de întrebare şi un caracter "mai mare ca" în loc de numai "mai mare ca". Însă dacă planificaţi să utilizaţi XML pe server, vă veţi ciocni de probleme utilizând prima variantă, deoarece PHP poate să încerce să execute marcajul XML din documentele XML ca cod PHP. Din această cauză a fost introdusă următoarea variaţie: <example> <title>Migrarea: a doua pereche nouă de etichete de start/sfârşit</title> <programlisting role="php"> <![CDATA[ <?php echo "Acesta este cod PHP 3.0!\n"; ?> ]]> </programlisting> </example> Unele persoane au avut probleme cu editoare care nu înţeleg de loc etichetele instrucţiunilor pentru procesare. Microsoft FrontPage este un astfel de editor, şi pentru a depăşi aceste probleme, următoarea variaţie a fost introdusă: <example> <title>Migrarea: a treia pereche nouă de etichete de start/sfârşit</title> <programlisting role="php"> <![CDATA[ <script language="php"> echo "Acesta este cod PHP 3.0!\n"; </script> ]]> </programlisting> </example> </para> </section> <section xml:id="migration.if-endif"> <title>Sintaxa if..endif</title> <para> Modul 'alternativ' pentru a scrie declaraţiile if/elseif/else, utilizând if(); elseif(); else; endif; nu pot fi implementate eficient fără a introduce o mare complexitate în analizatorul 3.0. Din această cauză a fost schimbată sintaxa: <example> <title>Migrarea: sintaxa veche if..endif</title> <programlisting role="php"> <![CDATA[ if ($foo); echo "yep\n"; elseif ($bar); echo "almost\n"; else; echo "nope\n"; endif; ]]> </programlisting> </example> <example> <title>Migrarea: noua sintaxă if..endif</title> <programlisting role="php"> <![CDATA[ if ($foo): echo "yep\n"; elseif ($bar): echo "almost\n"; else: echo "nope\n"; endif; ]]> </programlisting> </example> Observaţi că punctul şi virgula au fost înlocuite cu două puncte în toate declaraţiile în afară de cea care încheie expresia (endif). </para> </section> <section xml:id="migration.while"> <title>Sintaxa while</title> <para> La fel ca şi în cazul if..endif, sintaxa while..endwhile de asemenea s-a schimbat: <example> <title>Migrarea: sintaxa veche while..endwhile</title> <programlisting role="php"> <![CDATA[ while ($more_to_come); ... endwhile; ]]> </programlisting> </example> <example> <title>Migrarea: sintaxa nouă while..endwhile</title> <programlisting role="php"> <![CDATA[ while ($more_to_come): ... endwhile; ]]> </programlisting> </example> </para> <warning> <simpara> Dacă utilizaţi sintaxa veche while..endwhile în PHP 3.0 veţi intra într-o buclă fără sfârşit. </simpara> </warning> </section> <section xml:id="migration.expr"> <title>Tipurile expresiilor</title> <simpara> PHP/FI 2.0 utiliza partea stângă a expresiilor pentru a determina de ce tip ar trebui să fie rezultatul. PHP 3.0 ia în consideraţie ambele părţi la determinarea tipurilor rezultatelor, şi aceasta poate duce la aceea că script-urile 2.0 se vor comporta imprevizibil în 3.0. </simpara> <para> Consideraţi urnătorul exemplu: <informalexample> <programlisting role="php"> <![CDATA[ $a[0]=5; $a[1]=7; $key = key($a); while ("" != $key) { echo "$keyn"; next($a); } ]]> </programlisting> </informalexample> În PHP/FI 2.0 aceasta va afişa ambii indici ai $a. În PHP 3.0 aceasta nu va afişa nimic. Motivul este că în PHP 2.0 din cauza că tipul argumentului stâng era string, se efectua o comparaţie între string-uri, şi într-adevăr <literal>""</literal> nu este egal cu <literal>"0"</literal> şi ciclul rula. În PHP 3.0, când un string este comparat cu un integer, se efectuează o comparaţie între integeri (string-ul este convertit în integer). Aceasta rezultă în compararea <literal>atoi("")</literal>, care este <literal>0</literal> şi <literal>variablelist</literal>, care de asemenea e <literal>0</literal>, şi deoarece <literal>0==0</literal>, ciclul nu se execută nici o dată. </para> <para> Pentru a corecta acest exempu înlocuiţi declaraţia while cu: <informalexample> <programlisting role="php"> <![CDATA[ while ((string)$key != "") { ]]> </programlisting> </informalexample> </para> </section> <section xml:id="migration.errors"> <title>Mesajele de eroare s-au schimbat</title> <simpara> Mesajele de eroare ale PHP 3.0 sunt de obicei mai exacte decât cele din 2.0, însă de acum nu mai vedeţi fragmentul codului-sursă care a cauzat eroarea. Cu toate acestea, va fi furnizat numele fişierului şi numărul liniei unde s-a petrecut eroarea. </simpara> </section> <section xml:id="migration.booleval"> <title>Evaluarea boolean-ă scurt-circuitată</title> <simpara> În PHP 3.0 evaluarea boolean-ă e scurt-circuitată. Aceasta înseamnă că într-o expresie ca <literal>(1 || test_me())</literal>, funcţia <function>test_me</function> nu va fi executată deoarece nimic nu poate schimba rezultatul expresiei după <literal>1</literal>. </simpara> <simpara> Aceasta este o problemă minoră de compatibilitate, dar poate cauza efecte secundare neprevăzute. </simpara> </section> <section xml:id="migration.truefalse"> <title>Valorile &true;/&false; întoarse de funcţii</title> <simpara> Majoritatea funcţiilor interne au fost rescrise pentru a întoarce &true; în caz de succes şi &false; în caz de eşec, contrar cu 0 şi -1 respectiv în PHP/FI 2.0. Noul comportament permite scrierea unui cod mai logic, cum ar fi <literal>$fp = fopen("/your/file") or fail("ahh!");</literal>. Deoarece PHP/FI 2.0 nu avea reguli clare despre ce valori trebuie să întoarcă funcţiile când eşuează, majoritatea acestor script-uri probabil vor trebui verificate manual după utilizarea convertorului 2.0 în 3.0. </simpara> <para> <example> <title>Migrarea de la 2.0: valoarea întoarsă, codul vechi</title> <programlisting role="php"> <![CDATA[ $fp = fopen($file, "r"); if ($fp == -1); echo("Nu a putut fi deschis $file pentru citire<br />\n"); endif; ]]> </programlisting> </example> <example> <title>Migrarea de la 2.0: valoarea întoarsă, codul nou</title> <programlisting role="php"> <![CDATA[ $fp = @fopen($file, "r") or print("Nu a putut fi deschis $file pentru citire<br />\n"); ]]> </programlisting> </example> </para> </section> <section xml:id="migration.other"> <title>Alte incompatibilităţi</title> <itemizedlist> <listitem><simpara> Modulul Apache pentru PHP 3.0 nu mai susţine Apache de versiuni mai vechi decât 1.2. Apache 1.2 sau ulterior este necesar. </simpara></listitem> <listitem><simpara> <function>echo</function> nu mai susţine string de formatare. În loc, utilizaţi funcţia <function>printf</function>. </simpara></listitem> <listitem><simpara> În PHP/FI 2.0 un efect secundar de implementare cauza <literal>$foo[0]</literal> să aibă acelaşi efect ca şi <literal>$foo</literal>. Aceasta nu este adevărat pentru PHP 3.0. </simpara></listitem> <listitem> <simpara> Citirea masivelor cu <literal>$array[]</literal> nu mai este susţinută </simpara> <simpara> Adică nu puteţi traversa un masiv având un ciclu cu <literal>$data = $array[]</literal>. Utilizaţi <function>current</function> şi <function>next</function> în loc. </simpara> <simpara> De asemenea, <literal>$array1[] = $array2</literal> nu adaugă valorile din <literal>$array2</literal> la <literal>$array1</literal>, dar adaugă <literal>$array2</literal> în calitate de ultimă înregistrare în <literal>$array1</literal>. Vedeţi de asemenea susţinerea masivelor multidimensionale. </simpara> </listitem> <listitem> <simpara> <literal>"+"</literal> nu mai este utilizat în calitate de operator de concatenare a string-urilor; el converteşte argumentele sale în numere şi efectuează sumarea numerică. Utilizaţi <literal>"."</literal> în loc. </simpara> </listitem> </itemizedlist> <example> <title>Migrarea de la 2.0: concatenarea string-urilor</title> <programlisting role="php"> <![CDATA[ echo "1" + "1"; ]]> </programlisting> <para> În PHP 2.0 aceasta ar afişa 11, în PHP 3.0 aceasta ar afişa 2. În loc, utilizaţi: <programlisting role="php"> <![CDATA[ echo "1"."1"; ]]> </programlisting> <programlisting role="php"> <![CDATA[ $a = 1; $b = 1; echo $a + $b; ]]> </programlisting> </para> <para> Aceasta va afişa 2 în ambele PHP 2.0 şi 3.0. <programlisting role="php"> <![CDATA[ $a = 1; $b = 1; echo $a.$b; ]]> </programlisting> Aceasta va afişa 11 în PHP 3.0. </para> </example> </section> </appendix> <!-- Translated by Simion Onea --> <!-- 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:"../../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 --> http://cvs.php.net/viewvc.cgi/phpdoc-ro/appendices/migration4.xml?view=markup&rev=1.1 Index: phpdoc-ro/appendices/migration4.xml +++ phpdoc-ro/appendices/migration4.xml <?xml version="1.0" encoding="utf-8"?> <!-- $Revision: 1.1 $ --> <!-- EN-Revision: 1.41 Maintainer: simionea Status: translated --> <appendix xml:id="migration4" xmlns="http://docbook.org/ns/docbook"> <title>Migrarea de la PHP 3 la PHP 4</title> <section xml:id='migration4.changes'> <title>Ce s-a schimbat în PHP 4</title> <para> PHP 4 şi motorul integrat Zend au îmbunătăţit substanţial performanţa şi capacităţile PHP, dar o mare atenţie s-a acordat faptului de a deteriora cât mai puţin posibil codul-sursă existent. Deci migrarea codului dumneavoastră de la PHP 3 la 4 ar trebui să fie mult mai uşoară decât migrarea de la PHP/FI 2 la PHP 3. O bună parte din codul-sursă existent în PHP 3 ar trebui să fie gata de a rula fără schimbări, dar totuşi ar trebui să ştiţi despre puţinele diferenţe şi să aveţi grijă să testaţi codul dumneavoastră sursă înainte de a schimba versiunile în mediile de producere. Următoarele ar trebui să vă dea nişte idei unde şi ce să căutaţi. </para> </section> <section xml:id="migration4.php4.with.php3"> <title>Rularea concomitentă a PHP 3 şi PHP 4</title> <simpara> Sistemele de operare recente oferă posibilitatea de a efectua separarea pe versiuni şi domenii. Aceste facilităţi fac posibilă rularea concomitentă a PHP 3 şi PHP 4 în calitate de module pe acelaşi server Apache. </simpara> <simpara> Această facilitate funcţionează pe următoarele platforme: </simpara> <itemizedlist> <listitem><simpara>Linux cu binutils recent (testat cu binutils 2.9.1.0.25)</simpara></listitem> <listitem><simpara>Solaris 2.5 sau mai bun</simpara></listitem> <listitem><simpara>FreeBSD (testat cu 3.2, 4.0)</simpara></listitem> </itemizedlist> <para> Pentru a o activa, configuraţi PHP 3 şi PHP 4 să utilizeze APXS (<option role="configure">--with-apxs</option>) şi extensiile de legătură necesare (<option role="configure">--enable-versioning</option>). În rest, toate instrucţiunile standarde de instalare rămân în vigoare. Spre exemplu: <informalexample> <programlisting role="shell"> <![CDATA[ $ ./configure \ --with-apxs=/apache/bin/apxs \ --enable-versioning \ --with-mysql \ --enable-track-vars ]]> </programlisting> </informalexample> </para> </section> <section xml:id="migration4.configuration"> <title>Migrarea fişierelor de configurare</title> <para> Fişierul de configurare global, <filename>php3.ini</filename>, şi-a schimbat numele în &php.ini;. </para> <para> Pentru fişierul de configurare Apache sunt un pic mai multe schimbări. Tipurile MIME recunoscute de modulul PHP s-au schimbat. <informalexample> <programlisting role="apache-conf"> <![CDATA[ application/x-httpd-php3 --> application/x-httpd-php application/x-httpd-php3-source --> application/x-httpd-php-source ]]> </programlisting> </informalexample> </para> <para> Puteţi face ca fişierele de configurare să funcţioneze cu ambele versiuni ale PHP (în dependenţă de ce versiune este la moment compilată în server) utilizând următoarea sintaxă: <informalexample> <programlisting role="apache-conf"> <![CDATA[ AddType application/x-httpd-php3 .php3 AddType application/x-httpd-php3-source .php3s AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps ]]> </programlisting> </informalexample> </para> <simpara> În plus, denumirile directivelor PHP pentru Apache s-au schimbat. </simpara> <para> Începând cu PHP 4.0, există doar patru directive Apache ce se referă la PHP: <informalexample> <programlisting role="apache-conf"> <![CDATA[ php_value [denumirea directivei PHP] [valoarea] php_flag [denumirea directivei PHP] [On|Off] php_admin_value [denumirea directivei PHP] [valoarea] php_admin_flag [denumirea directivei PHP] [On|Off] ]]> </programlisting> </informalexample> </para> <simpara> Sunt două diferenţe între valorile 'Admin' şi cele 'non Admin': </simpara> <itemizedlist> <listitem> <simpara> Valorile (sau fanioanele) 'Admin' pot să apară doar în fişierele de configurare Apache ce se referă la întreg serverul (de ex. &httpd.conf;). </simpara> </listitem> <listitem> <simpara> Valorile (sau fanioanele) standarde nu pot controla unele directive PHP, de exemplu: &safemode; (dacă aţi fi putut schimba configurarea modului securizat în fişierele &htaccess;, aceasta ar fi anulat scopul &safemode;). În contrast, valorile 'Admin' pot modifica valoarea oricărei directive PHP. </simpara> </listitem> </itemizedlist> <simpara> Pentru a face procesul de tranziţie mai simplu, PHP 4 conţine script-uri care convertesc automat fişierele de configurare Apache şi &htaccess; să lucreze atât cu PHP 3, cât şi cu PHP 4. Aceste script-uri NU convertesc liniile cu tipurile MIME! Dumneavoastră trebuie să le convertiţi în mod manual. </simpara> <para> Pentru a converti fişierele de configurare Apache, lansaţi script-ul apconf-conv.sh (disponibil în directorul scripts/apache/). De exemplu: <informalexample> <programlisting role="shell"> <![CDATA[ ~/php4/scripts/apache:# ./apconf-conv.sh /usr/local/apache/conf/httpd.conf ]]> </programlisting> </informalexample> </para> <simpara> Fişierul de configuraţie original va fi salvat în httpd.conf.orig. </simpara> <para> Pentru a converti fişierele &htaccess;, lansaţi script-ul <filename>aphtaccess-conv.sh</filename> (disponibil de asemenea în directorul <filename>scripts/apache/</filename>): <informalexample> <programlisting role="shell"> <![CDATA[ ~/php4/scripts/apache:# find / -name .htaccess -exec ./aphtaccess-conv.sh {} \; ]]> </programlisting> </informalexample> </para> <simpara> Similar, fişierele vechi &htaccess; vor fi salvate cu terminaţia '.orig'. </simpara> <simpara> Script-urile de conversie necesită ca 'awk' să fie instalat. </simpara> </section> <section xml:id='migration4.parser'> <title>Comportamentul analizatorului</title> <para> Analiza şi execuţia sunt acum doi paşi separaţi, nici o execuţie a codului-sursă din fişier nu va avea loc până când întregul fişier şi toate fişierele pe care le necesită nu au fost analizate deplin şi cu succes. </para> <para> Una din cerinţele noi introduse de către această separare este aceea că fişierele necesare şi cele incluse acum trebuie să fie depline din punct de vedere sintactic. Nu mai puteţi împrăştia diferite părţi ale unei structuri de control în mai multe fişiere. Adică nu puteţi începe o buclă <literal>for</literal> sau <literal>while</literal>, un control <literal>if</literal> sau un bloc <literal>switch</literal> într-un fişier şi să aveţi sfârşitul buclei, declaraţiile <literal>else</literal>, <literal>endif</literal>, <literal>case</literal> sau <literal>break</literal> în alt fişier. </para> <para> Totuşi este perfect legitim de a include cod-sursă suplimentar în cadrul buclelor, sau a altor structuri de control, doar că cuvintele cheie de control şi parantezele ondulate corespunzătoare <literal>{...}</literal> trebuie să fie în cadrul aceleiaşi unităţi compilate (fişier sau string <function>eval</function>-uat). </para> <para> Aceasta nu ar trebui să dăuneze prea mult, deoarece o astfel de împrăştiere a codului-sursă oricum trebuie considerată ca un stil de scriere foarte rău. </para> <para> Un alt lucru care nu mai este posibil, însă rar întâlnit în coduri PHP 3 este întoarcerea valorilor dintr-un fişier necesar, apelat prin <function>require</function>. Întoarcerea unei valori dintr-un fişier inclus încă este posibilă. </para> </section> <section xml:id='migration4.error-reporting'> <title>Raportarea erorilor</title> <section xml:id='migration4.error-reporting.config'> <title>Schimbările în configurare</title> <para> În PHP 3 nivelul raportării erorilor era stabilit ca o simplă valoare numerică formată prin sumarea numerelor referitoare la diferite nivele ale erorilor. Valorile obişnuite erau 15 pentru raportarea tuturor erorilor şi avertizărilor sau 7 pentru raportarea a tot, în afară de mesajele simple de notificare referitoare la stilul nepotrivit sau alte lucruri de acest fel. </para> <para> PHP 4 are un set mai mare de nivele de erori şi avertizări şi vine cu un analizator al configuraţiei care acum permite utilizarea constantelor simbolice pentru stabilirea comportamentului intenţionat. </para> <para> Nivelul raportării erorilor trebuie acum configurat eliminând în mod explicit nivelele de avertizări care nu doriţi să genereze mesaje de erori cu ajutorul operaţiei XOR din constanta simbolică <literal>E_ALL</literal>. Sună complicat? Ei bine, să zicem că doriţi ca sistemul de raportare a erorilor să raporteze totul în afară de avertizările simple de stil care sunt categorizate de constanta simbolică <literal>E_NOTICE</literal>. Atunci veţi scrie următoarele în fişierul &php.ini;: <literal>error_reporting = E_ALL &amp; ~ ( E_NOTICE )</literal>. Dacă de asemenea doriţi să suprimaţi avertizările, trebuie să adăugaţi constanta corespunzătoare în paranteze utilizând operatorul binar '|': <literal>error_reporting= E_ALL &amp; ~ ( E_NOTICE | E_WARNING )</literal>. </para> <warning> <para> La reînnoirea codului-sursă, sau a serverelor de la PHP 3 la PHP 4 ar trebui să verificaţi aceste setări şi apeluri către <function>error_reporting</function>, sau aţi putea să dezactivaţi raportarea erorilor de tipuri noi, în special <literal>E_COMPILE_ERROR</literal>. Aceasta poate duce la obţinerea unui rezultat vid, fără vre-un indiciu despre ce s-a întâmplat sau unde de căutat problema. </para> </warning> <warning> <para> Utilizatea valorilor vechi 7 şi 15 pentru a stabili nivelul raportării erorilor este o ideie foarte rea, deoarece aceasta va suprima unele clase noi de erori, inclusiv erori la analiză. Aceasta poate rezulta într-un comportament foarte ciudat, deoarece script-urile pot să nu mai funcţioneze, fără a afişa erori undeva. </para> <para> Aceasta a condus în trecut la o mulţime de rapoarte de erori nereproductibile când persoanele se ciocneau de probleme ale motorului de scriptare, pe care nu le puteau depista, în timp ce în realitate eroarea era o acoladă '}' care lipsea într-un fişier necesar, eroare pe care analizatorul nu era în stare să o raporteze din cauza sistemului de raportare a erorilor configurat greşit. </para> <para> Deci verificarea parametrilor raportării erorilor ar trebui să fie primul lucru pe care trebuie să-l faceţi atunci când script-urile dumneavoastră mor în tăcere. Motorul Zend poate fi considerat suficient de matur în zilele noastre pentru a nu cauza un astfel de comportament ciudat. </para> </warning> </section> <section xml:id='migration4.error-reporting.additions'> <title>Mesaje de avertizare suplimentare</title> <para> Foarte mult cod-sursă PHP 3 existent utilizaeză construcţii de limbaj care ar trebui considerate de stil foarte prost, deoarece acest cod, făcând în prezent ceea ce era intenţionat, ar putea fi foarte uşor stricat de schimbări din alte locuri. PHP 4 va afişa o mulţime de mesaje de notificare în astfel de situaţii când PHP 3 nu le-ar fi afişat. Soluţia cea mai simplă este de a deconecta pur şi simplu mesajele <literal>E_NOTICE</literal>, însă mai bine ar fi de a corecta codul-sursă în loc. </para> <para> Cel mai frecvent caz care acum va produce notificări este utilizarea constantelor string fără ghilimele în calitate de indici ai masivului. Atât PHP 3 cât şi 4 vor interpreta acestea ca string-uri dacă nu este vre-un cuvânt-cheie cau vre-o constantă cu acest nume, însă dacă o constantă cu un astfel de nume a fost definită anterior, aceasta ar putea deteriora script-ul dumneavoastră. Aceasta chiar poate deveni un risc de securitate dacă un intrus reuşeşte să redefinească constantele string în aşa fel, încât script-ul să-i ofere drepturi de acces, pe care nu trebuia să le aibă. De accea PHP 4 acum vă va avertiza de fiecare dată când utilizaţi constante string fără ghilimele, cum ar fi spre exemplu <literal>$_SERVER[REQUEST_METHOD]</literal>. Schimbând aceasta în <literal>$_SERVER['REQUEST_METHOD']</literal> va face analizatorul mai fericit şi va îmbunătăţi substanţial stilul şi securitatea codului dumneavoastră. </para> <para> Un alt lucru despre care PHP 4 vă va spune acum este utilizarea variabilelor sau a elementelor de masiv neiniţializate. </para> </section> </section> <section xml:id='migration4.initializers'> <title>Iniţializatorii</title> <para> Iniţializatorii variabilelor statice şi a membrilor clasei acceptă numai valori scalare, în timp ce în PHP 3 ei acceptau orice expresie validă. Aceasta se datorează, iarăşi, separării dintre analiză şi execuţie deoarece nici un cod-sursă încă nu a fost executat când analizatorul vede iniţializatorul. </para> <para> Pentru clase ar trebui să utilizaţi în loc constructori pentru a iniţializa variabilele membre. Pentru variabilele statice ceva diferit de o simplă valoare statică rareori are sens. </para> </section> <section xml:id='migration4.empty'> <title><literal>empty("0")</literal></title> <para> Posibil cea mai controversată schimbare în comportament a survenit în funcţia <function>empty</function>. Un String conţinând doar caracterul '0' (zero) este acum considerat vid, în timp ce în PHP 3 nu era considerat ca atare. </para> <para> Acest comportament nou are sens în aplicaţiile web, unde toate câmpurile de introducere întorc string-uri chiar dacă se cere introducerea unui număr, iar PHP are capacitatea de convertire automată a tipurilor. Însă pe de altă parte aceasta poate deteriora codul-sursă al dumneavoastră într-un mod oarecum subtil, ce va conduce la un comportament greşit, dificil de depistat dacă nu cunoaşteţi ce şi unde trebuie să căutaţi. </para> </section> <section xml:id='migration4.missing'> <title>Funcţii care lipsesc</title> <para> În timp ce PHP 4 vine cu o mulţime de facilităţi noi, funcţii şi extensii, puteţi încă să descoperiţi că lipsesc unele funcţii din versiunea 3. Un mic număr de funcţii de bază au dispărut deoarece ele nu funcţionau cu noua schemă de separare a analizei şi a execuţiei, introdusă în PHP 4 cu motorul Zend. Alte funcţii şi chiar extensii întregi au devenit învechite, odată ce funcţii şi extensii noi efectuează aceleaşi sarcini mai bine şi/sau într-un mod mai general. Unele funcţii pur şi simplu nu au fost încă transferate şi în sfârşit unele funcţii sau extensii pot să lipsească din cauza conflictelor de licenţiere. </para> <section xml:id='migration4.missing.concept'> <title>Funcţii care lipsesc din cauza modificărilor conceptuale</title> <para> Deoarece PHP 4 acum separă analiza de execuţie, nu mai este posibil de a modifica comportamentul analizatorului (acum încorporat în motorul Zend) în timpul rulării deoarece analiza a avut loc deja. Deci funcţia <function>short_tags</function> nu mai există. Puteţi modifica comportamentul analizatorului stabilind valorile potrivite în fişierul &php.ini;. </para> <para> O altă facilitate a PHP 3 care nu mai face parte din PHP 4 este interfaţa de debugging încorporată. Există module suplimentare (add-on) ale părţilor terţe pentru motorul Zend care oferă o funcţionalitate similară. </para> </section> <section xml:id='migration4.deprecate'> <title>Funcţii şi extensii învechite</title> <para> Extensiile pentru baze de date Adabas şi Solid nu mai sunt. Trăiască extensia unificată ODBC în loc. </para> </section> <section xml:id='migration4.unset'> <title>Schimbarea statutului <function>unset</function></title> <para> <function>unset</function>, fiind încă disponibilă, este implementată în calitate de construcţie a limbajului, dar nu ca funcţie. </para> <para> Aceasta nu are vre-o consecinţă asupra comportamentului <function>unset</function>, dar testarea "unset" utilizând <function>function_exists</function> va întoarce &false; ca şi cu orice altă construcţie a limbajului care seamănă cu o funcţie, cum ar fi <function>echo</function>. </para> <para> O altă schimbare mai practică constă în aceea că nu mai este posibil de a apela <function>unset</function> indirect, adică <literal>$func="unset"; $func($somevar)</literal> nu va mai funcţiona. </para> </section> </section> <section xml:id='migration4.extensions'> <title>Extensiile PHP 3</title> <para> Extensiile scrise pentru PHP 3 nu vor funcţiona cu PHP 4, nici ca binare, nici la nivelul codului-sursă. Nu este dificil de a transfera extensiile în PHP 4 dacă aveţi acces la sursele originale. O descriere detaliată a procesului de transfer nu este în scopul acestui text. </para> </section> <section xml:id='migration4.strings'> <title>Substituirea variabilelor în string-uri</title> <para> PHP 4 introduce un mecanism nou de substituire a variabilelor în string-uri. Acum, în sfârşit, puteţi accesa variabilele membre ale obiectelor şi elemente ale masivelor multidimensionale din string-uri. </para> <para> Pentru a realiza aceasta trebuie să cuprindeţi variabilele între acolade ondulate, cu semnul dolarului urmând imediat după deschiderea acoladei: <literal>{$...}</literal> </para> <para> Pentru a încorpora valoarea unei variabile membre a unui obiect într-un string pur şi simplu scrieţi <literal>"text {$obj-&gt;member} text"</literal>, în timp ce în PHP 3 trebuia să utilizaţi ceva de tipul <literal>"text".$obj-&gt;member." text"</literal>. </para> <para> Aceasta ar trebui să conducă la un cod-sursă mai lizibil, în timp ce poate deteriora script-urile existente scrise pentru PHP 3. Dar puteţi cu uşurinţă să verificaţi existenţa acestei probleme căutând combinaţia de caractere <literal>{$</literal> în codul-sursă şi înlocuind-o cu <literal>\{$</literal> cu ajutorul instrumentului dumneavoastră preferat de căutare şi înlocuire. </para> </section> <section xml:id='migration4.cookies'> <title>Prăjiturile (cookies)</title> <para> PHP 3 avea obiceiul prost de a stabili prăjiturile în ordine inversă a apelurilor <function>setcookie</function> din codul-sursă. PHP 4 întrerupe acest obicei şi crează liniile de antet cu prăjiturile exact în aceeaşi ordine în care stabiliţi prăjiturile în codul-sursă. </para> <para> Aceasta poate să deterioreze careva cod-sursă existent, dar comportamentul vechi era într-atât de straniu, încât a meritat să fie schimbat pentru a preveni alte probleme în viitor. </para> </section> <section xml:id='migration4.variables'> <title>Manipularea variabilelor globale</title> <para> În timp ce manipularea variabilelor globale avea ca scop simplitatea în PHP 3 şi în versiunile timpurii ale PHP 4, acum accentul a fost pus pe sporirea securităţii. În timp ce în PHP 3 următorul exemplu funcţiona perfect, în PHP 4 variabila trebuie desetată (<literal>unset($GLOBALS["id"])</literal>);. Aceasta este doar o problemă cu manipularea variabilelor globale. Întotdeauna ar fi trebuit să utilizaţi <varname>$GLOBALS</varname>, cu versiunile mai noi ale PHP 4 dumneavoastră sunteţi forţat să faceţi aşa în majoritatea cazurilor. Citiţi mai multe despre acest subiect în <link linkend="references.global"> secţiunea de referinţă <literal>global</literal></link>. </para> <example> <title>Migrarea variabilelor globale</title> <programlisting role="php"> <![CDATA[ <?php $id = 1; function test() { global $id; unset($id); } test(); echo($id); // Aceasta va afişa 1 în PHP 4 ?> ]]> </programlisting> </example> </section> </appendix> <!-- Translated by Simion Onea --> <!-- 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:"../../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 --> http://cvs.php.net/viewvc.cgi/phpdoc-ro/appendices/migration5.xml?view=markup&rev=1.1 Index: phpdoc-ro/appendices/migration5.xml +++ phpdoc-ro/appendices/migration5.xml <?xml version="1.0" encoding="utf-8"?> <!-- $Revision: 1.1 $ --> <!-- EN-Revision: 1.56 Maintainer: simionea Status: translated --> <appendix xml:id="migration5" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"> <title>Migrarea de la PHP 4 la PHP 5</title> <section xml:id='migration5.changes'> <title>Ce s-a schimbat în PHP 5</title> <para> PHP 5 şi motorul integrat Zend Engine 2 au îmbunătăţit considerabil performanţa şi capacităţile PHP, dar o mare atenţie s-a acordat faptului de a deteriora cât mai puţin posibil codul-sursă existent. Deci migrarea codului dumneavoastră de la PHP 4 la 5 ar trebui să fie foarte uşoară. O bună parte din codul-sursă existent în PHP 4 ar trebui să fie gata de a rula fără schimbări, dar totuşi ar trebui să ştiţi despre <link linkend="migration5.incompatible">puţinele diferenţe</link> şi să aveţi grijă să testaţi codul dumneavoastră sursă înainte de a schimba versiunile în mediile de producere. </para> </section> <section xml:id="migration5.incompatible"> <title>Schimbări incompatibile în sens invers</title> <para> Cu toate că majoritatea codului-sursă existent în PHP 4 ar trebui să funcţioneze fără schimbări, totuşi ar trebui să atrageţi atenţia la următoarele schimbări incompatibile în sens invers: </para> <itemizedlist> <listitem> <simpara> Sunt unele <link linkend="reserved.keywords">noi cuvinte-cheie rezervate</link>. </simpara> </listitem> <listitem> <simpara> <function>strrpos</function> şi <function>strripos</function> acum utilizează întregul string în calitate de 'ac'. </simpara> </listitem> <listitem> <simpara> Utilizarea nelegală a deplasamentelor în string-uri cauzează <constant>E_ERROR</constant> în loc de <constant>E_WARNING</constant>. Un exemplu de utilizare nelegală ar fi: <literal>$str = 'abc'; unset($str[0]);</literal>. </simpara> </listitem> <listitem> <simpara> <function>array_merge</function> a fost schimbată pentru ca să accepte numai masivuri. Dacă îi este transmisă o variabilă care nu este masiv, un <constant>E_WARNING</constant> va fi aruncat pentru fiecare astfel de parametru. Fiţi atent, deoarece codul dumneavoastră poate să înceapă să emită <constant>E_WARNING</constant> din senin. </simpara> </listitem> <listitem> <simpara> Variabila de server PATH_TRANSLATED nu mai este stabilită implicit sub Apache2 SAPI în contrast cu situaţia în PHP 4, unde ea este stabilită la aceeaşi valoare ca şi variabila de server SCRIPT_FILENAME, atunci când nu este populată de Apache. Această schimbare a fost făcută pentru a ne conforma cu <link xlink:href="&url.cgispecs;">specificaţia CGI</link>. Vă rugăm să vă referiţi la <link xlink:href="&url.php.bugs;23610">bug #23610</link> pentru informaţii suplimentare şi vedeţi de asemenea descrierea <link linkend="reserved.variables.server">$_SERVER['PATH_TRANSLATED']</link> în manual. Această problemă de asemenea afectează versiunile PHP &gt;= 4.3.2. </simpara> </listitem> <listitem> <simpara> Constanta <constant>T_ML_COMMENT</constant> nu mai este definită de către extensia <link linkend="ref.tokenizer">Tokenizer</link>. Dacă error_reporting este stabilită la <constant>E_ALL</constant>, PHP va genera o notificare. Cu toate că <constant>T_ML_COMMENT</constant> niciodată nu a fost utilizată, ea a fost definită în PHP 4. În ambele PHP 4 şi PHP 5 // şi /* */ sunt soluţionate ca constante <constant>T_COMMENT</constant>. Însă comentariile în stil PHPDoc /** */, care începând cu PHP 5 sunt înţelese de PHP, sunt recunoscute ca <constant>T_DOC_COMMENT</constant>. </simpara> </listitem> <listitem> <simpara> $_SERVER ar trebui să fie populată cu argc şi argv dacă <link linkend="ini.variables-order">variables_order</link> include "S". Dacă aţi configurat sistemul dumneavoastră în mod specific să nu creeze $_SERVER, atunci desigur ea nu va fi. Schimbarea a fost de a face argc şi argv disponibile în versiunea CLI indiferent de setarea <link linkend="ini.variables-order">variables_order</link>. Deci versiunea CLI acum întotdeauna va popula variabilele globale $argc şi $argv. </simpara> </listitem> <listitem> <simpara> Un obiect fără proprietăţi nu mai este considerat "vid". </simpara> </listitem> <listitem> <simpara> În unele cazuri clasele trebuiesc declarate înainte de a fi utilizate. Aceasta se întâmplă numai dacă unele facilităţi noi ale PHP 5 (cum ar fi <link linkend="language.oop5.interfaces">interfeţele</link>) sunt utilizate. În caz contrar, comportamentul este pe vechi. </simpara> </listitem> <listitem> <simpara> <function>get_class</function>, <function>get_parent_class</function> şi <function>get_class_methods</function> acum întorc numele claselor/metodelor aşa cum ele au fost declarate (respectându-se literele majuscule/minuscule), ceea ce poate duce la probleme cu script-urile mai vechi care se bazează pe comportamentul vechi (numele claselor/metodelor întotdeauna erau întoarse cu litere minuscule). O soluţie posibilă este de a căuta aceste funcţii în toate script-urile şi de a le aplica <function>strtolower</function>. </simpara> <simpara> Această diferenţiere a literelor majuscule/minuscule de asemenea se aplică la <link linkend="language.constants.predefined">constantele predefinite magice</link> <constant>__CLASS__</constant>, <constant>__METHOD__</constant> şi <constant>__FUNCTION__</constant>. Valorile sunt întoarse exact cum sunt declarate (respectându-se literele majuscule/minuscule). </simpara> </listitem> <listitem> <simpara> <function>ip2long</function> acum întoarce &false; când o adresă IP nevalidă îi este transmisă ca argument şi nu <literal>-1</literal> ca înainte. </simpara> </listitem> <listitem> <simpara> Dacă există funcţii definite într-un fişier inclus, ele pot fi utilizate în fişierul de bază indiferent dacă se află înainte de <function>return</function> sau după. Dacă fişierul este inclus de două ori, PHP 5 va emite o eroare fatală deoarece funcţiile au fost declarate deja, în timp ce PHP 4 nu se plânge de acest fapt. Este recomandat de a utiliza <function>include_once</function> în loc de a verifica dacă fişierul a fost inclus deja şi de a ieşi în acest caz din fişierul inclus. </simpara> </listitem> <listitem> <simpara> <function>include_once</function> şi <function>require_once</function> întâi normalizează calea fişierului inclus în Windows astfel încât includerea A.php şi a.php va include fişierul numai o singură dată. </simpara> </listitem> </itemizedlist> <para> <example> <title><function>strrpos</function> şi <function>strripos</function> acum utilizează întregul string în calitate de 'ac'</title> <programlisting role="php"> <![CDATA[ <?php var_dump(strrpos('ABCDEF','DEF')); //int(3) var_dump(strrpos('ABCDEF','DAF')); //bool(false) ?> ]]> </programlisting> </example> </para> <para> <example> <title>Un obiect fără proprietăţi nu mai este considerat "vid"</title> <programlisting role="php"> <![CDATA[ <?php class test { } $t = new test(); var_dump(empty($t)); // echo bool(false) if ($t) { // Va fi executat } ?> ]]> </programlisting> </example> </para> <para> <example> <title>În unele cazuri clasele trebuie declarate înainte de a fi utilizate</title> <programlisting role="php"> <![CDATA[ <?php // funcţionează fără erori: $a = new a(); class a { } // aruncă o eroare: $a = new b(); interface c{ } class b implements c { } ?> ]]> </programlisting> </example> </para> </section> <section xml:id="migration5.cli-cgi"> <title>CLI şi CGI</title> <para> În PHP 5 au survenit unele modificări ale denumirilor fişierelor CLI şi CGI. În PHP 5 versiunea CGI a fost redenumită în <filename>php-cgi.exe</filename> (anterior <filename>php.exe</filename>) şi versiunea CLI acum se află în directorul principal (anterior <filename>cli/php.exe</filename>). </para> <para> În PHP 5 a fost introdus un mod nou: <filename>php-win.exe</filename>. Acesta este echivalent cu versiunea CLI, cu excepţia că php-win nu afişează nimic şi astfel nu oferă o consolă (pe ecran nu apare "cutia DOS"). Acest comportament este similar cu cel al php-gtk. </para> <para> În PHP 5, versiunea CLI întotdeauna va popula variabilele globale <varname>$argv</varname> şi <varname>$argc</varname> indiferent de careva setări ale directivelor &php.ini;. Chiar având <link linkend="ini.register-argc-argv">register_argc_argv</link> stabilit <literal>off</literal> nu va avea efect în CLI. </para> <para> Accesaţi de asemenea <link linkend="features.commandline">referinţa liniei de comandă</link>. </para> </section> <section xml:id="migration5.configuration"> <title>Migrarea fişierelor de configurare</title> <para> Deoarece modulele ISAPI şi-au schimbat denumirile din php4xxx în php5xxx, trebuie să faceţi anumite schimbări şi în fişierele de configurare. Au survenit schimbări şi în denumirile fişierelor CLI şi CGI. Vă rugăm să vă referiţi la <link linkend="migration5.cli-cgi">secţiunea corespondenţelor</link> pentru informaţii suplimentare. </para> <para> Migrarea configuraţiei Apache este foarte simplă. Vedeţi în exemplul de mai jos ce schimbare trebuie să faceţi: <example> <title>Migrarea fişierelor de configurare Apache pentru PHP 5</title> <programlisting role="apache-conf"> <![CDATA[ # change this line: LoadModule php4_module /php/sapi/php4apache2.dll # with this one: LoadModule php5_module /php/php5apache2.dll ]]> </programlisting> </example> </para> <para> Dacă serverul dumneavoastră web rulează PHP în mod CGI, ar trebui să ţineţi cont de aceea că versiunea CGI şi-a schimbat denumirea din <filename>php.exe</filename> în <filename>php-cgi.exe</filename>. În Apache, ar trebui să faceţi ceva de felul următor: <example> <title>Migrarea fişierelor de configurare Apache pentru PHP 5, modul CGI</title> <programlisting role="apache-conf"> <![CDATA[ # change this line: Action application/x-httpd-php "/php/php.exe" # with this one: Action application/x-httpd-php "/php/php-cgi.exe" ]]> </programlisting> </example> </para> <para> În alte servere web trebuie să schimbaţi denumirea fişierului modulului CGI sau ISAPI. </para> </section> <section xml:id="migration5.functions"> <title>Funcţii noi</title> <para> În PHP 5 sunt unele funcţii noi. Iată lista lor: </para> <para><link linkend="ref.array">Masive</link>:</para> <itemizedlist> <listitem> <simpara> <function>array_combine</function> - Crează un masiv folosind un masiv pentru chei şi alt masiv pentru valorile lor </simpara> </listitem> <listitem> <simpara> <function>array_diff_uassoc</function> - Calculează diferenţa dintre masive cu verificarea suplimentară a indicilor, care este efectuată de o funcţie de apel invers furnizată de utilizator </simpara> </listitem> <listitem> <simpara> <function>array_udiff</function> - Calculează diferenţa dintre masive utilizând o funcţie de apel invers pentru compararea datelor </simpara> </listitem> <listitem> <simpara> <function>array_udiff_assoc</function> - Calculează diferenţa dintre masive cu verificarea suplimentară a indicilor. Datele sunt comparate utilizând o funcţie de apel invers </simpara> </listitem> <listitem> <simpara> <function>array_udiff_uassoc</function> - Calculează diferenţa dintre masive cu verificarea suplimentară a indicilor. Datele sunt comparate utilizând o funcţie de apel invers. Verificarea indicilor de asemenea este efectuată cu o funcţie de apel invers </simpara> </listitem> <listitem> <simpara> <function>array_walk_recursive</function> - Aplică recursiv o funcţie a utilizatorului fiecărui membru (element) al masivului </simpara> </listitem> <listitem> <simpara> <function>array_uintersect_assoc</function> - Calculează intersecţia masivelor cu o verificare suplimentară a indicilor. Datele sunt comparate utilizând o funcţie de apel invers </simpara> </listitem> <listitem> <simpara> <function>array_uintersect_uassoc</function> - Calculează intersecţia masivelor cu o verificare suplimentară a indicilor. Atât datele, cât şi indicii sunt comparaţi utilizând funcţii separate de apel invers </simpara> </listitem> <listitem> <simpara> <function>array_uintersect</function> - Calculează intersecţia masivelor. Datele sunt comparate utilizând o funcţie de apel invers </simpara> </listitem> </itemizedlist> <para><link linkend="ref.ibase">InterBase</link>:</para> <itemizedlist> <listitem> <simpara> <function>ibase_affected_rows</function> - Întoarce numărul rândurilor afectate de interpelarea precedentă </simpara> </listitem> <listitem> <simpara> <function>ibase_backup</function> - Iniţiază o operaţiune de copiere de rezervă în managerul serviciilor şi întoarce controlul imediat </simpara> </listitem> <listitem> <simpara> <function>ibase_commit_ret</function> - Efectuează tranzacţia fără a o închide </simpara> </listitem> <listitem> <simpara> <function>ibase_db_info</function> - Cere statistica despre o bază de date </simpara> </listitem> <listitem> <simpara> <function>ibase_drop_db</function> - Elimină o bază de date </simpara> </listitem> <listitem> <simpara> <function>ibase_errcode</function> - Întoarce codul erorii </simpara> </listitem> <listitem> <simpara> <function>ibase_free_event_handler</function> - Anulează o procedură înregistrată de prelucrare a unui eveniment </simpara> </listitem> <listitem> <simpara> <function>ibase_gen_id</function> - Creşte valoarea generatorului denumit şi întoarce noua sa valoare </simpara> </listitem> <listitem> <simpara> <function>ibase_maintain_db</function> - Execută o comandă de întreţinere pe server-ul de baze de date </simpara> </listitem> <listitem> <simpara> <function>ibase_name_result</function> - Atribuie un nume unui set de rezultate </simpara> </listitem> <listitem> <simpara> <function>ibase_num_params</function> - Întoarce numărul parametrilor într-o interpelare pregătitiă </simpara> </listitem> <listitem> <simpara> <function>ibase_param_info</function> - Întoarce informaţia despre un parametru într-o interpelare pregătitiă </simpara> </listitem> <listitem> <simpara> <function>ibase_restore</function> - Iniţiază o operaţiune de restabilire în managerul serviciilor şi întoarce execuţia imediat </simpara> </listitem> <listitem> <simpara> <function>ibase_rollback_ret</function> - Anulează tranzacţia şi reţine contextul tranzacţiei </simpara> </listitem> <listitem> <simpara> <function>ibase_server_info</function> - Cere statistica despre un server de baze de date </simpara> </listitem> <listitem> <simpara> <function>ibase_service_attach</function> - Conectarea la managerul serviciilor </simpara> </listitem> <listitem> <simpara> <function>ibase_service_detach</function> - Deconectarea de la managerul serviciilor </simpara> </listitem> <listitem> <simpara> <function>ibase_set_event_handler</function> - Înregistrează o funcţie de apel invers pentru a fi apelată atunci când evenimentele sunt afişate (declanşate) </simpara> </listitem> <listitem> <simpara> <function>ibase_wait_event</function> - Aşteaptă până când un eveniment este afişat (declanşat) de baza de date </simpara> </listitem> </itemizedlist> <para><link linkend="ref.iconv">iconv</link>:</para> <itemizedlist> <listitem> <simpara> <function>iconv_mime_decode</function> - Decodifică un câmp cu antet MIME </simpara> </listitem> <listitem> <simpara> <function>iconv_mime_decode_headers</function> - Decodifică mai multe câmpuri de antete MIME concomitent </simpara> </listitem> <listitem> <simpara> <function>iconv_mime_encode</function> - Compune un câmp de antet MIME </simpara> </listitem> <listitem> <simpara> <function>iconv_strlen</function> - Întoarce numărul de caractere din string </simpara> </listitem> <listitem> <simpara> <function>iconv_strpos</function> - Găseşte poziţia primei apariţii a acului în stogul de fân (a needle within a haystack) </simpara> </listitem> <listitem> <simpara> <function>iconv_strrpos</function> - Găseşte poziţia ultimei apariţii a acului în stogul de fân (a needle within a haystack) </simpara> </listitem> <listitem> <simpara> <function>iconv_substr</function> - Taie o parte a unui string </simpara> </listitem> </itemizedlist> <para><link linkend="ref.stream">Fluxuri</link>:</para> <itemizedlist> <listitem> <simpara> <function>stream_copy_to_stream</function> - Copie datele dintr-un flux în altul </simpara> </listitem> <listitem> <simpara> <function>stream_get_line</function> - Obţine o linie din resursa de flux până la un separator dat </simpara> </listitem> <listitem> <simpara> <function>stream_socket_accept</function> - Acceptă o conexiune printr-un socket creat cu <function>stream_socket_server</function> </simpara> </listitem> <listitem> <simpara> <function>stream_socket_client</function> - Deschide o conexiune printr-un socket Internet sau de domeniu Unix </simpara> </listitem> <listitem> <simpara> <function>stream_socket_get_name</function> - Obţine denumirea socket-urilor locale sau îndepărtate </simpara> </listitem> <listitem> <simpara> <function>stream_socket_recvfrom</function> - Primeşte date de la un socket, fie connectat, sau nu </simpara> </listitem> <listitem> <simpara> <function>stream_socket_sendto</function> - Trimite un mesaj către un socket, fie conectat, sau nu </simpara> </listitem> <listitem> <simpara> <function>stream_socket_server</function> - Crează un socket server Internet sau de domeniu Unix </simpara> </listitem> </itemizedlist> <para><link linkend="ref.datetime">Funcţii referitoare la dată şi timp</link>:</para> <itemizedlist> <listitem> <simpara> <function>idate</function> - Formatează o valoare timp/dată locală ca integer </simpara> </listitem> <listitem> <simpara> <function>date_sunset</function> - Ora apusului Soarelui pentru o zi şi o locaţie date </simpara> </listitem> <listitem> <simpara> <function>date_sunrise</function> - Ora răsăritului Soarelui pentru o zi şi o locaţie date </simpara> </listitem> <listitem> <simpara> <function>time_nanosleep</function> - Pauză pentru un număr de secunde şi nanosecunde </simpara> </listitem> </itemizedlist> <para><link linkend="ref.strings">String-uri</link>:</para> <itemizedlist> <listitem> <simpara> <function>str_split</function> - Converteşte un string într-un masiv </simpara> </listitem> <listitem> <simpara> <function>strpbrk</function> - Caută în string un caracter dintr-un set de caractere </simpara> </listitem> <listitem> <simpara> <function>substr_compare</function> - Comparaţia sigură din punct de vedere binar, opţional nesensibilă la tipul caracterelor (majuscule / minuscule) a două string-uri de la un deplasament, până la un anumit număr de caractere </simpara> </listitem> </itemizedlist> <para>Altele:</para> <itemizedlist> <listitem> <simpara> <function>convert_uudecode</function> - decodifică un string codificat cu uuencode </simpara> </listitem> <listitem> <simpara> <function>convert_uuencode</function> - codifică un string cu uuencode </simpara> </listitem> <listitem> <simpara> <function>curl_copy_handle</function> - Copie un handle cURL, împreună cu toate preferinţele sale </simpara> </listitem> <listitem> <simpara> <function>dba_key_split</function> - Desparte o cheie din reprezentare string în reprezentare pentru masive </simpara> </listitem> <listitem> <simpara> <function>dbase_get_header_info</function> - Obţine informaţia de antet a unei beze de date dBase </simpara> </listitem> <listitem> <simpara> <function>dbx_fetch_row</function> - Obţine rânduri dintr-un rezultat al interpelării, care a avut stabilit fanionul DBX_RESULT_UNBUFFERED </simpara> </listitem> <listitem> <simpara> <function>fbsql_set_password</function> - Modifică parola pentru un utilizator dat </simpara> </listitem> <listitem> <simpara> <function>file_put_contents</function> - Înscrie un string într-un fişier </simpara> </listitem> <listitem> <simpara> <function>ftp_alloc</function> - Alocă spaţiu pentru încărcarea unui fişier </simpara> </listitem> <listitem> <simpara> <function>get_declared_interfaces</function> - Întoarce un masiv al tuturor interfeţelor declarate </simpara> </listitem> <listitem> <simpara> <function>get_headers</function> - Interceptează toate antetele trimise de către server ca răspuns la o interpelare HTTP </simpara> </listitem> <listitem> <simpara> <function>headers_list</function> - Întoarce lista antetelor de răspuns trimise (sau care sunt gata de a fi trimise) </simpara> </listitem> <listitem> <simpara> <function>http_build_query</function> - Generează un string de interpelare codificat cu URL-encode </simpara> </listitem> <listitem> <simpara> <function>image_type_to_extension</function> - Obţine extensia fişierului pentru tipul imaginii întoarse de <function>getimagesize</function>, <function>exif_read_data</function>, <function>exif_thumbnail</function>, <function>exif_imagetype</function> </simpara> </listitem> <listitem> <simpara> <function>imagefilter</function> - Aplică un filtru asupra unei imagini utilizând argumentele indicate </simpara> </listitem> <listitem> <simpara> <function>imap_getacl</function> - Obţine ACL-ul pentru o cutie poştală dată </simpara> </listitem> <listitem> <simpara> <function>ldap_sasl_bind</function> - Legătura cu un director LDAP utilizând SASL </simpara> </listitem> <listitem> <simpara> <function>mb_list_encodings</function> - Întoarce un masiv al tuturor codificărilor susţinute </simpara> </listitem> <listitem> <simpara> <function>pcntl_getpriority</function> - Obţine prioritatea oricărui proces </simpara> </listitem> <listitem> <simpara> <function>pcntl_wait</function> - Aşteaptă sau întoarce starea unui proces-fiu bifurcat, după cum e definit de către apelul de sistem waitpid() </simpara> </listitem> <listitem> <simpara> <function>pg_version</function> - Întoarce un masiv cu informaţia despre client, protocol şi versiunea server-ului (dacă este disponibilă) </simpara> </listitem> <listitem> <simpara> <function>php_check_syntax</function> - Verifică sintaxa fişierului specificat </simpara> </listitem> <listitem> <simpara> <function>php_strip_whitespace</function> - Întoarce sursa cu comentariile şi spaţiile suprimate </simpara> </listitem> <listitem> <simpara> <function>proc_nice</function> - Modifică prioritatea procesului curent </simpara> </listitem> <listitem> <simpara> <function>pspell_config_data_dir</function> - Modifică localizarea fişierelor cu date ale limbii </simpara> </listitem> <listitem> <simpara> <function>pspell_config_dict_dir</function> - Modifică localizarea listei de bază a cuvintelor </simpara> </listitem> <listitem> <simpara> <function>setrawcookie</function> - Trimite o prăjitură fără a codifica valoarea cu URL-encode </simpara> </listitem> <listitem> <simpara> <function>scandir</function> - Listează fişierele şi directoarele din calea specificată </simpara> </listitem> <listitem> <simpara> <function>snmp_read_mib</function> - Citeşte şi încarcă un fişier MIB în arborele MIB activ </simpara> </listitem> <listitem> <simpara> <function>sqlite_fetch_column_types</function> - Întoarce un masiv cu tipurile coloanelor dintr-un careva tabel </simpara> </listitem> </itemizedlist> <note> <para> Extensia <link linkend="ref.tidy">Tidy</link> de asemenea şi-a schimbat complet API-ul. </para> </note> </section> <section xml:id="migration5.newconf"> <title>Directive noi</title> <para> În PHP 5 au fost introduse unele directive noi &php.ini;. Iată lista lor: </para> <itemizedlist> <listitem> <simpara> mail.force_extra_parameters - Forţează trimiterea parametrilor specificaţi în calitate de parametri suplimentari pentru binarul sendmail. Aceşti parametri întotdeauna vor înlocui valoarea parametrului al 5-lea cu <function>mail</function>, chiar şi în modul sigur </simpara> </listitem> <listitem> <simpara> <link linkend="ini.register-long-arrays">register_long_arrays</link> - permite/interzice PHP să înregistreze variabilele lungi dezaprobate $HTTP_*_VARS </simpara> </listitem> <listitem> <simpara> <link linkend="ini.session.hash-function">session.hash_function</link> - selectează o funcţie hash (MD5 sau SHA-1) </simpara> </listitem> <listitem> <simpara> <link linkend="ini.session.hash-bits-per-character">session.hash_bits_per_character</link> - defineşte câţi biţi sunt stocaţi în fiecare caracter la convertirea datelor binare hash în ceva lizibil (de la 4 până la 6) </simpara> </listitem> <listitem> <simpara> <link linkend="ini.zend.ze1-compatibility-mode">zend.ze1_compatibility_mode</link> - Activează modul de compatibilitate cu Zend Engine 1 (PHP 4) </simpara> </listitem> </itemizedlist> </section> <section xml:id="migration5.databases"> <title>Bazele de date</title> <para> În PHP 5 au survenit unele schimbări în privinţa bazelor de date (MySQL şi SQLite). </para> <para> În PHP 5 bibliotecile clientului MySQL nu sunt încorporate din cauza problemelor de licenţiere şi a altor probleme. Pentru mai multe informaţii citiţi <link linkend="faq.databases.mysql.php5">înregistrarea FAQ</link>. </para> <para> De asemenea este o nouă extensie, <link linkend="ref.mysqli">MySQLi (MySQL îmbunătăţit)</link>, care este proiectat să lucreze cu MySQL 4.1 şi ulterior. </para> <para> Începând cu PHP 5, extensia <link linkend="ref.sqlite">SQLite</link> este încorporată în PHP. SQLite este un motor de baze de date SQL uşor încorporabil şi nu este o bibliotecă-client utilizată pentru conectarea la un server mare de baze de date (ca MySQL sau PostgreSQL). Biblioteca SQLite citeşte şi înscrie direct în fişierele cu baza de date de pe disc. </para> </section> <section xml:id='migration5.oop'> <title>Noul Model de Obiecte</title> <para> În PHP 5 este un nou Model de Obiecte. Manipularea obiectelor în PHP a fost complet rescrisă, îmbunătăţind performanţa şi introducând mai multe facilităţi. În versiunile precedente ale PHP obiectele erau manipulate ca tipuri primitive (ca de exemplu întregi sau string-uri). Neajunsul acestei metode era că din punct de vedere semantic întregul obiect era copiat atunci când era atribuit unei variabile, sau când era transmis ca parametru unei metode. În noua abordare, obiectele sunt accesate prin handle, şi nu prin valoare (puteţi să consideraţi handle ca un identificator al obiectului). </para> <para> Mulţi programatori PHP nici nu-şi dau seama despre trucurile cu copierea în modelul de obiecte vechi, de aceea majoritatea aplicaţiilor PHP vor lucra fără modificări, sau cu foarte puţine modificări. </para> <para> Noul Model de Obiecte este documentat în <link linkend="language.oop5">Prezentarea Limbajului</link>. </para> <para> În PHP 5, funcţia cu denumirea clasei este numită constructor, dar numai dacă este definită în această clasă. În PHP 4, ea este apelată de asemenea dacă este definită în clasa-părinte. </para> <para> Vedeţi de asemenea directiva <link linkend="ini.zend.ze1-compatibility-mode"> zend.ze1_compatibility_mode</link> pentru informaţii despre compatibilitatea cu PHP 4. </para> </section> <section xml:id='migrating5.errorrep'> <title>Raportarea erorilor</title> <para> Începând cu PHP 5 a fost introdusă o nouă constantă de raportare a erorilor E_STRICT cu valoarea 2048. Ea permite afişarea sugestiilor PHP la etapa rulării referitor la interoperabilitatea şi compatibilitatea codului dumneavoastră sursă, ceea ce vă va permite să păstraţi ultimele şi cele mai bune metode de codificare. De ex. un mesaj STRICT vă va preîntâmpina despre utilizarea unor funcţii dezaprobate. </para> <note> <simpara> E_ALL nu include E_STRICT, de aceea ea nu e activată implicit. </simpara> </note> </section> </appendix> <!-- Translated by Simion Onea --> <!-- 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:"../../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 --> http://cvs.php.net/viewvc.cgi/phpdoc-ro/appendices/migration51.xml?view=markup&rev=1.1 Index: phpdoc-ro/appendices/migration51.xml +++ phpdoc-ro/appendices/migration51.xml <?xml version="1.0" encoding="utf-8"?> <!-- $Revision: 1.1 $ --> <!-- EN-Revision: 1.5 Maintainer: simionea Status: translated --> <appendix xml:id="migration51" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"> <title>Migrarea de la PHP 5.0.x la PHP 5.1.x</title> <section xml:id="migration51.changes"> <title>Principalele facilităţi ale PHP 5.1.x</title> <para> Unele din principalele facilităţi ale PHP 5.1.x includ: </para> <itemizedlist> <listitem> <para> O rescriere completă a codului de prelucrare a datelor, cu o susţinere îmbunătăţită a zonelor orare. </para> </listitem> <listitem> <para> Îmbunătăţiri semnificative ale performanţei în comparaţie cu PHP 5.0.X. </para> </listitem> <listitem> <para> Extensia PDO acum este activată implicit. </para> </listitem> <listitem> <para> Peste 30 funcţii noi în diferite extensii şi funcţionalităţi încorporate. </para> </listitem> <listitem> <para> Peste 400 diverse erori corectate. </para> </listitem> </itemizedlist> </section> <section xml:id="migration51.references"> <title>Modificări în manipularea referinţelor</title> <itemizedlist> <listitem> <para> <link linkend="migration51.references-overview">Aspecte generale</link> </para> </listitem> <listitem> <para> <link linkend="migration51.references-fails">Codul-sursă care lucra în PHP 4.3.x, dar acum eşuează</link> </para> </listitem> <listitem> <para> <link linkend="migration51.references-error">Codul-sursă care lucra în PHP 4.3.x, dar acum aruncă o eroare</link> </para> </listitem> <listitem> <para> <link linkend="migration51.references-works">Codul-sursă care eşua în PHP 4.3.x, dar acum lucrează</link> </para> </listitem> <listitem> <para> <link linkend="migration51.references-didnotwork">Codul-sursă care <literal>ar fi trebuit să lucreze</literal> în PHP 5.0.x</link> </para> </listitem> <listitem> <para> <link linkend="migration51.references-warnings">Preîntâmpinări care au apărut şi au dispărut</link> </para> </listitem> </itemizedlist> <section xml:id="migration51.references-overview"> <title>Aspecte generale</title> <para> Din punctul de vedere al programatorului script-urilor PHP, schimbarea care cel mai probabil va afecta codul-sursă vechi este modul în care sunt manipulate referinţele în toate versiunile PHP ce au urmat după PHP 4.4.0. </para> <para> Până la, şi inclusiv în PHP 4.3 era posibil de a transmite, atribui sau întoarce variabile prin referinţă, care ar fi trebuit în mod real să fie întoarse prin valoare, cum ar fi o constantă, o valoare temporară (de ex. rezultatul unei expresii) sau rezultatul unei funcţii care însăşi a fost întoarsă prin valoare, ca în acest exemplu: </para> <informalexample> <programlisting role="php"> <![CDATA[ <?php $foo = "123"; function return_value() { global $foo; return $foo; } $bar = &return_value(); ?> ]]> </programlisting> </informalexample> <para> Cu toate că acest cod-sursă de obicei lucrează conform aşteptărilor în PHP 4.3, în caz general rezultatul este nedefinit. Motorul Zend nu poate funcţiona corect cu aceste valori în calitate de referinţe. Această eroare putea, şi într-adevăr a dus la diverse probleme de alterare a conţinutului memoriei dificile de reprodus, în special acolo unde baza de cod-sursă era foarte mare. </para> <para> În PHP 4.4.0, PHP 5.0.4 şi toate versiunile ulterioare ale PHP Motorul a fost corectat pentru a 'şti' când operaţia de referinţă este utilizată asupra unei valori care nu ar trebui să fie referită. Acum în aceste cazuri este utilizată valoarea propriu-zisă şi este emisă o preîntâmpinare. Preîntâmpinarea ia forma unui <constant>E_NOTICE</constant> în PHP 4.4.0 şi ulterior, şi <constant>E_STRICT</constant> în PHP 5.0.4 şi ulterior. </para> <para> Codul-sursă care poteţial putea să producă alterarea memoriei acum nu mai poate face aceasta. Însă unele coduri-sursă vechi pot ca rezultat să funcţioneze în mod diferit. </para> </section> <section xml:id="migration51.references-fails"> <title>Codul-sursă care lucra în PHP 4.3, dar acum eşuează</title> <informalexample> <programlisting role="php"> <![CDATA[ <?php function func(&$arraykey) { return $arraykey; // funcţia întoarce rezultatul prin valoare! } $array = array('a', 'b', 'c'); foreach (array_keys($array) as $key) { $y = &func($array[$key]); $z[] =& $y; } var_dump($z); ?> <]]> </programlisting> <para> Lansând în execuţie script-ul de mai sus în orice versiune a PHP mai înainte de corectarea referinţelor va produce următoarea ieşire: </para> <screen> <![CDATA[ array(3) { [0]=> &string(1) "a" [1]=> &string(1) "b" [2]=> &string(1) "c" } ]]> </screen> <para> După corectarea referinţelor acelaşi cod-sursă va produce următoarele: </para> <screen> <![CDATA[ array(3) { [0]=> &string(1) "c" [1]=> &string(1) "c" [2]=> &string(1) "c" } ]]> </screen> </informalexample> <para> Aceasta se întâmplă din cauza că, după corectare, <literal>func()</literal> atribuie prin valoare. Valoarea variabilei <varname>$y</varname> este re-atribuită şi legătura prin referinţă este păstrată prin <varname>$z</varname>. Înainte de corectare valoarea era atribuită prin referinţă, ce ducea la faptul că <varname>$y</varname> era realipit la fiecare atribuire. Încercarea de a alipi ceva prin referinţă la o valoare temporară cauza alterarea memoriei. </para> <para> Un astfel de cod-sursă poate fi făcut să funcţioneze identic în ambele versiuni PHP: înainte de corectare şi după. Semnătura <literal>func()</literal> poate fi alterată ca să întoarcă valoarea prin referinţă, sau atribuirea prin referinţă poate fi eliminată din rezultatul <literal>func()</literal>. </para> <informalexample> <programlisting role="php"> <![CDATA[ <?php function func() { return 'function return'; } $x = 'original value'; $y =& $x; $y = &func(); echo $x; ?> ]]> </programlisting> </informalexample> <para> În PHP 4.3 <varname>$x</varname> ar fi fost 'valoarea originară', în timp ce după corectări aceasta va fi 'ceea ce întoarce funcţia' - amintiţi-vă că atunci când funcţia nu întoarce valoarea prin referinţă, atribuirea prin referinţă este convertită într-o atribuire obişnuită. Iarăşi, aceasta poate fi adus la un numitor comun prin forţarea <literal>func()</literal> să întoarcă valoarea prin referinţă, sau prin eliminarea atribuirii prin referinţă. </para> </section> <section xml:id="migration51.references-error"> <title>Codul-sursă care lucra în PHP 4.3.x, dar acum aruncă o eroare</title> <informalexample> <programlisting role="php"> <![CDATA[ <?php class Foo { function getThis() { return $this; } function destroyThis() { $baz =& $this->getThis(); } } $bar = new Foo(); $bar->destroyThis(); var_dump($bar); ?> ]]> </programlisting> </informalexample> <para> În PHP 5.0.3, <varname>$bar</varname> evalua în <constant>NULL</constant> în loc să întoarcă un obiect. Aceasta s-a întâmplat din cauza că <literal>getThis()</literal> întoarce prin valoare, dar aici valoarea e atribuită prin referinţă. Cu toate că acum script-ul funcţionează conform aşteptărilor, acesta este de fapt un cod invalid, care va arunca un <constant>E_NOTICE</constant> sub PHP 4.4, sau un <constant>E_STRICT</constant> sub PHP 5.0.4 şi ulterior. </para> </section> <section xml:id="migration51.references-works"> <title>Codul-sursă care eşua în PHP 4.3.x, dar acum lucrează</title> <informalexample> <programlisting role="php"> <![CDATA[ <?php function &f() { $x = "foo"; var_dump($x); print "$x\n"; return($a); } for ($i = 0; $i < 3; $i++) { $h = &f(); } ?> ]]> </programlisting> <para> În PHP 4.3 al treilea apel la <function>var_dump</function> produce <constant>NULL</constant>, din cauza alterării memoriei cauzate de întoarcerea unei valori neiniţializate prin referinţă. Acest cod-sursă este valid în PHP 5.0.4 şi ulterior, dar aruncă erori în versiunile anterioare ale PHP. </para> </informalexample> <informalexample> <programlisting role="php"> <![CDATA[ <?php $arr = array('a1' => array('alfa' => 'ok')); $arr =& $arr['a1']; echo '-'.$arr['alfa']."-\n"; ?> ]]> </programlisting> <para> Până la PHP 5.0.5, nu era posibil de a atribui valoarea unui element al masivului prin referinţă, în acest mod. Acum este posibil. </para> </informalexample> </section> <section xml:id="migration51.references-didnotwork"> <title>Codul-sursă care <literal>ar fi trebuit să lucreze</literal> în PHP 5.0.x</title> <para> Există vre-o două erori raportate în PHP 5.0 înainte de corectarea referinţelor, care acum 'lucrează'. Însă în ambele cazuri erorile sunt aruncate de PHP 5.1.x, deoarece în primul rând codul-sursă era invalid. Întoarcerea valorilor prin referinţă utilizând <literal>self::</literal> acum lucrează la general, dar aruncă o preîntâmpinare <constant>E_STRICT</constant>, şi cu toate că rezultatele variază de la caz la caz la atribuirea prin referinţă la un obiect supraîncărcat, oricum veţi vedea un <constant>E_ERROR</constant> atunci când încercaţi aceasta, chiar şi acolo unde însăşi atribuirea pare să funcţioneze. </para> </section> <section xml:id="migration51.references-warnings"> <title>Preîntâmpinări care au apărut şi au dispărut</title> <para> Apeluri incluse unul în altul către funcţii care întorc valoarea prin referinţă sunt exemple de cod-sursă valid în ambele PHP 4.3.x şi PHP 5.1.x, dar aruncau erori nejustificate <constant>E_NOTICE</constant> sau <constant>E_STRICT</constant> în versiunile intermediare ale PHP. </para> <informalexample> <programlisting role="php"> <![CDATA[ <?php function & foo() { $var = 'ok'; return $var; } function & bar() { return foo(); } $a =& bar(); echo "$a\n"; ?> ]]> </programlisting> </informalexample> </section> </section> <section xml:id="migration51.reading"> <title>Citirea []</title> <informalexample> <programlisting role="php"> <![CDATA[ <?php class XmlTest { function test_ref(&$test) { $test = "ok"; } function test($test) { } function run() { $ar = array(); $this->test_ref($ar[]); var_dump($ar); $this->test($ar[]); } } $o = new XmlTest(); $o->run(); ?> ]]> </programlisting> </informalexample> <para> Aceasta întotdeauna ar fi trebuit să arunce o eroare fatală <constant>E_ERROR</constant>, din cauza că [] nu pot fi utilizate pentru citire în PHP. Acesta este cod-sursă invalid în PHP 4.4.2 şi PHP 5.0.5 şi ulterior. </para> </section> <section xml:id="migration51.integer-parameters"> <title>Valorile întregi în parametrii funcţiilor</title> <para> Odată cu apariţia PHP 5.0.x a fost introdus un nou API de prelucrare a parametrilor, care este utilizat de un mare număr de funcţii PHP. În toate versiunile PHP între 5.0.x şi 5.1.x, manipularea valorilor întregi era foarte strictă şi erau respinse toate valorile numerice formate incorect atunci când o funcţie PHP eştepta un întreg. Aceste verificări acum sunt mai legere pentru a susţine string-uri numerice formate nu chiar bine, cum ar fi " 123" şi "123 " şi acestea nu vor mai eşua, cum era cazul în PHP 5.0.x. Însă pentru a promova siguranţa în cod şi validarea intrărilor, funcţiile PHP acum emit un <constant>E_NOTICE</constant> atunci când astfel de string-uri sunt transmise în calitate de întregi. </para> </section> <section xml:id="migration51.oop"> <title>Schimbări în clase şi obiecte</title> <itemizedlist> <listitem> <para> <link linkend="migration51.oop-functions"><literal>instanceof</literal>, <literal>is_a()</literal>, <literal>is_subclass_of()</literal> şi <literal>catch</literal></link> </para> </listitem> <listitem> <para> <link linkend="migration51.oop-methods">Metodele private abstracte</link> </para> </listitem> <listitem> <para> <link linkend="migration51.oop-modifiers">Modificatorii de acces în interfeţe</link> </para> </listitem> <listitem> <para> <link linkend="migration51.oop-inheritance">Schimbări în regulile de moştenire</link> </para> </listitem> <listitem> <para> <link linkend="migration51.oop-constants">Constantele de clasă</link> </para> </listitem> </itemizedlist> <section xml:id="migration51.oop-functions"> <title><literal>instanceof</literal>, <literal>is_a()</literal>, <literal> is_subclass_of()</literal> şi <literal>catch</literal></title> <para> În PHP 5.0, <literal>is_a()</literal> a devenit învechit şi a fost înlocuit cu operatorul <literal>instanceof</literal>. Au existat unele probleme cu implementarea iniţială a <literal>instanceof</literal>, care se baza pe <literal>__autoload()</literal> pentru a căuta clasele ce lipsesc. Dacă clasa nu era prezentă, <literal>instanceof</literal> arunca un <constant>E_ERROR</constant> fatal din cauza eşecului <literal>__autoload()</literal> de a descoperi acea clasă. Acelaşi comportament îl avea şi operatorul <literal>catch</literal> şi funcţia <literal>is_subclass_of()</literal>, ambele din acelaşi motiv. </para> <para> Nici una din aceste funcţii sau operatori nu apelează <literal>__autoload()</literal> în PHP 5.1.x, iar utilizarea <literal>class_exists()</literal> în codul-sursă scris pentru PHP 5.0.x, cu toate că nu este problematică în nici un fel, nu mai este necesară. </para> </section> <section xml:id="migration51.oop-methods"> <title>Metodele private abstracte</title> <para> Metodele private abstracte au fost susţinute între PHP 5.0.0 şi PHP 5.0.4, însă apoi au fost interzise în baza faptului că comportamentele <literal>private</literal> şi <literal>abstract</literal> se excludeau reciproc. </para> </section> <section xml:id="migration51.oop-modifiers"> <title>Modificatorii de acces în interfeţe</title> <para> În PHP 5.0, declaraţiile funcţiilor în interfeţe erau tratate exact la fel ca şi declaraţiile funcţiilor în clase. Aceasta nu mai era adevărat începând cu octombrie 2004, când numai modificatorul de acces <literal>public</literal> a fost permis în declaraţiile funcţiilor din interfeţe. Începând cu aprilie 2005 - înainte de apariţia lansării PHP 5.0b1 - modificatorul <literal>static</literal> de asemenea a fost permis. Oricum, modificatorii <literal>protected</literal> şi <literal>private</literal> acum vor arunca un <constant>E_ERROR</constant>, la fel ca şi <literal>abstract</literal>. Observaţi însă că această schimbare nu ar trebui să afecteze codul dumneavoastră sursă existent, deoarece nici unul din aceşti modificatori nu are sens în contextul interfeţelor. </para> </section> <section xml:id="migration51.oop-inheritance"> <title>Schimbări în regulile de moştenire</title> <para> În PHP 5.0 era posibil de a avea o declaraţie a funcţiei într-o clasă derivată, care nu era corespunzătoare cu declaraţia aceleiaşi funcţii în clasa de bază, de ex. </para> <informalexample> <para> Acest cod-sursă va cauza o eroare <constant>E_STRICT</constant> emisă în PHP 5.1.x. </para> <programlisting role="php"> <![CDATA[ <?php class Base { function &return_by_ref() { $r = 1; return $r; } } class Derived extends Base { function return_by_ref() { return 1; } } ?> ]]> </programlisting> </informalexample> </section> <section xml:id="migration51.oop-constants"> <title>Constantele de clasă</title> <para> În PHP 5.0.x următorul cod-sursă era valid: </para> <informalexample> <para> În PHP 5.1.x redefinirea unei constante de clasă va arunca o eroare fatală <constant>E_ERROR</constant>. </para> <programlisting role="php"> <![CDATA[ <?php class test { const foobar = 'foo'; const foobar = 'bar'; } ?> ]]> </programlisting> </informalexample> </section> </section> <section xml:id="migration51.extensions"> <title>Extensiile</title> <itemizedlist> <listitem> <para> <link linkend="migration51.extensions-gone">Extensiile care au dispărut din nucleul PHP</link> </para> </listitem> <listitem> <para> <link linkend="migration51.extensions-constants">Constantele de clasă în extensiile noi din PHP 5.1.x</link> </para> </listitem> </itemizedlist> <section xml:id="migration51.extensions-gone"> <title>Extensiile care au dispărut din nucleul PHP</title> <para> Probabil primul lucru pe care îl veţi observa când veţi descărca PHP 5.1.x este că câteva extensii mai vechi au dispărut. Acele extensii care deocamdată sunt menţinute activ sunt disponibile în PHP Extension Community Library (PECL) &mdash; Biblioteca Comunităţii de Extensii PHP, la adresa <link xlink:href="&url.pecl;">&url.pecl;</link>. Binarele Windows sunt asamblate în mod regulat, şi puteţi obţine binarele pentru extensiile PECL asamblate pentru PHP 5.1.x la adresa <link xlink:href="&url.pecl.win;">&url.pecl.win;</link>. </para> <table> <title>Extensiile eliminate</title> <tgroup cols="2"> <thead> <row> <entry>Extensia</entry> <entry>Alternativa/Starea</entry> </row> </thead> <tbody> <row> <entry><link linkend="ref.cpdf">ext/cpdf</link></entry> <entry><link linkend="ref.pdf">pecl/pdflib</link></entry> </row> <row> <entry><link linkend="ref.dbx">ext/dbx</link></entry> <entry>pecl/dbx</entry> </row> <row> <entry><link linkend="ref.dio">ext/dio</link></entry> <entry>pecl/dio</entry> </row> <row> <entry><link linkend="ref.fam">ext/fam</link></entry> <entry>Nu este menţinută activ</entry> </row> <row> <entry><link linkend="ref.ingres">ext/ingres_ii</link></entry> <entry>pecl/ingres</entry> </row> <row> <entry><link linkend="ref.ircg">ext/ircg</link></entry> <entry>Nu este menţinută activ</entry> </row> <row> <entry><link linkend="ref.mcve">ext/mcve</link></entry> <entry>pecl/mcve</entry> </row> <row> <entry><link linkend="ref.mnogosearch">ext/mnogosearch</link></entry> <entry>Nu este menţinută activ</entry> </row> <row> <entry><link linkend="ref.oracle">ext/oracle</link></entry> <entry> <link linkend="ref.oci8">ext/oci8</link> or <link linkend="ref.pdo-oci">ext/pdo_oci</link> </entry> </row> <row> <entry><link linkend="ref.ovrimos">ext/ovrimos</link></entry> <entry>Nu este menţinută activ</entry> </row> <row> <entry><link linkend="ref.pfpro">ext/pfpro</link></entry> <entry>Nu este menţinută activ</entry> </row> <row> <entry><link linkend="ref.w32api">ext/w32api</link></entry> <entry><link xlink:href="&url.pecl.package;ffi">pecl/ffi</link></entry> </row> <row> <entry><link linkend="ref.nis">ext/yp</link></entry> <entry>Nu este menţinută activ</entry> </row> <row> <entry>ext/activescript</entry> <entry> <link xlink:href="url.pecl.win.ext;php5activescript.dll">pecl/activescript</link> </entry> </row> </tbody> </tgroup> </table> <para> Modulele din PECL care nu sunt menţinute activ (de ex. nu au fost susţinute de un timp, nu au un menţinător activ ce lucrează în prezent asupra lor şi nu au careva lansări de pachete PECL) sunt încă disponibile în CVS la <link xlink:href="&url.php.cvs;pecl">&url.php.cvs;pecl</link>. Însă modulele PHP nelansate sunt după natura lor nesusţinute şi puteţi eşua la încercarea de a le instala sau utiliza. </para> </section> <section xml:id="migration51.extensions-constants"> <title>Constantele de clasă în extensiile noi ale PHP 5.1.x</title> <para> Zend Engine 2.1 API le permite programatorilor de extensii să declare constante de clasă în extensii obiect-orientate. Extensiile noi scrise pentru PHP 5.1.x, inclusiv <link linkend="ref.spl">SPL</link>, <link linkend="ref.pdo">PDO</link>, <link linkend="ref.xmlreader">XMLReader</link> şi <link linkend="ref.datetime">date</link>, îşi au constantele în formatul <constant>PDO::CLASS_CONSTANT</constant> şi nu în formatul C <constant>PDO_CLASS_CONSTANT</constant> pentru a minimiza poluarea spaţiului global de nume în PHP. </para> </section> </section> <section xml:id="migration51.datetime"> <title>Susţinerea Datei/orei</title> <para> Susţinerea Datei/orei a fost rescrisă complet în PHP 5.1.x, şi mai mult nu utilizează setările sistemului pentru a 'şti' zona orară în care se operează. Aceasta va fi aflată după următoarele regunli, în următoarea ordine: </para> <itemizedlist> <listitem> <para> Zona orară stabilită cu funcţia <function>date_default_timezone_set</function> (dacă a fost stabilită) </para> </listitem> <listitem> <para> Variabila de mediu TZ (dacă nu este vidă) </para> </listitem> <listitem> <para> Ghicirea "magică" (dacă sistemul de operare o susţine) </para> </listitem> <listitem> <para> Dacă toate opţiunile precedente eşuează, se stabileşte UTC </para> </listitem> </itemizedlist> <informalexample> <para> Pentru a asigura acurateţea (şi a evita o avertizare <constant>E_STRICT</constant>), va trebui să definiţi zona dumneavoastră orară în <filename>php.ini</filename> utilizând următorul format: </para> <para> date.timezone = Europe/London </para> </informalexample> <para> Zonele orare susţinute sunt enumerate, în acest format, în <link linkend="timezones">anexa cu zonele orare</link>. </para> <para> De asemenea observaţi că <function>strtotime</function> acum întoarce &false; la eşec, în loc de -1. </para> </section> <section xml:id="migration51.databases"> <title>Modificări în susţinerea bazelor de date</title> <itemizedlist> <listitem> <para> <link linkend="migration51.databases-pdo">Prezentarea generală a PDO</link> </para> </listitem> <listitem> <para> <link linkend="migration51.databases-mysql">Modificări în susţinerea MySQL</link> </para> </listitem> <listitem> <para> <link linkend="migration51.databases-sqlite">Modificări în susţinerea SQLite</link> </para> </listitem> </itemizedlist> <section xml:id="migration51.databases-pdo"> <title>Prezentarea generală a PDO</title> <para> <link linkend="ref.pdo">PHP Data Objects (PDO) &mdash; Obiectele de Date PHP</link> au fost introduse ca extensii PECL în PHP 5.0 şi au devenit parte componentă a distributivului PHP în versiunea PHP 5.1.x. Extensia PDO furnizează o interfaţă consistentă pentru acces la baze de date şi este utilizată împreună cu driver-e specifice PDO pentru fiecare bază de date. Fiecare driver de asemenea poate avea funcţiile sale specifice pentru baza de date, dar funcţionalitatea de bază de acces la date, cum ar fi efectuarea interpelărilor şi primirea datelor, este asigurată de funcţiile PDO utilizând driver-ul indicat în <link linkend="function.PDO-construct">PDO::__construct()</link>. </para> <para> Observaţi că extensia PDO şi driver-ele sale se intenţionează a fi asamblate ca extensii partajate. Aceasta vă va permite să reînnoiţi în mod clar şi simplu driver-ele din PECL, fără a vă forţa să reasamblaţi întregul PHP. </para> <para> La momentul lansării PHP 5.1.x, PDO este mai mult decât gata pentru testări extensive şi poate fi adoptat în majoritatea situaţiilor. Oricum însă este important de a înţelege că PDO şi driver-ele sale sunt relativ tinere şi în ele pot să lipsească anumite facilităţi specifice anumitor baze de date; evaluaţi atent PDO înainte de a-l utiliza în proiecte noi. </para> <para> Codul-sursă vechi la general se va baza pe extensiile de baze de date existente, care deocamdată sunt încă menţinute. </para> </section> <section xml:id="migration51.databases-mysql"> <title>Modificări în susţinerea MySQL</title> <para> În PHP 4, susţinerea MySQL 3 era încorporată. Odată cu lansarea PHP 5.0 au apărut două extensii MySQL numite 'mysql' şi 'mysqli', care au fost proiectate să susţină MySQL &lt; 4.1 şi MySQL 4.1 şi ulterior respectiv. Odată cu introducerea PDO, care oferă o interfaţă foarte rapidă către toate API-urile de baze de date susţinute de PHP, driver-ul PDO_MYSQL poate susţine orice versiune curentă (MySQL 3, 4 or 5) în codul-sursă PHP scris pentru PDO, în dependenţă de versiunea bibliotecii MySQL utilizată în timpul compilării. Extensiile vechi MySQL rămân prezente din motivul compatibilităţii inverse, dar nu sunt activate implicit. </para> </section> <section xml:id="migration51.databases-sqlite"> <title>Modificări în susţinerea SQLite</title> <para> În PHP 5.0.x susţinerea SQLite 2 era asigurată de extensia sqlite incorporată, care de asemenea era disponibilă ca extensie PECL în PHP 4.3 şi PHP 4.4. Odată cu introducerea PDO, extensia sqlite acţionează şi ca driver 'sqlite2' pentru PDO; datorită acestui fapt extensia sqlite în PHP 5.1.x are o dependenţă faţă de extensia PDO. </para> <para> PHP 5.1.x este furnizat cu câteva interfeţe alternative pentru sqlite: </para> <para> Extensia sqlite oferă un API procedural/obiect-orientat "clasic", pe care posibil l-aţi utilizat în versiunile anterioare ale PHP. Ea de asemenea oferă driver-ul PDO 'sqlite2', care vă permite să accesaţi baze de date vechi SQLite 2 utilizând API al PDO. </para> <para> PDO_SQLITE oferă driver-ul 'sqlite' de versiunea 3. SQLite de versiunea 3 este net superior SQLite de versiunea 2, însă formatele fişierelor acestor două versiuni nu sunt compatibile. </para> <para> Dacă proiectul dumneavoastră bazat pe PHP este de acum scris şi funcţionează cu versiunile anterioare ale PHP atunci puteţi să utilizaţi mai departe ext/sqlite fără probleme, dar va trebui să activaţi în mod explicit ambele extensii PDO şi sqlite. Noile proiecte ar trebui să utilizeze drive-ele PDO şi 'sqlite' (versiunea 3), deoarece acesta e mai rapid decât SQLite 2, posedă o concurenţă de blocare îmbunătăţită şi susţine nativ atât declaraţii pregătite anterior cât şi coloane binare. </para> <para> Trebuie să activaţi PDO pentru a utiliza extensia SQLite. Dacă doriţi să asamblaţi extensia PDO în calitate de extensie partajată, atunci şi extensia SQLite trebuie asamblată ca extensie partajată. Aceasta rămâne în vigoare şi pentru orice altă extensie care oferă un driver PDO. </para> </section> </section> <!-- end of migration51.databases --> <section xml:id="migration51.errorcheck"> <title>Verificarea <literal>E_STRICT</literal></title> <informalexample> <para> Dacă aveţi de verificat un singur script, puteţi intercepta erorile <constant>E_STRICT</constant> utilizând facilitatea <literal>lint</literal> din linia de comandă a PHP: </para> <programlisting role="shell"> php -d error_reporting=4095 -l script_to_check.php </programlisting> <para> Pentru proiecte mai mari, script-ul shell ce urmează va executa aceeaşi sarcină: </para> <programlisting role="shell"> <![CDATA[ #!/bin/sh directory=$1 shift # These extensions are checked extensions="php inc" check_file () { echo -ne "Doing PHP syntax check on $1 ..." # Options: ERRORS=`/www/php/bin/php -d display_errors=1 -d html_errors=0 -d error_prepend_string=" " -d error_append_string=" " -d error_reporting=4095 -l $1 | grep -v "No syntax errors detected"` if test -z "$ERRORS"; then echo -ne "OK." else echo -e "Errors found!\n$ERRORS" fi echo } # loop over remaining file args for FILE in "$@" ; do for ext in $extensions; do if echo $FILE | grep "\.$ext$" > /dev/null; then if test -f $FILE; then check_file "$FILE" fi fi done done ]]> </programlisting> </informalexample> </section> </appendix> <!-- Translated by Simion Onea --> <!-- 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:"../../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 -->
« previous php.doc.ro (#326) next »