Le typage se propage à tout PHP : la 7.4 l’ajoute aux propriétés, après les arguments et les valeurs de retours. Bien qu’opposé aux choix initiaux de typage faible de PHP, le typage augmente significativement la cohérence du code, son niveau d’auto-validation et les possibilités de dépendances inextricables. Le typage contribue à aider les outils d’introspection, à débuguer le code au plus tôt, et à adopter des techniques de développement comme le motif de l’objet null. C’est un outil supplémentaire, pratique pour les grands projets, et facilement déployé.
https://event.afup.org/afup-day-2020/afup-day-2020-tours/programme/#3246
5. RÉVISIONS
• Types scalaires
• Classes et interfaces
<?php
use FrameworkAccountsSociete as A;
class Foo {
function bar(string $s,
Usager $u) : A {
// Code
}
}
?>
6. RÉVISIONS
• PHP 7.4 : propriétés
• Variables
• Annotations
<?php
class Foo {
private User $user;
function bar(){
/** @var Account $a */
$a = new Account();
}
}
?>
8. CAS DE RIEN DUTOUT
• Void pour les valeurs de retour
• Attention, void est rien, mais pas le même rien que null…
• Pas de typeVOID pour les arguments
• Laisser vide
• PHP 8.0 : type null, (synonyme de ?)
• Les classes NullPattern sont de retour!
9. CLASSE NULL PATTERN
• Remplacement de NULL
• Avec la syntaxe objet
• Utilise la même interface
• Implemente toutes les méthodes
• Ne fait rien, retourne un élément neutre ('', 0, [], …)
• Mute en Exception Pattern à des fins de developement
20. SELF CONSISTENCE
• Ne pas
repousser les
vérifications
<?php
function bar($cmd) : string {
return shell_exec($cmd) ?? '';
}
?>
21. DÉBUGAGE
• Emet une Fatal Error
• Assure le type de
données à un point du
code
• A retirer en production
• strict_types = 1
<?php
foo("a");
foo(1);
foo(new x);
foo(array());
function foo(string $s) {
echo $s;
}
class x {
function __toString()
{ return "a"; }
}
?>
Fatal error: Uncaught TypeError: Argument 1 passed to foo()
must be of the type string, array given
22. ADOPTION DESTYPES FORTS
• Défi : passer de quelques uns à presque tous
• Grosse tâche : 11000 cas à traiter en moyenne
• L'analyse statique aide considérablement
• Rapport de typage Exakat
• Psalm detecte automatiquement les types
23. DETECTION AUTOMATIQUE
• Cas d'usage
<?php
function bar($b) {
return array_fill(0, $b, 'c');
}
foo(array());
function foo($a) {
return 1 + CONSTANT;
}
?>
24. DETECTION AUTOMATIQUE
• Cas ambigus
<?php
function foo($b) {
return array_fill(0, 10, $b);
}
function bar($a) {
return shell_exec($a);
}
?>
26. PLUS DIFFICILE
• Utilisation de func_get_args()
• Cas des variadic
<?php
declare(strict_types = 1);
function foo(string ...$a) { }
foo('a', 'b', 'c', 'd');
foo('a', 'b', 'c', 'd', 2);
?>
27. PLUS DIFFICILE
• array()
• Pas de génériques
• Attributs et annotations
<?php
declare(strict_types = 1);
function foo(array $a) { }
foo(['a', 'b', 'c', 'd' ]);
foo(['a', 'b', 'c', null, 2]);
?>
28. ENCORE PLUS DUR
• __get()
• __set()
• Possible
• une seule
fois
<?php
declare(strict_types = 1);
class x {
function __set($name, $a) : array {
return array();
}
}
$x = (new x);
$x->c = 3;
?>
55. UNE MÉTHODE :
UN GROUPE DETYPES
}
C1
MC1()__construct()
C2
MC2()__construct()
C3
MC3()__construct() MC4()
56. TYPAGE FORT EN PHP
• Meilleure maitrise du code
• Pratique pour les grandes applications, et les
applications historiques
• Impact significatif sur l'architecture du code
• Encore des innovations à venir (PHP 8.x)
57. OUTILS D'ANALYSE STATIQUE
• Static analysis
• Exakat
• Suggestions et vérifications de types
• Psalm
• PHPStan
58. SE PRÉPARER
• Faites vous aider par exakat ou un outil d'analyse statique
• Éviter func_get_args() et compagnie
• Types multiples dans une méthode (is_*)
• Attention à __get()/__set()
• Surveillez les méthodes souvent surchargées
• Eviter nullable, passer aux objets NullPattern
• Eviter les cycles de types