SlideShare une entreprise Scribd logo
Migrer de PHP4 à PHP5 Analyse de code et revue des principaux changements
Qui parle ? Julien PAULI
Formateur - consultant Anaska Alter-Way Stand F30 Spécialiste PHP et ZendFramework
Membre AFUP
Auteur Zend Framework, bien développer en PHP Contributeur Zend Framework
PHP
Apache
Evolution de PHP PHP4 est abandonné depuis le 08/08/08
PHP5 = PHP5.2.9 aujourd'hui, c'est important !
PHP5 est en évolution permanente
Demain PHP5.3 arrive, après demain PHP6
Voyons les grandes lignes techniques d'une migration
Plan PHP5 : un vrai modèle objet
Traitements XML améliorés
Utilisation de bases de données MySQL Changements dans les fonctions
Conclusion
Le modèle objet de PHP5 En PHP4, les objets ne sont que des tableaux masqués Le ZendEngine les traite comme tels
On utilise " -> " plutot que " [ " et " ] "
C'est tout ... En PHP5, les objets sont un vrai type Codés comme un type dans ZendEngine2
Permet beaucoup plus de chose que simplement utiliser " -> "
Modèle objet de PHP5 : références Tous les objets agissent comme des références en PHP5 Ce ne sont pas des "références" PHP
Mais leur comportement est identique class Foo { public function maFonction($arg1) { } } $a = new Foo; class Foo { function maFonction($arg1) { } } $a = &new Foo;
Modèle objet de PHP5 : références Passage par référence PHP5 class Foo { public $attribut = 'hello'; public function maFonction($arg1) { } } $a = new Foo; $b = $a; $a->attribut = 'changé'; echo $b->attribut // 'changé' class Foo { var $attribut = 'hello'; function maFonction($arg1) { } } $a = &new Foo; $b = &$a; $a->attribut = 'changé'; echo $b->attribut // 'changé'
Modèle objet de PHP5 : clonage Passage par référence PHP5 Clonage pour copier un objet $a = new Foo; $b =  clone  $a; $c = $a; $a->attribut = 'solutionslinux'; echo $b->attribut; // attribut echo $c->attribut; // solutionslinux $a = &new Foo; $b = $a; $c = &$a; $a->attribut = 'solutionslinux'; echo $b->attribut; // attribut echo $c->attribut; // solutionslinux
Modèle objet de PHP5 : visibilités Visibilités compatibles Grande compatibilité pour faciliter les migrations
PHP5 introduit "public", "protected", "private" class Foo { var $a; // ok, pas de problème, sera publique function bar(); // idem : sera publique } class Foo { var $a; function bar(); }
Modèle objet de PHP5 : casse Casse des méthodes, fonctions et classes En PHP, les classes et méthodes sont insensibles à la casse La casse est respectée en PHP5, elle ne l'était pas en PHP4 class Foo { function HeLLo() { } } class bAr extends Foo {} $a = new bar; echo get_class($a);  // bAr print_r(get_class_methods($a)); // array ("HeLLo"); echo get_parent_class($a);  //Foo class Foo { function HeLLo() { } } class bAr extends Foo {} $a = &new bar; echo get_class($a);  // bar print_r(get_class_methods($a)); // array("hello"); echo get_parent_class($a);  // foo
Mode de compatibilité modèle objet PHP5 Mode de compatibilité PHP4 PHP.ini : zend.ze1_compatibility_mode
Mis à zéro par défaut (comportement PHP5) Mettre cette directive à 1 permet d'utiliser le comportement objet de PHP4 dans PHP5 Utile pour migrer, mais rapidement

Contenu connexe

PPT
Introduction au langage PHP (2éme partie) élaborée par Marouan OMEZZINE
ODP
Formation PHP
PPT
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
PDF
PHP 7.0 : aperçu des nouveautés
PDF
La référence Clear php
PDF
Nouveautés php 7
PDF
PHP 1 - Apprendre les bases
PPT
PHP - get started
Introduction au langage PHP (2éme partie) élaborée par Marouan OMEZZINE
Formation PHP
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
PHP 7.0 : aperçu des nouveautés
La référence Clear php
Nouveautés php 7
PHP 1 - Apprendre les bases
PHP - get started

Tendances (18)

PPT
Cours php
PDF
PHP 7 et Symfony 3
PPT
PHP 5.3, PHP Next
PDF
Communications Réseaux et HTTP avec PHP
PPTX
PHP Training
PDF
PHP #1 : introduction
PDF
PHPTour 2011 - PHP5.4
PDF
Etes vous-pret pour php8 ?
PDF
Bases de PHP - Partie 1
PPT
Php cours
PPTX
Programmation web cours php -- sahmi academy
ODP
ZendFramework2 - Présentation
PPTX
Langage Perl
PPTX
PHP (Partie I) Par Mahdi Ben Alaya
PPTX
PHP (Partie II) Par Mahdi Ben Alaya
PPTX
Initiation au langage PHP
PDF
Alfresco en quelques points - Recherche Tutorial
PDF
Per lameliorer
Cours php
PHP 7 et Symfony 3
PHP 5.3, PHP Next
Communications Réseaux et HTTP avec PHP
PHP Training
PHP #1 : introduction
PHPTour 2011 - PHP5.4
Etes vous-pret pour php8 ?
Bases de PHP - Partie 1
Php cours
Programmation web cours php -- sahmi academy
ZendFramework2 - Présentation
Langage Perl
PHP (Partie I) Par Mahdi Ben Alaya
PHP (Partie II) Par Mahdi Ben Alaya
Initiation au langage PHP
Alfresco en quelques points - Recherche Tutorial
Per lameliorer
Publicité

En vedette (13)

PPT
Migration VB6 > .Net
PDF
English result pre-intermediate_wb
PDF
English result pre int sb
PDF
Business result elementary sb
PDF
English Result Intermediate Student´s Book pdf file
PDF
The business - intermediate Book!!!
PPT
Migration
PPTX
Migration
PDF
présentation migration automatisee Pacbase -> UML + Java
PDF
Tests de performances d'une application Java EE
PDF
PFE BI - INPT
PDF
English result elementary tb
PDF
Business basics student's book
Migration VB6 > .Net
English result pre-intermediate_wb
English result pre int sb
Business result elementary sb
English Result Intermediate Student´s Book pdf file
The business - intermediate Book!!!
Migration
Migration
présentation migration automatisee Pacbase -> UML + Java
Tests de performances d'une application Java EE
PFE BI - INPT
English result elementary tb
Business basics student's book
Publicité

Similaire à Migration PHP4-PHP5 (20)

ODP
Patterns and OOP in PHP
PDF
Php 7.4 2020-01-28 - afup
PDF
Playing With PHP 5.3
PDF
Tout pour se préparer à PHP 7.4
PDF
Cours3-PHPfgdwfwdffhddfbwdfwdfwdfwdfwfw.pdf
PDF
Php trollons mais trollons bien (Bdx.io 2015)
PPT
cours programmation web tres utile PHP1.ppt
PPT
Cours Php
PPT
Cours Php
DOC
PHP mysql Xml.doc
PPT
Les principes de base de PHP
PDF
PHP mysql Xml.pdf
PPT
PHP.PPT a good web course php that can be used
PDF
coursPHP-245455njnjnjnjnkjnkjkjnkjnkkj.pdf
PPTX
PPT
Introduction à PHP
PDF
Php 7 Think php7
PPTX
2_langage_PHP_les_bases_.2_langage_PHP_les_bases_.pptx
PDF
PHP 5.3 : les nouveautés du futur si proche
Patterns and OOP in PHP
Php 7.4 2020-01-28 - afup
Playing With PHP 5.3
Tout pour se préparer à PHP 7.4
Cours3-PHPfgdwfwdffhddfbwdfwdfwdfwdfwfw.pdf
Php trollons mais trollons bien (Bdx.io 2015)
cours programmation web tres utile PHP1.ppt
Cours Php
Cours Php
PHP mysql Xml.doc
Les principes de base de PHP
PHP mysql Xml.pdf
PHP.PPT a good web course php that can be used
coursPHP-245455njnjnjnjnkjnkjkjnkjnkkj.pdf
Introduction à PHP
Php 7 Think php7
2_langage_PHP_les_bases_.2_langage_PHP_les_bases_.pptx
PHP 5.3 : les nouveautés du futur si proche

Plus de julien pauli (20)

PDF
Doctrine with Symfony - SymfonyCon 2019
PDF
Php engine
PDF
PHP 7 OPCache extension review
PDF
PDF
PHP Internals and Virtual Machine
PDF
Basics of Cryptography - Stream ciphers and PRNG
PDF
Mastering your home network - Do It Yourself
PDF
SymfonyCon 2017 php7 performances
PDF
Php and threads ZTS
PDF
PDF
Symfony live 2017_php7_performances
PDF
PHP 7 new engine
PDF
Php7 extensions workshop
PDF
Profiling php5 to php7
PDF
PHP 7 performances from PHP 5
PDF
PHP7 is coming
PDF
Mysqlnd, an unknown powerful PHP extension
PDF
Php extensions workshop
PDF
Understanding PHP objects
ODP
PHP Tips for certification - OdW13
Doctrine with Symfony - SymfonyCon 2019
Php engine
PHP 7 OPCache extension review
PHP Internals and Virtual Machine
Basics of Cryptography - Stream ciphers and PRNG
Mastering your home network - Do It Yourself
SymfonyCon 2017 php7 performances
Php and threads ZTS
Symfony live 2017_php7_performances
PHP 7 new engine
Php7 extensions workshop
Profiling php5 to php7
PHP 7 performances from PHP 5
PHP7 is coming
Mysqlnd, an unknown powerful PHP extension
Php extensions workshop
Understanding PHP objects
PHP Tips for certification - OdW13

Migration PHP4-PHP5

  • 1. Migrer de PHP4 à PHP5 Analyse de code et revue des principaux changements
  • 2. Qui parle ? Julien PAULI
  • 3. Formateur - consultant Anaska Alter-Way Stand F30 Spécialiste PHP et ZendFramework
  • 5. Auteur Zend Framework, bien développer en PHP Contributeur Zend Framework
  • 6. PHP
  • 8. Evolution de PHP PHP4 est abandonné depuis le 08/08/08
  • 9. PHP5 = PHP5.2.9 aujourd'hui, c'est important !
  • 10. PHP5 est en évolution permanente
  • 11. Demain PHP5.3 arrive, après demain PHP6
  • 12. Voyons les grandes lignes techniques d'une migration
  • 13. Plan PHP5 : un vrai modèle objet
  • 15. Utilisation de bases de données MySQL Changements dans les fonctions
  • 17. Le modèle objet de PHP5 En PHP4, les objets ne sont que des tableaux masqués Le ZendEngine les traite comme tels
  • 18. On utilise " -> " plutot que " [ " et " ] "
  • 19. C'est tout ... En PHP5, les objets sont un vrai type Codés comme un type dans ZendEngine2
  • 20. Permet beaucoup plus de chose que simplement utiliser " -> "
  • 21. Modèle objet de PHP5 : références Tous les objets agissent comme des références en PHP5 Ce ne sont pas des "références" PHP
  • 22. Mais leur comportement est identique class Foo { public function maFonction($arg1) { } } $a = new Foo; class Foo { function maFonction($arg1) { } } $a = &new Foo;
  • 23. Modèle objet de PHP5 : références Passage par référence PHP5 class Foo { public $attribut = 'hello'; public function maFonction($arg1) { } } $a = new Foo; $b = $a; $a->attribut = 'changé'; echo $b->attribut // 'changé' class Foo { var $attribut = 'hello'; function maFonction($arg1) { } } $a = &new Foo; $b = &$a; $a->attribut = 'changé'; echo $b->attribut // 'changé'
  • 24. Modèle objet de PHP5 : clonage Passage par référence PHP5 Clonage pour copier un objet $a = new Foo; $b = clone $a; $c = $a; $a->attribut = 'solutionslinux'; echo $b->attribut; // attribut echo $c->attribut; // solutionslinux $a = &new Foo; $b = $a; $c = &$a; $a->attribut = 'solutionslinux'; echo $b->attribut; // attribut echo $c->attribut; // solutionslinux
  • 25. Modèle objet de PHP5 : visibilités Visibilités compatibles Grande compatibilité pour faciliter les migrations
  • 26. PHP5 introduit "public", "protected", "private" class Foo { var $a; // ok, pas de problème, sera publique function bar(); // idem : sera publique } class Foo { var $a; function bar(); }
  • 27. Modèle objet de PHP5 : casse Casse des méthodes, fonctions et classes En PHP, les classes et méthodes sont insensibles à la casse La casse est respectée en PHP5, elle ne l'était pas en PHP4 class Foo { function HeLLo() { } } class bAr extends Foo {} $a = new bar; echo get_class($a); // bAr print_r(get_class_methods($a)); // array ("HeLLo"); echo get_parent_class($a); //Foo class Foo { function HeLLo() { } } class bAr extends Foo {} $a = &new bar; echo get_class($a); // bar print_r(get_class_methods($a)); // array("hello"); echo get_parent_class($a); // foo
  • 28. Mode de compatibilité modèle objet PHP5 Mode de compatibilité PHP4 PHP.ini : zend.ze1_compatibility_mode
  • 29. Mis à zéro par défaut (comportement PHP5) Mettre cette directive à 1 permet d'utiliser le comportement objet de PHP4 dans PHP5 Utile pour migrer, mais rapidement
  • 30. Aucune application de production ne devrait tourner sous ce mode
  • 31. Il n'est ni sûr, ni stable
  • 32. Petits pièges du modèle objet All right ! False true false Fatal error Fatal error false true class Foo { public function bar() { $this = new Something; } } class Foo { public $foo; } $foo1 = new Foo; $foo2 = new Foo; $foo1->foo = $foo2; $foo2->foo = $foo1; var_dump($foo1 == $foo2); class Foo { } $foo = new Foo; var_dump(empty($foo)); var_dump((bool)$foo);
  • 33. Modèle objet de PHP5 en résumé Résumons <?php $a =& new Class; function foo(&$obj) { $obj->prop = 123; } $obj_copy = $obj; function &a() { $a =& new Object; return $a; } <?php $a = new Class; function foo($obj) { $obj->prop = 123; } $obj_copy = clone $obj; function a() { return new Object; }
  • 34. Le rapport d'erreurs Nouveau rapport PHP5 : E_STRICT Affiche des erreurs principalement relatives à la conception logicielle
  • 35. E_ALL n'inclut pas E_STRICT class Foo { public function maFonction($arg1) { } } class Bar extends Foo { public function maFonction($arg1, $arg2) { } } Strict standards: Declaration of Bar::maFonction() should be compatible with that of Foo::maFonction() in /media/data/www/labo/newfile.php on line 10 $a = &new Foo; Strict standards : ... ... class Foo { public function hello() { } } Foo::hello(); abstract static function bar();
  • 36. Le rapport d'erreurs PHP5 : E_RECOVERABLE_ERROR Erreur grave, mais n'ayant pas fait planté PHP en interne
  • 37. L'erreur doit être attrapée par un gestionnaire utilisateur
  • 38. Envoyée lors de problèmes de typage d'arguments Class Foo { public function maFonction( Linux $arg1) { } public static function errorHandler($errno, $errstr) { echo &quot;erreur attrapée : $errstr&quot;; } } set_error_handler(array('Foo, 'errorHandler')); $a = new Anaska; $a->maFonction(&quot;Autre chose qu'un objet Linux&quot;); erreur attrapée : Argument 1 passed to Foo::maFonction() must be an instance of Linux, string given, called in /media/data/www/labo/newfile.php on line 15 and defined ...
  • 39. Conclusions rapport d'erreurs en migration E_STRICT n'est pas activé par défaut La migration est plus simple
  • 40. Mais les erreurs seront tout de même présentes E_STRICT facilite la migration Il vous prévient si vous utilisez des &quot;&&quot;' où il ne faut pas
  • 41. Activez-le pour vous en rendre compte // php.ini error_reporting = E_ALL | E_STRICT
  • 42. Premières conclusions de migration Je ne suis pas obligé de renommer tous mes constructeurs en __construct() Un constructeur ayant le même nom que la classe fonctionne en PHP5 Je ne suis pas obligé de supprimer tous les appels au mot-clé &quot;var&quot; Il sera traduit en interne en &quot;public&quot; Je ne suis pas obligé de supprimer tous les &quot;&&quot; Ils génèrent une erreur E_STRICT qui par défaut est masquée
  • 43. Je peux aussi utiliser temporairement le mode de compatibilité
  • 44. Support XML PHP4 possède un support XML Bancal
  • 47. Plus adapté aux développements d'aujourd'hui PHP5 casse la compatibilité DOM remplace DOMXML Conclusion : il faudra très probablement réécrire son code
  • 48. Support MySQL Où est MySQL ?? Je ne vois plus MySQL !
  • 49. MySQL a-t-il disparu de PHP5 ?
  • 50. Support MySQL MySQL est toujours supporté ;-)
  • 51. LibMySQL n'est plus fournie dans la distrib par défaut Vous devez compiler avec --with-mysql à la main
  • 52. Sous Windows -> activer la/les dll nécessaires à la main Cessez d'utiliser ext/MySQL ! Ces fonctions existent toujours, pour des raisons de migration
  • 53. Mais dès que possible, abandonnez-les et passez à MySQLi ou PDO ext/MySQLi : extension MySQL &quot;i&quot;mproved
  • 54. PDO & PDO_MySQL PHP Data Object
  • 55. MySQLi Fonctions terminées par &quot;i&quot; mysqli_query() mysqli_connect() ...
  • 56. Grande compatibilité avec ext/MySQL Nouvelles fonctionnalités
  • 59. Orientation objet possible mais pas obligatoire
  • 60. Voyons un peu les différences ext/MySQL <-> ext/MySQLi
  • 61. Support MySQL de PHP : ext/MySQL Exemple avec ext/Mysql (Très) vieillissant, mais fonctionne toujours sous PHP5
  • 62. La connexion est implicite, les fonctions réutilisent la dernière mysql_connect('localhost', 'julien', 'anaska'); mysql_select_db('membres'); $age = 29; $sql = mysql_query(&quot;SELECT nom, prenom FROM membres WHERE age < $age&quot;); while ($result = mysql_fetch_array($sql)) { printf(&quot;%s %s a %d ans &quot; . PHP_EOL, $result['nom'], $result['prenom'], $age); } mysql_close();
  • 63. Support MySQL de PHP : ext/MySQLi Même exemple avec ext/Mysqli Code procédural
  • 64. La connexion n'est pas implicite, il faut la préciser aux fonctions C'est plus logique tout de même Certaines fonctions inversent des params. par rapport à ext/Mysql $db = mysqli_connect('localhost', 'julien', 'anaska', 'membres'); $age = 29; $sql=mysqli_query( $db ,&quot;SELECT nom, prenom FROM membres WHERE age < $age&quot;); while ($result = mysqli_fetch_array($sql)) { printf(&quot;%s %s a %d ans &quot; . PHP_EOL, $result['nom'], $result['prenom'], $age); } mysqli_close( $db );
  • 65. Support MySQL de PHP Comparons $db = mysqli_connect('localhost', 'julien', 'anaska', 'membres'); $age = 29; $sql=mysqli_query($db, &quot;SELECT nom, prenom FROM membres WHERE age < $age&quot;); while ($result = mysqli_fetch_array($sql)) { printf(&quot;%s %s a %d ans &quot; . PHP_EOL, $result['nom'], $result['prenom'], $age); } mysqli_close($db); mysql_connect('localhost', 'julien', 'anaska'); mysql_select_db('membres'); $age = 29; $sql = mysql_query(&quot;SELECT nom, prenom FROM membres WHERE age < $age&quot;); while ($result = mysql_fetch_array($sql)) { printf(&quot;%s %s a %d ans &quot; . PHP_EOL, $result['nom'], $result['prenom'], $age); } mysql_close();
  • 66. Conclusions MySQL migration vers PHP5 L'extension ext/MySQL existe toujours Migration facile et souple Il faudra songer à passer à MySQLi (ou PDO) MySQLi a une API très semblable à celle de MySQL
  • 67. Attention tout de même aux &quot;arguments inversés&quot; Et puis MySQLi c'est aussi ... Requêtes préparées
  • 71. API de gestion des serveurs MySQL (démarrage, réplication ...)
  • 72. Changement de comportement de fonctions Pour des raisons de performance, ou simplement de logique, le comportement de certaines fonctions PHP a changé de PHP4 à PHP5 array_merge()
  • 77. Changement de comportement de fonctions array_merge() PHP4 autorisait des paramètres de type non tableau, pas PHP5 Ip2long() PHP4 retourne -1 sur des adresses invalides, PHP5 retourne false Strrpos() PHP4 ne prend que le premier caractère, PHP5 cherche tout $a = array_merge(array(1,2,3), 4 ); //OK $a = array_merge(array(1,2,3), array(4) ); // OK $a = ip2long('127.0'); // -1 $a = ip2long('127.0'); // false echo strrpos(&quot;so l utionlinux&quot;, &quot;li&quot;); //2 echo strrpos(&quot;so l ution li nux&quot;, &quot;li&quot;); //8
  • 78. Conclusion Passer de PHP4 à PHP5 c'est souvent faire le ménage
  • 80. Migrer de PHP4 à PHP5 c'est ... Pouvoir designer ses applications avec UML
  • 81. Bénéficier d'un langage (beaucoup) plus performant et plus sécurisé
  • 82. Ecrire moins de lignes de code pour en faire plus
  • 84. Conclusion (finale...) PHP est le seul langage au monde porté sur le Web
  • 85. Le Web évolue à chaque seconde qui passe
  • 86. PHP5 est sorti en 2004
  • 87. PHP est libre et développé par une grande communauté