SlideShare a Scribd company logo
1 of 21
Download to read offline
PHP GeekMeet #2 Cluj




     Ce e nou in PHP 5.3?
New Features in PHP 5.3

  
      Late static binding
  
      Functii Lambda si Closures
  
      Namespaces
  
      Eliberarea memoriei ocupate de referinte ciclice
  
      NOWDOC, __callStatic()
  
      mysqlnd – MySQL Native Driver
  
      Imbunatatiri de performanta
  
      Multe bugfix-uri si imbunatatiri
Late Static Binding

    <?php
    class A {
         public static function class_name() {
              echo __CLASS__;
         }
         public static function test() {
              self::class_name();
         }
    }

    class B extends A {

    }

    A::test();
    B::test();
    ?>
Late Static Binding

    <?php
    class A {
         public static function class_name() {
              echo __CLASS__;
         }
         public static function test() {
              self::class_name();
         }
    }

    class B extends A {
         public static function class_name() {
              echo __CLASS__;
         }
    }

    A::test();
    B::test();
    ?>
Late Static Binding

   referinta statica self:: face defapt referire la clasa in care a
    fost definita metoda in care sunt folosite


   late static binding foloseste keyword-ul rezervat static ca
    referinta pentru clasa din care a fost apelata functia in
    contextul unei mosteniri statice.


   “Late binding” - “asociere tarzie” (referinta la runtime),
    “Static binding” folosirea in metodele statice.
Late Static Binding
    <?php
    class A {
        public static function class_name() {
            echo __CLASS__;
        }
        public static function test() {
            static::class_name();
        }
    }

    class B extends A {
        public static function class_name() {
            echo __CLASS__;
        }
    }

    A::test();
    B::test();
    ?>
Functii Lambda si “Closures”
●



   Functii anonime ”throwaway”
   C++, C#, python, javascript etc
   Compilate la runtime (nu pot fi cache-uite)


    Functii Lambda


   Functie anonima
   Pot trai mai mult decat ceea ce le-a creat.
   Utile in functiile care accepta ca parametru un “callback” (ex. array_filter)
Functii Lambda si “Closures”
    <?php
    function impar($var)
    {
        return($var & 1);
    }

    $sir_numere = array(6, 7, 8, 9, 10, 11, 12);

    echo quot;Impare :nquot;;
    print_r(array_filter($sir_numere, quot;imparquot;));
    ?>


    <?php

    $sir_numere = array(6, 7, 8, 9, 10, 11, 12);

    echo quot;Impare :nquot;;
    print_r(array_filter($sir_numere, function ($var){ return($var & 1);}));
    ?>
Functii Lambda si “Closures”

    Closures


   o functie lambda ”constienta” de context. Are abilitatea sa “importe”
    variabilele din “scop-ul” parinte.
   Variabilele importante din mediul extern sunt specificate prin intermediul
    clauzei use.
   Variabilele sunt transmise prin valoare. Pentru a 'pasa' variabilele prin referinta
    se poate folosi operatorul &.
   din versiunea PHP 5.3 beta1 functiile closure nu au acces implicit la $this si nu
    pot fi declarate static.
Functii Lambda si “Closures”

   <?php
   $x = 1;

   $lambda1 = function () use ($x) {
       $x *= 2;
   };
   $lambda2 = function () use (&$x) {
       $x *= 3;
   };

   $lambda1 ();
   echo $x; // 1

   $lambda2 ();
   echo $x; // 3
   ?>
Namespaces

     Cei care lucreaza la aplicatii/librarii de dimensiuni mai mari se bat de problema
     conflictelor intre denumiri fie ele interne sau cu librarii third-party, de aceea
     trebuie sa recurga la denumiri lungi.
    Cum se numeste aplicatia mea? BestECommerceShopEver.
    Din ce modul face parte clasa (ex. Customer, Checkout)? Customer.
    Model/View/Controller? Model.
    Ce face practic clasa? Taxeaza clientul (Billing).
