SlideShare ist ein Scribd-Unternehmen logo
1 von 59
Downloaden Sie, um offline zu lesen
LE MEILLEUR DU
TYPAGE FORT
La loi du plus fort
AGENDA
• Revue du typage en PHP
• Vue de l'intérieur des
méthodes
• Approche systémique
INTERVENANT
• Damien Seguy
• Directeur technique
@exakat
• Analyse statique
• Maison de retraite pour
elePHPants
TYPAGE EN PHP
RÉVISIONS
• Types scalaires
• Classes et interfaces
<?php
use FrameworkAccountsSociete as A;
class Foo {
   function bar(string $s, 
                Usager $u) : A {
     // Code
  }
}
?>
RÉVISIONS
• PHP 7.4 : propriétés
• Variables
• Annotations
<?php 
class Foo { 
   private User $user;
   function bar(){ 
     /** @var Account $a */
     $a = new Account();
  } 
} 
?>
RÉVISIONS
• bool, int, float, string, object
• iterable, callable, stringable (php 8.0)
• Interfaces et classes
• self, parent; static (php 8.0)
• array, void, ? - null, false
• mixed, resource, numeric (réservés)
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!
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
SITUATION ACTUELLE
7 %
93 %
Avec typehint Sans Typehint
COUVERTURE DES PROJETS
0
25
50
75
100
QUELSTYPES?
0 %
17,5 %
35 %
52,5 %
70 %
object iterable callable int bool void string array scalar Classes
VUE DE LA MÉTHODE
• Meilleure validation
• Aux frontières de l'empire
• Cas limite
fonction ($args) : string
MEILLEUREVALIDATION
• is_array()
• is_int()
• === null
• (int), (string)…
<?php 
function bar($integer) { 
if (!is_int($integer)) {
     throw new TypeError();
   }
return $integer * 2;
}
function bar(int $integer) { 
return $integer * 2;
}
?>
MOINS DEVALIDATION
• is_a()
• is_subclass_of()
• instanceof
• === null
<?php  
function bar($user) {  
  if ($user === null) {
     throw new TypeError(); 
  }
  
  if (!$user instanceof User)) { 
     throw new TypeError(); 
  } 
   return $user->validate(); 
} 
?>
MOINS DEVALIDATION
• is_a()
• is_subclass_of()
• instanceof
• === null
<?php  
function bar(Usager $user) {  
   return $user->validate(); 
} 
?>
COHÉRENCE
• Syndrome strpos()
• Retours mono-
types
• Circuit de gestion
des erreurs
<?php  
function bar($user) {  
  if ($user === null) {
     return false;
  } else {
     return $user->age();
}
} 
?>
COHÉRENCE
• Syndrome strpos()
• Retours mono-
types
• Circuit de gestion
des erreurs
<?php  
function bar($user) : int {  
  if ($user === null) {
     throw new TypeError();
  } else {
     return $user->age();
}
} 
?>
COHÉRENCE
• Ne pas
repousser les
vérifications
<?php  
function bar($cmd) {  
     return shell_exec($cmd);
} 
?>
SELF CONSISTENCE
• Ne pas
repousser les
vérifications
<?php  
function bar($cmd) : string {  
     return shell_exec($cmd) ?? '';
} 
?>
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
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
DETECTION AUTOMATIQUE
• Cas d'usage
<?php 
  function bar($b) {
    return array_fill(0, $b, 'c');
  }
foo(array());
function foo($a) {
    return 1 + CONSTANT;
  }
?>
DETECTION AUTOMATIQUE
• Cas ambigus
<?php 
  function foo($b) {
    return array_fill(0, 10, $b);
  }
  function bar($a) {
    return shell_exec($a);
  }
