SlideShare une entreprise Scribd logo
1  sur  43
Télécharger pour lire hors ligne
TOUT POUR
SE PRÉPARER
À PHP 7.4
Avec la participation de
PaulVerlaine
PROGRAMME
• Incompatibilités
• Nouveautés
• Divers
QUI PARLE?
• Damien Seguy
• CTO @exakat
• Analyse statique PHP
• Maison de retraite à éléphpants
• Record mondial du nombre
d'antennes AFUP visitées
AGENDA
• PHP 7.4.0 RC4
• PHP 7.4.0 RC5 : 31 octobre 2019
• Compilez PHP
• https://github.com/php/php-src
• https://bugs.php.net/
• Compilez votre code : php -l
• php paralell lint
28
nov
2019
INCOMPATIBILITÉS
TERNAIRES IMBRIQUÉS
<?php
1 ? 2 :  3 ?  4 : 5;  // 
(1 ? 2 : 3) ? 4 : 5;  // ok
1 ? 2 : (3 ?  4 : 5); // ok
1 ? 2 ?  3 :  4 : 5;  // ok
?>
EXIT LES SHORTTAG
<?
phpinfo();
?><?php
<?
phpinfo();
?><?php
• Les balises de fin de document changent
PRÉSÉANCE + ET .
<?php
echo 'Nous étions le '. date('d') - 7  . ' mars';
echo 'Nous étions le '. (date('d') - 7) . ' mars';
?>
• Valable aussi pour << >>
• *, **, % sont inchangés
ACCÈSTABLEAUX ACCOLADES
<?php 
$string = 'abc'; 
echo $string[1]; 
echo $string{2}; 
?>
PHP Deprecated: Array and string offset access syntax with curly
braces is deprecated
ACCÈSTABLEAU AUX SCALAIRES
<?php
$integer = 1;
echo $integer[1];
$string = 'abc';
echo $string[1];
?>
PHP Notice: Trying to access array offset on value of type int
PLUS DE REAL
<?php 
$string = '1.2'; 
$real  = (real)  $string;
$float  = (float) $string;
?>
• Uniquement du float
• is_real() et (real)
PHP Deprecated: The (real) cast is deprecated, use (float) instead
ARRAY_KEY_EXISTS()
Deprecated: array_key_exists(): Using array_key_exists() on objects
is deprecated. Use isset() or property_exists() instead
<?php 
$objet = new stdclass;
$objet->p = 1;
var_dump(array_key_exists('p', $objet));
?>
• array_key_exists() a été accéléré
MODERNISATIONS
SÉPARATEUR NUMÉRIQUE
<?php
6.674_083e-11;  // float
22_99_79_24_58;   // decimal
0xCAFE_F00D;    // hexadecimal
0B0101_1111;    // binaire
?>
SÉPARATEUR NUMÉRIQUE
<?php
const _21_ = 22;
echo  _21_;
?>
PROPRIÉTÉSTYPÉES
<?php
class User {
    public int $id;
    public string $name;
public Stdclass $x;
}
?>
PROPRIÉTÉSTYPÉES
<?php 
class User { 
    public Stdclass $x;
    