BestECommerceShopEver_Customer_Model_Billing. Not very nice...
De ce am denumit asa clasa? Pentru ca e posibil sa folosim o clasa Billing ca si in
modulul Customer controller, o clasa Billing in modulul ce se ocupa cu
distribuitorii etc.
Namespaces

   Conditia este sa fie declarate in namespace-uri diferite.
    Astfel se poate reveni la denumirile scurte ale claselor,
    imbunatatind lizibilitatea codului.
   Container abstract pentru organizarea unei grupari logice,
    o metoda de a encapsula elementele inrudite (asociate),
    grupand clase, functii, constante.
   Sunt afectate doar denumirile de clase, functii si
    constantele.
    Acelasi identificator poate fi definit independent in
    namespace-uri diferite dar fara a avea neaparat acelasi
    sens peste tot. Aceleasi clase/functii/constante in
    namespace-uri diferite si avand roluri total diferite.
Namespaces

   Se foloseste keyword-ul 'namespace'.
   Declararea se face la inceputul fisierului (Exceptie
    'declare').
   acelasi namespace → ”intins” pe mai multe fisiere.
       <html> <!-- fatal error -->
       <?php
       namespace
       BestECommerceShopEverCustomerModel;

       const BILLED_OK = 1;
       class Billing { /* ... */ }
       function bill() { /* ... */ }

       ?>
Namespaces
   Mai multe namespaces in acelasi fisier

<?php
namespace BestECommerceShopEverCustomerModel {

    class Billing { /* ... */ }
    function get_bill_value() { /* ... */ }
}

namespace BestECommerceShopEverCustomerController {

    class Billing { /* ... */ }
    function perform_bill() { /* ... */ }
}

namespace {//global code
   const BILLED_OK = 1;
   $bill_result =
BestECommerceShopEverCustomerControllerBilling::perform_bill();
   if ($bill_result == BILLED_OK) {
        echo 'Success!';
   }
}
?>
Namespaces

   Analogie intre namespaces si un sistem de fisiere
   3 Moduri de a referi o clasa folosind namespaces:
        1. denumirea clasei neprefixata: $a = new foo();
         daca codul se afla intr-un namespace: currentnamespacefoo.
         Daca codul e global, (non-namespaced code): foo.
        2. denumirea clasei e prefixata: $a = new namespacefoo();
         currentnamespacenamespacefoo. sau namespacefoo (daca
         codul e global).
        3. denumirea clasei e prefixata cu un operator ”prefix global”:
         $a = new currentnamespacefoo();
         currentnamespacefoo
Namespaces
<?php
namespace foo;
use MyFullClassname as Another;

// this is the same as use MyFullNSname as NSname
use MyFullNSname;

// importing a global class
use ArrayObject;

$obj = new namespaceAnother; // instantiates object of class
fooAnother
$obj = new Another; // instantiates object of class
MyFullClassname
NSnamesubnsfunc(); // calls function
MyFullNSnamesubnsfunc
$a = new ArrayObject(array(1)); // instantiates object of class
ArrayObject
// without the quot;use ArrayObjectquot; we would instantiate an
object of class fooArrayObject
?>
Eliberarea memoriei ocupate de
referinte ciclice
 <?php
 class Node {
     public $parentNode;

     public $childNodes = array();

     function Node() {
         $this->nodeValue = str_repeat('0123456789', 128);
     }
 }

 function createRelationship() {

     $parent = new Node();    $child = new Node();

     $parent->childNodes[] = $child;
     $child->parentNode = $parent;
 }

 for($i = 0; $i < 10000; $i++) {
       createRelationship();
 }
 //Initial: 62,224 bytes Peak: 34,905,216 bytes End: 34,905,016 bytes
 ?>
NOWDOC
   HEREDOC:

               <?php
               $name = 'MyName';

               echo <<<EOT
               My name is quot;$namequot;.
               EOT;
               ?>

   NOWDOC:
               <?php
               $name = 'MyName';

               echo <<<'EOT'
               My name is quot;$namequot;.
               EOT;
               ?>