?>
EVOLUTIONS D'UNTYPE
aucun
type
types
scalaires
types
classes
types
interfaces
non-null
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);
?>
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]);
?>
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;
?>
TYPES MULTIPLES
• catch(
Exception |
TypeError $e)
<?php    
function foo($arg) {
  if (is_int($arg)) {
    return $arg + 1;
  } else {
    return $arg->getId();
  }
}
?>
UNIONS DETYPES (PHP 8.0)
<?php     
function foo(int|User|null $arg) { 
  if (is_int($arg)) { 
    return $arg + 1; 
  } elseif ($arg instanceof User) { 
    return $arg->getId(); 
  } else { 
    return NULL; 
  } 
} 
?>
INTERFACES, PAS CLASSES
<?php    
class C {} 
function foo(C $arg) { }
?>
INTERFACES, PAS CLASSES
<?php    
interface I {}
class C  extends I {} 
class C2  extends I {} 
interface I2 extends I {}
function foo(I $arg) { }
?>
INTERFACES INSUFFISANTES
<?php    
interface I {
   function foo() ;
}
class C extends I { /**/ } 
function foo(I $arg) { 
   $arg->foo($arg->p);
}
?>
CLASSES, PAS INTERFACES
<?php    
abstract class C { /**/ } 
function foo(C $arg) { 
   $arg->foo($arg->p);
}
?>
APPROCHE SYSTÉMIQUE
• Structuration du code
• Délégation de responsabilités
f ($a) : s
f ($a) : s
f ($a) : s
f ($a) : s
f ($a) : s
f ($a) : s
INTERACTIONS DE
FONCTIONS
<?php    
function M2($a) { 
$r = quelquechose();
    return $r;
}
?>
M1() M2() M3()
$a
$r
INTERACTIONS DE
FONCTIONS
<?php    
$m1 = M1();
$m2 = M2($m1);
$m3 = M3($m2);
echo $m3;
?>
M1() M2() M3()
INTERACTIONS DE
FONCTIONS
• Enchainement de fonctions
Relation 'dépend de'
M1() M2() M3()
INTERACTIONS DE
FONCTIONS (2)
M1() M2() M3()
INTERACTIONS DE
FONCTIONS (2)
• Conteneur, classe de configuration, bootstrap
M1()
M2() M3()
INTERACTIONS DE
FONCTIONS (3)
M1() M2() M3()
INTERACTIONS DE
FONCTIONS (3)
• Null Pattern
• Attentions aux cycles
de typages
M3()
M1()
M2()
INTERACTIONS DE
FONCTIONS (4)
• Typage impossible
M1() M2() M3()
INTERACTIONS DE
FONCTIONS (4)
M1() M2() M3()
INTERACTIONS DE
FONCTIONS (4)
• Boucles de typage
M1() M2() M3()
CAS RÉELS
• Avec des classes
• Grands nombres de classes
TYPAGE ET CLASSES
C1
M1()__construct()
FOSSILISATION
C2 extends C1
C1
M1()
M1()
• Signature de méthodes
• Nombre d'arguments
• Type
• Valeur par défaut
• Visibilité
FOSSILISATION
• Modifier C3
• Modifier C1
• Modifier C2, C4
• Modifier C5
• Modifier C6
• …
C2
C1
C3 C4
C5
C6
extends
extends
ORDRE DE CLASSES
C1
M1()__construct()
ORDRE DE CLASSES
C1
M1()
ORDRE DE CLASSES
• Tri topologique
des classes
C5C1
C3
C2
C1
M1()__construct()
ORDRE DE CLASSES
ORDRE DE CLASSES
UNE MÉTHODE :
UN GROUPE DETYPES
}
C1
MC1()__construct()
C2
MC2()__construct()
C3
MC3()__construct() MC4()
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)
OUTILS D'ANALYSE STATIQUE
• Static analysis
• Exakat
• Suggestions et vérifications de types
• Psalm
• PHPStan
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
MERCI!
https://www.exakat.io/ - @exakat -
https://joind.in/talk/094e8

Weitere ähnliche Inhalte

Was ist angesagt?

ALF 3 - Expressions régulières et Lexer
ALF 3 - Expressions régulières et Lexer ALF 3 - Expressions régulières et Lexer
ALF 3 - Expressions régulières et Lexer Alexandru Radovici
 
Tour d’horizon de scala
Tour d’horizon de scalaTour d’horizon de scala
Tour d’horizon de scalaBenoit Wilcox
 