    function foo() {
        $this->x = new Stdclass;
    }
} 
$a = new User;
$a->foo();
var_dump($a->x);
?>
Fatal error: Uncaught Error: Typed property User::$x must not be
accessed before initialization
OPÉRATEUR … POUR ARRAY
<?php
$parts = ['PHP', 'elephpant', ];
$afup  = ['forum', 'antennes', ...$parts, 'génial'];
// ['PHP', 'elephpant', 'forum', 'antennes', 'génial'
?>
• Ne marche pas avec des hash
FONCTIONS FLÈCHÉES
<?php
$puissance = 2;
$valeurs = [1, 2, 3, 4];
$carres = array_map(
fn($n) => $n ** $puissance, 
$valeurs
);
// $carres = array(1, 4, 9, 16);
?>
FONCTIONS FLÈCHÉES
<?php
$puissance = 2;
$valeurs = [1, 2, 3, 4];
$closure = function (&$n, $k) use ($puissance) {
   $n = $n ** $puissance;
};
array_map($valeurs, $closure);
?>
CONTRAVARIANT
COVARIANT
<?php  
// class/interface b extends a {}
class c1 { 
    function foo(b $arg) : a {} 
} 
class c2 extends c1 { 
    function foo(b $arg) : a {} 
} 
CONTRAVARIANT
COVARIANT
<?php   
// class/interface b extends a {}
class c1 {  
    function foo(a $arg) : b {}  
}  
class c2 extends c1 {  
    function foo(b $arg) : a {}  
} 
Fatal error: Declaration of b::foo(a2 $arg): b1 must be compatible with a::foo(b1
$arg): a2 in test.php on line 10
<?php 
// class/interface b extends a {}
class c1 {
    function foo(b $arg) : a {}
}
class c2 extends c1 {
    function foo(a $arg) : b {}
}
CONTRAVARIANT
COVARIANT
CONTRAVARIANT
COVARIANT
1.Toutes les définitions le même fichier
2.L'autoload est obligatoire
• Moins de vérifications avec le lint
PHP Fatal error: Could not check compatibility between
UserFactory::make(object $arg): User and Factory::make(User $arg):
object, because class User is not available
??=
<?php
$res = shell_exec($cmd) ?? '';
function foo($arg) {
  $arg = $arg ?? '';
  $arg ??= '';
}
foo($arg);
bar($arg ?? '');
?>
ARRAY_MERGE()
<?php
$rows = [[1,2,3], [4,5,6]];
$list = array_merge(...$rows);
$rows = [];
$list = array_merge(...$rows);
?>
RÉFÉRENCES FAIBLES
<?php
$obj = new stdClass;
$weakref = WeakReference::create($obj);
var_dump($weakref->get());
unset($obj);
var_dump($weakref->get());
?>
RÉFÉRENCES FAIBLES
• PHP conserve tous les objets qui sont référencés
en mémoire
• Valable en cas d'utilisation du GC
CachePHP DB
STRIP_TAGS()
<?php
$string = '<a><b><c>';
echo strip_tags($string, '<a><b>');
echo strip_tags($string, ['<a>', '<b>']);
?>
PROC_OPEN()
<?php
proc_open(['php', '-r', 
'echo "Hello Worldn";'], 
$descriptors, $pipes);
shell_exec("php -r " .
escapeshellargs('echo "Hello Worldn";'));
?>
PREG_UNMATCHED_AS_NULL
<?php
preg_match('/(a)(b)?/', 'abc', $r);
/*
Array
(
    [0] => ab
    [1] => a
    [2] => b
)
*/
PREG_UNMATCHED_AS_NULL
<?php
preg_match('/(a)(b)?/', 'amc', $r);
/*
Array
(
    [0] => a
    [1] => a
)
*/
PREG_UNMATCHED_AS_NULL
<?php
preg_match('/(a)(b)?/', 'amc', $r,
PREG_UNMATCHED_AS_NULL);
/*
Array
(
    [0] => a
    [1] => a
    [2] => NULL
)
*/
SERIALISATION NOUVELLE
• __sleep()/__wake()
• Serializable interface
• __serialize() / __unserialize()
• Gère les classes parent
• Plus simple à déserialiser
SERIALISATION NOUVELLE
class B extends A {
    private $prop_b;
    public function __serialize(): array {
        return [
            "prop_b" => $this->prop_b,
            "parent_data" => parent::__serialize(),
        ];
    }
    public function __unserialize(array $data) {
        parent::__unserialize($data["parent_data"]);
        $this->prop_b = $data["prop_b"];
    }
}
DIVERS
PRELOADING
app.php framework.php
Autoload
Output
app.phpwork.php Output
<?php
// create FFI object, loading libc and

// exporting function printf()
$ffi = FFI::cdef(
    "int printf(const char *format, ...);", 

// this is a regular C declaration
    "libc.so.6");
// call C's printf()
$ffi->printf("Hello %s!n", "world");
?>
FOREIGN FUNCTION INTERFACE
• ffi.enable = false
• ext/wddx se retire
• ext/hash s'impose
• PEAR est définitivement mort
• money_format() se retire
• Les classes sans parent ne compile plus parent::
MOINS D'ERREURS
0
125
250
375
500
PHP 5.0 PHP 5.1 PHP 5.2 PHP 5.3 PHP 5.4 PHP 5.5 PHP 5.6 PHP 7.0 PHP 7.1 PHP 7.2 PHP 7.3 PHP 7.4 PHP 8.0
Message d’erreur distinct
PERFORMANCES
• Gain de performances
• 1 à 5 % par rapport à PHP 7.3
• Potentiel de gain avec ext/FFI
• Potentiel de pertes avec les propriétés typées
• Ne pas les utiliser est plus lent!!
AIDE À LA MIGRATION
• Exakat
• Rapports 7.x
• Suggestions
• PHPCompatibility
• PHP CS
BON PHP 7.4!
@exakat

Contenu connexe

Tendances

AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPjulien pauli
 
Outils pour développeur·se Android
Outils pour développeur·se Android Outils pour développeur·se Android
Outils pour développeur·se Android Macha DA COSTA
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsHugo Hamon
 
SonarQube Manuel Automatisation d'analyse ANT JENKINS/Hudson
SonarQube Manuel Automatisation d'analyse ANT JENKINS/HudsonSonarQube Manuel Automatisation d'analyse ANT JENKINS/Hudson
SonarQube Manuel Automatisation d'analyse ANT JENKINS/Hudsonxmacina
 
JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924Gregory Boissinot
 

Tendances (7)

AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHP
 
Jenkins Workflow
Jenkins WorkflowJenkins Workflow
Jenkins Workflow
 
Outils pour développeur·se Android
Outils pour développeur·se Android Outils pour développeur·se Android
Outils pour développeur·se Android
 
introduction au CPP
introduction au CPPintroduction au CPP
introduction au CPP
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
 
SonarQube Manuel Automatisation d'analyse ANT JENKINS/Hudson
SonarQube Manuel Automatisation d'analyse ANT JENKINS/HudsonSonarQube Manuel Automatisation d'analyse ANT JENKINS/Hudson
SonarQube Manuel Automatisation d'analyse ANT JENKINS/Hudson
 
JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924
 

Similaire à Tout pour se préparer à PHP 7.4

PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3Eddy RICHARD
 
Migration PHP4-PHP5
Migration PHP4-PHP5Migration PHP4-PHP5
Migration PHP4-PHP5julien pauli
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afupJulien Vinber
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP NextSQLI
 
Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]Wixiweb
 
Cours php -partie 1.pdf
Cours php -partie 1.pdfCours php -partie 1.pdf
Cours php -partie 1.pdfssuserc46a93
 
Industrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHPIndustrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHPhalleck45
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPjulien pauli
 
A la recherche du code mort
A la recherche du code mortA la recherche du code mort
A la recherche du code mortDamien Seguy
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapideBilal Baltagi
 
PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4julien pauli
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyHugo Hamon
 
ZendFramework2 - Présentation
ZendFramework2 - PrésentationZendFramework2 - Présentation
ZendFramework2 - Présentationjulien pauli
 
PHP 5.3 : les nouveautés du futur si proche
PHP 5.3 : les nouveautés du futur si prochePHP 5.3 : les nouveautés du futur si proche
PHP 5.3 : les nouveautés du futur si prochePascal MARTIN
 
Présentation de CakePHP, 22/04/2010
Présentation de CakePHP, 22/04/2010Présentation de CakePHP, 22/04/2010
Présentation de CakePHP, 22/04/2010Guillaume Sautereau
 
PHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_ExtensionsPHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_Extensionsjulien pauli
 

Similaire à Tout pour se préparer à PHP 7.4 (20)

PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3
 
Migration PHP4-PHP5
Migration PHP4-PHP5Migration PHP4-PHP5
Migration PHP4-PHP5
 
Nouveautés php 7
Nouveautés php 7Nouveautés php 7
Nouveautés php 7
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afup
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP Next
 
Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]
 
Php seance1
Php seance1Php seance1
Php seance1
 
Cours php -partie 1.pdf
Cours php -partie 1.pdfCours php -partie 1.pdf
Cours php -partie 1.pdf
 
Industrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHPIndustrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHP
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHP
 
A la recherche du code mort
A la recherche du code mortA la recherche du code mort
A la recherche du code mort
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapide
 
PHP_intro.pdf
PHP_intro.pdfPHP_intro.pdf
PHP_intro.pdf
 
PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec Symfony
 
ZendFramework2 - Présentation
ZendFramework2 - PrésentationZendFramework2 - Présentation
ZendFramework2 - Présentation
 
PHP 5.3 : les nouveautés du futur si proche
PHP 5.3 : les nouveautés du futur si prochePHP 5.3 : les nouveautés du futur si proche
PHP 5.3 : les nouveautés du futur si proche
 
Présentation de CakePHP, 22/04/2010
Présentation de CakePHP, 22/04/2010Présentation de CakePHP, 22/04/2010
Présentation de CakePHP, 22/04/2010
 
PHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_ExtensionsPHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_Extensions
 
Etes vous-pret pour php8 ?
Etes vous-pret pour php8 ?Etes vous-pret pour php8 ?
Etes vous-pret pour php8 ?
 

Plus de 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
 
Meilleur du typage fort (AFUP Day, 2020)
Meilleur du typage fort (AFUP Day, 2020)Meilleur du typage fort (AFUP Day, 2020)
Meilleur du typage fort (AFUP Day, 2020)Damien 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
 
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
 

Plus de 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
 
Meilleur du typage fort (AFUP Day, 2020)
Meilleur du typage fort (AFUP Day, 2020)Meilleur du typage fort (AFUP Day, 2020)
Meilleur du typage fort (AFUP Day, 2020)
 
Top 10 php classic traps confoo
Top 10 php classic traps confooTop 10 php classic traps confoo
Top 10 php classic traps confoo
 
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
 

Tout pour se préparer à PHP 7.4