__callStatic()
       Magic method (__get, __set, __call)


    <?php
    class MethodTest {
        public function __call($name, $arguments) {
            echo quot;Metoda '$name' nu exista. Apel: quot; . implode(', ', $arguments);
        }

          public static function __callStatic($name, $arguments) {
              echo quot;Metoda '$name' nu exista. Apel: quot; . implode(', ', $arguments);
          }
    }

    $obj = new MethodTest;
    $obj->runTest('obiect');// Metoda 'runTest' nu exista. Apel: obiect.

    MethodTest::runTest('static');// Metoda 'runTest' nu exista. Apel: static.
    ?>
mysqlnd – MySQL Native Driver

     mysqlnd & libmysql: C-libraries, MySQL communication protocol
     sub licenta PHP, nu mai e nevoie de FLOSS Exception
     Integrat in PHP
     ext/mysql & ext/mysqli pot folosi optional mysqlnd. PDO/MySQL pe
      viitor.
     Nativ: foloseste PHP memory management, suporta limita de
      memorie din PHP
     mysqli_fetch_all()
     Statistici pentru analiza performantei: mysqli_get_cache_stats(),
      mysqli_get_client_stats(), mysqli_get_connection_stats()
     Performanta: uneori e mai rapida decat libmysql
     Performanta: (pe viitor) caching client-side pt setul de rezultate
Imbunatatiri de performanta

- Sebastian Bergmann (PHPUnit, framework-ul de unit testing pentru PHP)
•   PHP 5.3 e de 1.2 ori mai rapid decat PHP 5.2 la viteza de executie bruta dupa ce
    a facut o medie intre mai multe teste.


- cei de la Doctrine (ORM) au facut un benchmark pentru suita lor de teste folosind
PHP 5.3 si PHP 5.2.8
•   testele ruleaza cu 17% mai rapid
•   folosesc cu 31% mai putina memorie

More Related Content

What's hot

Barcamp
BarcampBarcamp
Barcamprenelc
 
変態的PHPフレームワーク rhaco
変態的PHPフレームワーク rhaco変態的PHPフレームワーク rhaco
変態的PHPフレームワーク rhacomakoto tsuyuki
 
珠三角技术沙龙新语言场 C++11
珠三角技术沙龙新语言场 C++11珠三角技术沙龙新语言场 C++11
珠三角技术沙龙新语言场 C++11翀 周
 
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016Loïc Knuchel
 
ECMAscript 2015 aka ES6 : à la découverte du nouveau javascript
ECMAscript 2015 aka ES6 : à la découverte du nouveau javascriptECMAscript 2015 aka ES6 : à la découverte du nouveau javascript
ECMAscript 2015 aka ES6 : à la découverte du nouveau javascriptmatparisot
 
Aller plus loin avec Doctrine2
Aller plus loin avec Doctrine2Aller plus loin avec Doctrine2
Aller plus loin avec Doctrine2André Tapia
 
JPA - Java Persistence API
JPA - Java Persistence APIJPA - Java Persistence API
JPA - Java Persistence APIThomas Wöhlke
 
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev FedorProgramming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev FedorFedor Lavrentyev
 
Java & le pattern matching
Java & le pattern matchingJava & le pattern matching
Java & le pattern matchingDidier Plaindoux
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3Platonov Sergey
 
Configurar con spring un api no basado en spring
Configurar con spring un api no basado en springConfigurar con spring un api no basado en spring
Configurar con spring un api no basado en springJose María Arranz
 
Ejb 3.0 Glassfish 2.X Netbeans 6.X
Ejb 3.0 Glassfish 2.X Netbeans 6.XEjb 3.0 Glassfish 2.X Netbeans 6.X
Ejb 3.0 Glassfish 2.X Netbeans 6.Xa19987225
 