Javascript pour les Développeurs WEB
Javascript pour les Développeurs WEBJavascript pour les Développeurs WEB
Javascript pour les Développeurs WEBAbbes Rharrab
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Loic Yon
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieurFredy Fadel
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelleJean Detoeuf
 
Presentation Csharp et winforms
Presentation Csharp et winformsPresentation Csharp et winforms
Presentation Csharp et winformsChristophe Zome
 
Csharp1 : quelques elements de base
Csharp1 :  quelques elements de baseCsharp1 :  quelques elements de base
Csharp1 : quelques elements de baseAbdoulaye Dieng
 
Les fondamentaux du langage C
Les fondamentaux du langage CLes fondamentaux du langage C
Les fondamentaux du langage CAbdoulaye Dieng
 
cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++Abdoulaye Dieng
 

Was ist angesagt? (20)

ALF 3 - Expressions régulières et Lexer
ALF 3 - Expressions régulières et Lexer ALF 3 - Expressions régulières et Lexer
ALF 3 - Expressions régulières et Lexer
 
Tour d’horizon de scala
Tour d’horizon de scalaTour d’horizon de scala
Tour d’horizon de scala
 
ALF 11 - WebAssembly
ALF 11 - WebAssemblyALF 11 - WebAssembly
ALF 11 - WebAssembly
 
ALF 2 - Automates Fini (2018)
ALF 2 - Automates Fini (2018)ALF 2 - Automates Fini (2018)
ALF 2 - Automates Fini (2018)
 
Javascript pour les Développeurs WEB
Javascript pour les Développeurs WEBJavascript pour les Développeurs WEB
Javascript pour les Développeurs WEB
 
ALF 8 - Generation du code
ALF 8 - Generation du codeALF 8 - Generation du code
ALF 8 - Generation du code
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieur
 
ALF 4 - Grammaires
ALF 4 - GrammairesALF 4 - Grammaires
ALF 4 - Grammaires
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelle
 
ALF 6 - Parser
ALF 6 - ParserALF 6 - Parser
ALF 6 - Parser
 
ALF 8 - Generation de code
ALF 8 - Generation de codeALF 8 - Generation de code
ALF 8 - Generation de code
 
ALF 6 - Parser Bottom-Up
ALF 6 - Parser Bottom-UpALF 6 - Parser Bottom-Up
ALF 6 - Parser Bottom-Up
 
Presentation Csharp et winforms
Presentation Csharp et winformsPresentation Csharp et winforms
Presentation Csharp et winforms
 
Cours tp2
Cours tp2Cours tp2
Cours tp2
 
Csharp1 : quelques elements de base
Csharp1 :  quelques elements de baseCsharp1 :  quelques elements de base
Csharp1 : quelques elements de base
 
Les fondamentaux du langage C
Les fondamentaux du langage CLes fondamentaux du langage C
Les fondamentaux du langage C
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++
 
ALF 6 - Parser Bottom-Up
ALF 6 - Parser Bottom-UpALF 6 - Parser Bottom-Up
ALF 6 - Parser Bottom-Up
 

Ähnlich wie Meilleur du typage fort (AFUP Day, 2020)

Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5halleck45
 
Cours php & Mysql - 2éme partie
Cours php & Mysql - 2éme partieCours php & Mysql - 2éme partie
Cours php & Mysql - 2éme partiekadzaki
 
Eric Moreau: AOP in .Net sing PostSharp
Eric Moreau: AOP in .Net sing PostSharpEric Moreau: AOP in .Net sing PostSharp
Eric Moreau: AOP in .Net sing PostSharpMSDEVMTL
 
La référence Clear php
La référence Clear phpLa référence Clear php
La référence Clear phpDamien Seguy
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLDamien Seguy
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Dr Samir A. ROUABHI
 
Eléments du langage Java.pdf
Eléments du langage  Java.pdfEléments du langage  Java.pdf
Eléments du langage Java.pdfAabidiHafid
 
Developpement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdfDeveloppement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdfrachidimstapha
 
