Migrer de PHP4 à PHP5 Analyse de code et revue des principaux changements
Qui parle ? <ul><li>Julien PAULI
Formateur - consultant Anaska Alter-Way </li><ul><li>Stand F30 </li></ul><li>Spécialiste PHP et ZendFramework
Membre AFUP
Auteur </li><ul><li>Zend Framework, bien développer en PHP </li></ul><li>Contributeur </li><ul><li>Zend Framework
PHP
Apache </li></ul></ul>
Evolution de PHP <ul><li>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 </li></ul>
Plan <ul><li>PHP5 : un vrai modèle objet
Traitements XML améliorés
Utilisation de bases de données </li><ul><li>MySQL </li></ul><li>Changements dans les fonctions
Conclusion </li></ul>
Le modèle objet de PHP5 <ul><li>En PHP4, les objets ne sont que des tableaux masqués </li><ul><li>Le ZendEngine les traite...
On utilise &quot; -> &quot; plutot que &quot; [ &quot; et &quot; ] &quot;
C'est tout ... </li></ul><li>En PHP5, les objets sont un vrai type </li><ul><li>Codés comme un type dans ZendEngine2
Permet beaucoup plus de chose que simplement utiliser &quot; -> &quot; </li></ul></ul>
Modèle objet de PHP5 : références <ul><li>Tous les objets agissent comme des références en PHP5 </li><ul><li>Ce ne sont pa...
Mais leur comportement est identique </li></ul></ul>class Foo { public function maFonction($arg1) { } } $a = new Foo; clas...
Modèle objet de PHP5 : références <ul><li>Passage par référence PHP5 </li></ul>class Foo { public $attribut = 'hello'; pub...
Modèle objet de PHP5 : clonage <ul><li>Passage par référence PHP5 </li><ul><li>Clonage pour copier un objet </li></ul></ul...
Modèle objet de PHP5 : visibilités <ul><li>Visibilités compatibles </li><ul><li>Grande compatibilité pour faciliter les mi...
PHP5 introduit &quot;public&quot;, &quot;protected&quot;, &quot;private&quot; </li></ul></ul>class Foo { var $a; // ok, pa...
Modèle objet de PHP5 : casse <ul><li>Casse des méthodes, fonctions et classes </li><ul><li>En PHP, les classes et méthodes...
Mode de compatibilité modèle objet PHP5 <ul><li>Mode de compatibilité PHP4 </li><ul><li>PHP.ini : zend.ze1_compatibility_m...
Mis à zéro par défaut (comportement PHP5) </li></ul><li>Mettre cette directive à 1 permet d'utiliser le comportement objet...
Prochain SlideShare
Chargement dans…5
×

Migration PHP4-PHP5

4 915 vues

Publié le

Migration PHP4-PHP5

Publié dans : Technologie
1 commentaire
2 j’aime
Statistiques
Remarques
Aucun téléchargement
Vues
Nombre de vues
4 915
Sur SlideShare
0
Issues des intégrations
0
Intégrations
52
Actions
Partages
0
Téléchargements
0
Commentaires
1
J’aime
2
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive
  • Migration PHP4-PHP5

    1. 1. Migrer de PHP4 à PHP5 Analyse de code et revue des principaux changements
    2. 2. Qui parle ? <ul><li>Julien PAULI
    3. 3. Formateur - consultant Anaska Alter-Way </li><ul><li>Stand F30 </li></ul><li>Spécialiste PHP et ZendFramework
    4. 4. Membre AFUP
    5. 5. Auteur </li><ul><li>Zend Framework, bien développer en PHP </li></ul><li>Contributeur </li><ul><li>Zend Framework
    6. 6. PHP
    7. 7. Apache </li></ul></ul>
    8. 8. Evolution de PHP <ul><li>PHP4 est abandonné depuis le 08/08/08
    9. 9. PHP5 = PHP5.2.9 aujourd'hui, c'est important !
    10. 10. PHP5 est en évolution permanente
    11. 11. Demain PHP5.3 arrive, après demain PHP6
    12. 12. Voyons les grandes lignes techniques d'une migration </li></ul>
    13. 13. Plan <ul><li>PHP5 : un vrai modèle objet
    14. 14. Traitements XML améliorés
    15. 15. Utilisation de bases de données </li><ul><li>MySQL </li></ul><li>Changements dans les fonctions
    16. 16. Conclusion </li></ul>
    17. 17. Le modèle objet de PHP5 <ul><li>En PHP4, les objets ne sont que des tableaux masqués </li><ul><li>Le ZendEngine les traite comme tels
    18. 18. On utilise &quot; -> &quot; plutot que &quot; [ &quot; et &quot; ] &quot;
    19. 19. C'est tout ... </li></ul><li>En PHP5, les objets sont un vrai type </li><ul><li>Codés comme un type dans ZendEngine2
    20. 20. Permet beaucoup plus de chose que simplement utiliser &quot; -> &quot; </li></ul></ul>
    21. 21. Modèle objet de PHP5 : références <ul><li>Tous les objets agissent comme des références en PHP5 </li><ul><li>Ce ne sont pas des &quot;références&quot; PHP
    22. 22. Mais leur comportement est identique </li></ul></ul>class Foo { public function maFonction($arg1) { } } $a = new Foo; class Foo { function maFonction($arg1) { } } $a = &new Foo;
    23. 23. Modèle objet de PHP5 : références <ul><li>Passage par référence PHP5 </li></ul>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. 24. Modèle objet de PHP5 : clonage <ul><li>Passage par référence PHP5 </li><ul><li>Clonage pour copier un objet </li></ul></ul>$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. 25. Modèle objet de PHP5 : visibilités <ul><li>Visibilités compatibles </li><ul><li>Grande compatibilité pour faciliter les migrations
    26. 26. PHP5 introduit &quot;public&quot;, &quot;protected&quot;, &quot;private&quot; </li></ul></ul>class Foo { var $a; // ok, pas de problème, sera publique function bar(); // idem : sera publique } class Foo { var $a; function bar(); }
    27. 27. Modèle objet de PHP5 : casse <ul><li>Casse des méthodes, fonctions et classes </li><ul><li>En PHP, les classes et méthodes sont insensibles à la casse </li></ul><li>La casse est respectée en PHP5, elle ne l'était pas en PHP4 </li></ul>class Foo { function HeLLo() { } } class bAr extends Foo {} $a = new bar; echo get_class($a); // bAr print_r(get_class_methods($a)); // array (&quot;HeLLo&quot;); 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(&quot;hello&quot;); echo get_parent_class($a); // foo
    28. 28. Mode de compatibilité modèle objet PHP5 <ul><li>Mode de compatibilité PHP4 </li><ul><li>PHP.ini : zend.ze1_compatibility_mode
    29. 29. Mis à zéro par défaut (comportement PHP5) </li></ul><li>Mettre cette directive à 1 permet d'utiliser le comportement objet de PHP4 dans PHP5 </li><ul><li>Utile pour migrer, mais rapidement
    30. 30. Aucune application de production ne devrait tourner sous ce mode
    31. 31. Il n'est ni sûr, ni stable </li></ul></ul>
    32. 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. 33. Modèle objet de PHP5 en résumé <ul><li>Résumons </li></ul><?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. 34. Le rapport d'erreurs <ul><li>Nouveau rapport PHP5 : E_STRICT </li><ul><li>Affiche des erreurs principalement relatives à la conception logicielle
    35. 35. E_ALL n'inclut pas E_STRICT </li></ul></ul>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. 36. Le rapport d'erreurs <ul><li>PHP5 : E_RECOVERABLE_ERROR </li><ul><li>Erreur grave, mais n'ayant pas fait planté PHP en interne
    37. 37. L'erreur doit être attrapée par un gestionnaire utilisateur
    38. 38. Envoyée lors de problèmes de typage d'arguments </li></ul></ul>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. 39. Conclusions rapport d'erreurs en migration <ul><li>E_STRICT n'est pas activé par défaut </li><ul><li>La migration est plus simple
    40. 40. Mais les erreurs seront tout de même présentes </li></ul><li>E_STRICT facilite la migration </li><ul><li>Il vous prévient si vous utilisez des &quot;&&quot;' où il ne faut pas
    41. 41. Activez-le pour vous en rendre compte </li></ul></ul>// php.ini error_reporting = E_ALL | E_STRICT
    42. 42. Premières conclusions de migration <ul><li>Je ne suis pas obligé de renommer tous mes constructeurs en __construct() </li><ul><li>Un constructeur ayant le même nom que la classe fonctionne en PHP5 </li></ul><li>Je ne suis pas obligé de supprimer tous les appels au mot-clé &quot;var&quot; </li><ul><li>Il sera traduit en interne en &quot;public&quot; </li></ul><li>Je ne suis pas obligé de supprimer tous les &quot;&&quot; </li><ul><li>Ils génèrent une erreur E_STRICT qui par défaut est masquée
    43. 43. Je peux aussi utiliser temporairement le mode de compatibilité </li></ul></ul>
    44. 44. Support XML <ul><li>PHP4 possède un support XML </li><ul><li>Bancal
    45. 45. Pénible à utiliser
    46. 46. Peu étendu
    47. 47. Plus adapté aux développements d'aujourd'hui </li></ul><li>PHP5 casse la compatibilité </li><ul><li>DOM remplace DOMXML </li></ul><li>Conclusion : il faudra très probablement réécrire son code </li></ul>
    48. 48. Support MySQL <ul><li>Où est MySQL ?? </li><ul><li>Je ne vois plus MySQL !
    49. 49. MySQL a-t-il disparu de PHP5 ? </li></ul></ul>
    50. 50. Support MySQL <ul><li>MySQL est toujours supporté ;-)
    51. 51. LibMySQL n'est plus fournie dans la distrib par défaut </li><ul><li>Vous devez compiler avec --with-mysql à la main
    52. 52. Sous Windows -> activer la/les dll nécessaires à la main </li></ul><li>Cessez d'utiliser ext/MySQL ! </li><ul><li>Ces fonctions existent toujours, pour des raisons de migration
    53. 53. Mais dès que possible, abandonnez-les et passez à MySQLi ou PDO </li></ul><li>ext/MySQLi : extension MySQL &quot;i&quot;mproved
    54. 54. PDO & PDO_MySQL </li><ul><li>PHP Data Object </li></ul></ul>
    55. 55. MySQLi <ul><li>Fonctions terminées par &quot;i&quot; </li><ul><li>mysqli_query() mysqli_connect() ...
    56. 56. Grande compatibilité avec ext/MySQL </li></ul><li>Nouvelles fonctionnalités
    57. 57. Stabilité accrue
    58. 58. Performances
    59. 59. Orientation objet possible mais pas obligatoire
    60. 60. Voyons un peu les différences ext/MySQL <-> ext/MySQLi </li></ul>
    61. 61. Support MySQL de PHP : ext/MySQL <ul><li>Exemple avec ext/Mysql </li><ul><li>(Très) vieillissant, mais fonctionne toujours sous PHP5
    62. 62. La connexion est implicite, les fonctions réutilisent la dernière </li></ul></ul>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. 63. Support MySQL de PHP : ext/MySQLi <ul><li>Même exemple avec ext/Mysqli </li><ul><li>Code procédural
    64. 64. La connexion n'est pas implicite, il faut la préciser aux fonctions </li><ul><li>C'est plus logique tout de même </li></ul><li>Certaines fonctions inversent des params. par rapport à ext/Mysql </li></ul></ul>$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. 65. Support MySQL de PHP <ul><li>Comparons </li></ul>$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. 66. Conclusions MySQL migration vers PHP5 <ul><li>L'extension ext/MySQL existe toujours </li><ul><li>Migration facile et souple </li></ul><li>Il faudra songer à passer à MySQLi (ou PDO) </li><ul><li>MySQLi a une API très semblable à celle de MySQL
    67. 67. Attention tout de même aux &quot;arguments inversés&quot; </li></ul><li>Et puis MySQLi c'est aussi ... </li><ul><li>Requêtes préparées
    68. 68. Transactions
    69. 69. Connexions persistantes (PHP 5.3)
    70. 70. Requêtes multiples
    71. 71. API de gestion des serveurs MySQL (démarrage, réplication ...) </li></ul></ul>
    72. 72. Changement de comportement de fonctions <ul><li>Pour des raisons de performance, ou simplement de logique, le comportement de certaines fonctions PHP a changé de PHP4 à PHP5 </li><ul><li>array_merge()
    73. 73. ip2long()
    74. 74. strrpos()
    75. 75. strripos()
    76. 76. strtotime() </li></ul></ul>
    77. 77. Changement de comportement de fonctions <ul><li>array_merge() </li><ul><li>PHP4 autorisait des paramètres de type non tableau, pas PHP5 </li></ul><li>Ip2long() </li><ul><li>PHP4 retourne -1 sur des adresses invalides, PHP5 retourne false </li></ul><li>Strrpos() </li><ul><li>PHP4 ne prend que le premier caractère, PHP5 cherche tout </li></ul></ul>$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. 78. Conclusion <ul><li>Passer de PHP4 à PHP5 c'est souvent faire le ménage
    79. 79. PHP5 incarne l'actualité
    80. 80. Migrer de PHP4 à PHP5 c'est ... </li><ul><li>Pouvoir designer ses applications avec UML
    81. 81. Bénéficier d'un langage (beaucoup) plus performant et plus sécurisé
    82. 82. Ecrire moins de lignes de code pour en faire plus
    83. 83. Industrialiser ses projets </li></ul></ul>
    84. 84. Conclusion (finale...) <ul><li>PHP est le seul langage au monde porté sur le Web
    85. 85. Le Web évolue à chaque seconde qui passe
    86. 86. PHP5 est sorti en 2004
    87. 87. PHP est libre et développé par une grande communauté </li></ul>

    ×