Curso Symfony - Clase 1
Curso Symfony - Clase 1Curso Symfony - Clase 1
Curso Symfony - Clase 1Javier Eguiluz
 
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tipsOpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tipsHo Kim
 
EJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSEJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSDarwin Durand
 

What's hot (20)

Iteratory
IteratoryIteratory
Iteratory
 
Barcamp
BarcampBarcamp
Barcamp
 
変態的PHPフレームワーク rhaco
変態的PHPフレームワーク rhaco変態的PHPフレームワーク rhaco
変態的PHPフレームワーク rhaco
 
珠三角技术沙龙新语言场 C++11
珠三角技术沙龙新语言场 C++11珠三角技术沙龙新语言场 C++11
珠三角技术沙龙新语言场 C++11
 
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
 
PHP OOP
PHP OOPPHP OOP
PHP OOP
 
Gjuha paskal
Gjuha paskal Gjuha paskal
Gjuha paskal
 
ECMAscript 2015 aka ES6 : à la découverte du nouveau javascript
ECMAscript 2015 aka ES6 : à la découverte du nouveau javascriptECMAscript 2015 aka ES6 : à la découverte du nouveau javascript
ECMAscript 2015 aka ES6 : à la découverte du nouveau javascript
 
Aller plus loin avec Doctrine2
Aller plus loin avec Doctrine2Aller plus loin avec Doctrine2
Aller plus loin avec Doctrine2
 
JPA - Java Persistence API
JPA - Java Persistence APIJPA - Java Persistence API
JPA - Java Persistence API
 
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev FedorProgramming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
 
Java & le pattern matching
Java & le pattern matchingJava & le pattern matching
Java & le pattern matching
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
Configurar con spring un api no basado en spring
Configurar con spring un api no basado en springConfigurar con spring un api no basado en spring
Configurar con spring un api no basado en spring
 
Ejb 3.0 Glassfish 2.X Netbeans 6.X
Ejb 3.0 Glassfish 2.X Netbeans 6.XEjb 3.0 Glassfish 2.X Netbeans 6.X
Ejb 3.0 Glassfish 2.X Netbeans 6.X
 
Proxy & CGLIB
Proxy & CGLIBProxy & CGLIB
Proxy & CGLIB
 
스프링 JPA 강좌(Spring Data JPA 간단 예제)
스프링 JPA 강좌(Spring Data JPA 간단 예제)스프링 JPA 강좌(Spring Data JPA 간단 예제)
스프링 JPA 강좌(Spring Data JPA 간단 예제)
 
Curso Symfony - Clase 1
Curso Symfony - Clase 1Curso Symfony - Clase 1
Curso Symfony - Clase 1
 
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tipsOpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
 
EJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSEJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOS
 