Scala : programmation fonctionnelle
Scala : programmation fonctionnelleScala : programmation fonctionnelle
Scala : programmation fonctionnelleMICHRAFY MUSTAFA
 
1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdf1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdfImaneZoubir1
 
PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3Eddy RICHARD
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Jean-Michel Doudoux
 
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Tarik Zakaria Benmerar
 
Développement Web- PHP (partie I).pdf
Développement Web- PHP (partie I).pdfDéveloppement Web- PHP (partie I).pdf
Développement Web- PHP (partie I).pdfYasushiTsubakik
 

Ähnlich wie Meilleur du typage fort (AFUP Day, 2020) (20)

Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5
 
Cours php & Mysql - 2éme partie
Cours php & Mysql - 2éme partieCours php & Mysql - 2éme partie
Cours php & Mysql - 2éme partie
 
C# 7 - Nouveautés
C# 7 - NouveautésC# 7 - Nouveautés
C# 7 - Nouveautés
 
Eric Moreau: AOP in .Net sing PostSharp
Eric Moreau: AOP in .Net sing PostSharpEric Moreau: AOP in .Net sing PostSharp
Eric Moreau: AOP in .Net sing PostSharp
 
La première partie de la présentation PHP
La première partie de la présentation PHPLa première partie de la présentation PHP
La première partie de la présentation PHP
 
Audits php
Audits phpAudits php
Audits php
 
La référence Clear php
La référence Clear phpLa référence Clear php
La référence Clear php
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQL
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
La programmation fonctionnelle en javascript / PF
La programmation fonctionnelle en javascript / PFLa programmation fonctionnelle en javascript / PF
La programmation fonctionnelle en javascript / PF
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
Eléments du langage Java.pdf
Eléments du langage  Java.pdfEléments du langage  Java.pdf
Eléments du langage Java.pdf
 
Developpement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdfDeveloppement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdf
 
Scala : programmation fonctionnelle
Scala : programmation fonctionnelleScala : programmation fonctionnelle
Scala : programmation fonctionnelle
 
1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdf1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdf
 
PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
 
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
 
Développement Web- PHP (partie I).pdf
Développement Web- PHP (partie I).pdfDéveloppement Web- PHP (partie I).pdf
Développement Web- PHP (partie I).pdf
 
C++ 11/14
C++ 11/14C++ 11/14
C++ 11/14
 

Mehr von Damien Seguy

Strong typing @ php leeds
Strong typing  @ php leedsStrong typing  @ php leeds
Strong typing @ php leedsDamien Seguy
 
Strong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisationStrong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisationDamien Seguy
 
Qui a laissé son mot de passe dans le code
Qui a laissé son mot de passe dans le codeQui a laissé son mot de passe dans le code
Qui a laissé son mot de passe dans le codeDamien Seguy
 
Analyse statique et applications
Analyse statique et applicationsAnalyse statique et applications
Analyse statique et applicationsDamien Seguy
 
Top 10 pieges php afup limoges
Top 10 pieges php   afup limogesTop 10 pieges php   afup limoges
Top 10 pieges php afup limogesDamien Seguy
 
Top 10 php classic traps DPC 2020
Top 10 php classic traps DPC 2020Top 10 php classic traps DPC 2020
Top 10 php classic traps DPC 2020Damien Seguy
 
Top 10 php classic traps confoo
Top 10 php classic traps confooTop 10 php classic traps confoo
Top 10 php classic traps confooDamien Seguy
 
Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Damien Seguy
 
Top 10 php classic traps php serbia
Top 10 php classic traps php serbiaTop 10 php classic traps php serbia
Top 10 php classic traps php serbiaDamien Seguy
 
Top 10 php classic traps
Top 10 php classic trapsTop 10 php classic traps
Top 10 php classic trapsDamien Seguy
 
Top 10 chausse trappes
Top 10 chausse trappesTop 10 chausse trappes
Top 10 chausse trappesDamien Seguy
 
Code review workshop
Code review workshopCode review workshop
Code review workshopDamien Seguy
 
