cvs: phpdoc-ro /appendices migration.xml migration4.xml migration5.xml migration51.xml
| From: | Simion Onea | 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->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><? ></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 & ~ ( 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 & ~ ( 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->member} text"</literal>, în timp ce în PHP 3 trebuia sÄ utilizaÅ£i ceva de tipul <literal>"text".$obj->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 >= 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) — 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) — 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 < 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 -->
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->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><? ></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 & ~ ( 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 & ~ ( 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->member} text"</literal>, în timp ce în PHP 3 trebuia sÄ utilizaÅ£i ceva de tipul <literal>"text".$obj->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 >= 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) — 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) — 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 < 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 -->