Adi Fatol - Ce e nou in PHP 5.3?

  • 1. PHP GeekMeet #2 Cluj Ce e nou in PHP 5.3?
  • 2. New Features in PHP 5.3  Late static binding  Functii Lambda si Closures  Namespaces  Eliberarea memoriei ocupate de referinte ciclice  NOWDOC, __callStatic()  mysqlnd – MySQL Native Driver  Imbunatatiri de performanta  Multe bugfix-uri si imbunatatiri
  • 3. Late Static Binding <?php class A { public static function class_name() { echo __CLASS__; } public static function test() { self::class_name(); } } class B extends A { } A::test(); B::test(); ?>
  • 4. Late Static Binding <?php class A { public static function class_name() { echo __CLASS__; } public static function test() { self::class_name(); } } class B extends A { public static function class_name() { echo __CLASS__; } } A::test(); B::test(); ?>
  • 5. Late Static Binding  referinta statica self:: face defapt referire la clasa in care a fost definita metoda in care sunt folosite  late static binding foloseste keyword-ul rezervat static ca referinta pentru clasa din care a fost apelata functia in contextul unei mosteniri statice.  “Late binding” - “asociere tarzie” (referinta la runtime), “Static binding” folosirea in metodele statice.
  • 6. Late Static Binding <?php class A { public static function class_name() { echo __CLASS__; } public static function test() { static::class_name(); } } class B extends A { public static function class_name() { echo __CLASS__; } } A::test(); B::test(); ?>
  • 7. Functii Lambda si “Closures” ●  Functii anonime ”throwaway”  C++, C#, python, javascript etc  Compilate la runtime (nu pot fi cache-uite) Functii Lambda  Functie anonima  Pot trai mai mult decat ceea ce le-a creat.  Utile in functiile care accepta ca parametru un “callback” (ex. array_filter)
  • 8. Functii Lambda si “Closures” <?php function impar($var) { return($var & 1); } $sir_numere = array(6, 7, 8, 9, 10, 11, 12); echo quot;Impare :nquot;; print_r(array_filter($sir_numere, quot;imparquot;)); ?> <?php $sir_numere = array(6, 7, 8, 9, 10, 11, 12); echo quot;Impare :nquot;; print_r(array_filter($sir_numere, function ($var){ return($var & 1);})); ?>
  • 9. Functii Lambda si “Closures” Closures  o functie lambda ”constienta” de context. Are abilitatea sa “importe” variabilele din “scop-ul” parinte.  Variabilele importante din mediul extern sunt specificate prin intermediul clauzei use.  Variabilele sunt transmise prin valoare. Pentru a 'pasa' variabilele prin referinta se poate folosi operatorul &.  din versiunea PHP 5.3 beta1 functiile closure nu au acces implicit la $this si nu pot fi declarate static.
  • 10. Functii Lambda si “Closures” <?php $x = 1; $lambda1 = function () use ($x) { $x *= 2; }; $lambda2 = function () use (&$x) { $x *= 3; }; $lambda1 (); echo $x; // 1 $lambda2 (); echo $x; // 3 ?>
  • 11. Namespaces Cei care lucreaza la aplicatii/librarii de dimensiuni mai mari se bat de problema conflictelor intre denumiri fie ele interne sau cu librarii third-party, de aceea trebuie sa recurga la denumiri lungi.  Cum se numeste aplicatia mea? BestECommerceShopEver.  Din ce modul face parte clasa (ex. Customer, Checkout)? Customer.  Model/View/Controller? Model.  Ce face practic clasa? Taxeaza clientul (Billing). BestECommerceShopEver_Customer_Model_Billing. Not very nice... De ce am denumit asa clasa? Pentru ca e posibil sa folosim o clasa Billing ca si in modulul Customer controller, o clasa Billing in modulul ce se ocupa cu distribuitorii etc.
  • 12. Namespaces  Conditia este sa fie declarate in namespace-uri diferite. Astfel se poate reveni la denumirile scurte ale claselor, imbunatatind lizibilitatea codului.  Container abstract pentru organizarea unei grupari logice, o metoda de a encapsula elementele inrudite (asociate), grupand clase, functii, constante.  Sunt afectate doar denumirile de clase, functii si constantele.  Acelasi identificator poate fi definit independent in namespace-uri diferite dar fara a avea neaparat acelasi sens peste tot. Aceleasi clase/functii/constante in namespace-uri diferite si avand roluri total diferite.
  • 13. Namespaces  Se foloseste keyword-ul 'namespace'.  Declararea se face la inceputul fisierului (Exceptie 'declare').  acelasi namespace → ”intins” pe mai multe fisiere. <html> <!-- fatal error --> <?php namespace BestECommerceShopEverCustomerModel; const BILLED_OK = 1; class Billing { /* ... */ } function bill() { /* ... */ } ?>
  • 14. Namespaces  Mai multe namespaces in acelasi fisier <?php namespace BestECommerceShopEverCustomerModel { class Billing { /* ... */ } function get_bill_value() { /* ... */ } } namespace BestECommerceShopEverCustomerController { class Billing { /* ... */ } function perform_bill() { /* ... */ } } namespace {//global code const BILLED_OK = 1; $bill_result = BestECommerceShopEverCustomerControllerBilling::perform_bill(); if ($bill_result == BILLED_OK) { echo 'Success!'; } } ?>
  • 15. Namespaces  Analogie intre namespaces si un sistem de fisiere  3 Moduri de a referi o clasa folosind namespaces:  1. denumirea clasei neprefixata: $a = new foo(); daca codul se afla intr-un namespace: currentnamespacefoo. Daca codul e global, (non-namespaced code): foo.  2. denumirea clasei e prefixata: $a = new namespacefoo(); currentnamespacenamespacefoo. sau namespacefoo (daca codul e global).  3. denumirea clasei e prefixata cu un operator ”prefix global”: $a = new currentnamespacefoo(); currentnamespacefoo
  • 16. Namespaces <?php namespace foo; use MyFullClassname as Another; // this is the same as use MyFullNSname as NSname use MyFullNSname; // importing a global class use ArrayObject; $obj = new namespaceAnother; // instantiates object of class fooAnother $obj = new Another; // instantiates object of class MyFullClassname NSnamesubnsfunc(); // calls function MyFullNSnamesubnsfunc $a = new ArrayObject(array(1)); // instantiates object of class ArrayObject // without the quot;use ArrayObjectquot; we would instantiate an object of class fooArrayObject ?>
  • 17. Eliberarea memoriei ocupate de referinte ciclice <?php class Node { public $parentNode; public $childNodes = array(); function Node() { $this->nodeValue = str_repeat('0123456789', 128); } } function createRelationship() { $parent = new Node(); $child = new Node(); $parent->childNodes[] = $child; $child->parentNode = $parent; } for($i = 0; $i < 10000; $i++) { createRelationship(); } //Initial: 62,224 bytes Peak: 34,905,216 bytes End: 34,905,016 bytes ?>
  • 18. NOWDOC  HEREDOC: <?php $name = 'MyName'; echo <<<EOT My name is quot;$namequot;. EOT; ?>  NOWDOC: <?php $name = 'MyName'; echo <<<'EOT' My name is quot;$namequot;. EOT; ?>
  • 19. __callStatic()  Magic method (__get, __set, __call) <?php class MethodTest { public function __call($name, $arguments) { echo quot;Metoda '$name' nu exista. Apel: quot; . implode(', ', $arguments); } public static function __callStatic($name, $arguments) { echo quot;Metoda '$name' nu exista. Apel: quot; . implode(', ', $arguments); } } $obj = new MethodTest; $obj->runTest('obiect');// Metoda 'runTest' nu exista. Apel: obiect. MethodTest::runTest('static');// Metoda 'runTest' nu exista. Apel: static. ?>
  • 20. mysqlnd – MySQL Native Driver  mysqlnd & libmysql: C-libraries, MySQL communication protocol  sub licenta PHP, nu mai e nevoie de FLOSS Exception  Integrat in PHP  ext/mysql & ext/mysqli pot folosi optional mysqlnd. PDO/MySQL pe viitor.  Nativ: foloseste PHP memory management, suporta limita de memorie din PHP  mysqli_fetch_all()  Statistici pentru analiza performantei: mysqli_get_cache_stats(), mysqli_get_client_stats(), mysqli_get_connection_stats()  Performanta: uneori e mai rapida decat libmysql  Performanta: (pe viitor) caching client-side pt setul de rezultate
  • 21. Imbunatatiri de performanta - Sebastian Bergmann (PHPUnit, framework-ul de unit testing pentru PHP) • PHP 5.3 e de 1.2 ori mai rapid decat PHP 5.2 la viteza de executie bruta dupa ce a facut o medie intre mai multe teste. - cei de la Doctrine (ORM) au facut un benchmark pentru suita lor de teste folosind PHP 5.3 si PHP 5.2.8 • testele ruleaza cu 17% mai rapid • folosesc cu 31% mai putina memorie