Understanding static analysis php amsterdam 2018
Understanding static analysis   php amsterdam 2018Understanding static analysis   php amsterdam 2018
Understanding static analysis php amsterdam 2018Damien Seguy
 
Review unknown code with static analysis php ce 2018
Review unknown code with static analysis   php ce 2018Review unknown code with static analysis   php ce 2018
Review unknown code with static analysis php ce 2018Damien Seguy
 
Everything new with PHP 7.3
Everything new with PHP 7.3Everything new with PHP 7.3
Everything new with PHP 7.3Damien Seguy
 
Php 7.3 et ses RFC (AFUP Toulouse)
Php 7.3 et ses RFC  (AFUP Toulouse)Php 7.3 et ses RFC  (AFUP Toulouse)
Php 7.3 et ses RFC (AFUP Toulouse)Damien Seguy
 
Tout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCTout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCDamien Seguy
 
Review unknown code with static analysis php ipc 2018
Review unknown code with static analysis   php ipc 2018Review unknown code with static analysis   php ipc 2018
Review unknown code with static analysis php ipc 2018Damien Seguy
 
Code review for busy people
Code review for busy peopleCode review for busy people
Code review for busy peopleDamien Seguy
 
Static analysis saved my code tonight
Static analysis saved my code tonightStatic analysis saved my code tonight
Static analysis saved my code tonightDamien Seguy
 

Mehr von Damien Seguy (20)

Strong typing @ php leeds
Strong typing  @ php leedsStrong typing  @ php leeds
Strong typing @ php leeds
 
Strong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisationStrong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisation
 
Qui a laissé son mot de passe dans le code
Qui a laissé son mot de passe dans le codeQui a laissé son mot de passe dans le code
Qui a laissé son mot de passe dans le code
 
Analyse statique et applications
Analyse statique et applicationsAnalyse statique et applications
Analyse statique et applications
 
Top 10 pieges php afup limoges
Top 10 pieges php   afup limogesTop 10 pieges php   afup limoges
Top 10 pieges php afup limoges
 
Top 10 php classic traps DPC 2020
Top 10 php classic traps DPC 2020Top 10 php classic traps DPC 2020
Top 10 php classic traps DPC 2020
 
Top 10 php classic traps confoo
Top 10 php classic traps confooTop 10 php classic traps confoo
Top 10 php classic traps confoo
 
Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4
 
Top 10 php classic traps php serbia
Top 10 php classic traps php serbiaTop 10 php classic traps php serbia
Top 10 php classic traps php serbia
 
Top 10 php classic traps
Top 10 php classic trapsTop 10 php classic traps
Top 10 php classic traps
 
Top 10 chausse trappes
Top 10 chausse trappesTop 10 chausse trappes
Top 10 chausse trappes
 
Code review workshop
Code review workshopCode review workshop
Code review workshop
 
Understanding static analysis php amsterdam 2018
Understanding static analysis   php amsterdam 2018Understanding static analysis   php amsterdam 2018
Understanding static analysis php amsterdam 2018
 
Review unknown code with static analysis php ce 2018
Review unknown code with static analysis   php ce 2018Review unknown code with static analysis   php ce 2018
Review unknown code with static analysis php ce 2018
 
Everything new with PHP 7.3
Everything new with PHP 7.3Everything new with PHP 7.3
Everything new with PHP 7.3
 
Php 7.3 et ses RFC (AFUP Toulouse)
Php 7.3 et ses RFC  (AFUP Toulouse)Php 7.3 et ses RFC  (AFUP Toulouse)
Php 7.3 et ses RFC (AFUP Toulouse)
 
Tout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCTout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFC
 
Review unknown code with static analysis php ipc 2018
Review unknown code with static analysis   php ipc 2018Review unknown code with static analysis   php ipc 2018
Review unknown code with static analysis php ipc 2018
 
Code review for busy people
Code review for busy peopleCode review for busy people
Code review for busy people
 
Static analysis saved my code tonight
Static analysis saved my code tonightStatic analysis saved my code tonight
Static analysis saved my code tonight
 

Meilleur du typage fort (AFUP Day, 2020)