Forum PHP de l'AFUP 2009

De Patchwork.

Aller à : Navigation, rechercher

Page de préparation de notre conférence acceptée pour le Forum PHP de l'AFUP.

Slides de la présentation : Fichier:Patchwork-preprocesseur-AFUP2009.pdf

Sommaire

Comment améliorer PHP ? avec un préprocesseur !

Dans cette conférence nous proposons de présenter les avantages significatifs qu'un préprocesseur de code intercalé au sein de la fonction __autoload() nous a apporté, pour :

Améliorer PHP en tant que langage de programmation :

Améliorer PHP en tant qu'environnement d'exécution :

Certains de ces sujets ont déjà été discutés dans la communauté (constructeur statique), d'autres sont possibles grâce à des extensions (runkit pour la substitution de fonctions) et d'autres encore sont à notre connaissance évoqués pour la première fois (superposition de classe, marqueurs pour autoload).

Nous baserons notre conférence sur l'implémentation 100% PHP que nous avons faite d'un tel préprocesseur dans notre framework de démonstration, Patchwork.

Biographies

Yann Bogdanovic

Yann est ingénieur R&D chez IntellAgence Technologies. Il y a deux ans, il est devenu le premier membre de la "communauté Patchwork". L'opportunité s'étant présentée de concilier centres d'intérêts et vie professionnelle, il a rejoint l'entreprise en septembre dernier.

Nicolas Grekas

Après ses études, Nicolas a fondé IntellAgence Technologies, une société spécialisée dans les services en ligne pour les chercheurs. Il est l'auteur du framework Patchwork, résultat de huit années de pratiques et de réflexions en PHP/Web. Cette conférence est pour lui l'occasion de contribuer à la communauté PHP et de sortir ses travaux de leur confidentialité.

Plan détaillé

Introduction

Présentation de Patchwork

Mécanisme du préprocesseur

  1. Contrôleur frontal (1er fichier exécuté)
  2. Charger __autoload et le code du préprocesseur
  3. Transformer les codes chargés par __autoload
  4. Exécuter le code source compilé
  5. Mettre en cache

Améliorations à l'exécution

Vérifier l'encodage des sources

http://unicode.org/reports/tr15/images/UAX15-NormFig3.jpg

<?php declare(encoding='ISO-8859-1'); // Backport PHP6

Analyse anticipative du code

T('Bonjour ' . $nom) vs sprintf(T('Bonjour %s'), $noms)

Substituer des fonctions

rand => mt_rand
md5  => hash('md5',
getcwd               => patchwork_getcwd
mb_encode_mimeheader => trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead.',
file_exists => win_file_exists   : contrôle de la casse des noms de fichiers sous Windows
header      => patchwork::header : prendre le contrôle de certaines entêtes
iconv                => utf8_iconv::iconv     : charger un substitut PHP d'iconv à la demande
normalizer_normalize => Normalizer::normalize : backporter des fonctions de PHP 5.3

Casser l'opérateur de silence

"L'extension scream donne la possibilité de désactiver l'opérateur de contrôle d'erreur, de manière à ce que toutes les erreurs soient rapportées."

<?php @include 'parse_error.php'; // cherche des heures le pourquoi de cette satanée page blanche :)

Booster l'autoload

Spécialiser en fonction du contexte d'exécution

<?php

define('IS_WINDOWS', '\\' === DIRECTORY_SEPARATOR);

if (!function_exists('utf8_decode'))
{
    function utf8_decode($string)
    {
        // ...
    }
}

$a = file_get_contents('data/utf8/quickChecks.txt');
$a = explode("\n", $a);
define('UTF8_NFC_RX', '/' . $a[1] . '/u');
<?php

define('IS_WINDOWS', /*<*/'\\' === DIRECTORY_SEPARATOR/*>*/);

/**/if (!function_exists('utf8_decode'))
/**/{
        function utf8_decode($string)
        {
            // ...
        }
/**/}

/**/$a = file_get_contents('data/utf8/quickChecks.txt');
/**/$a = explode("\n", $a);
define('UTF8_NFC_RX', /*<*/'/' . $a[1] . '/u'/*>*/);

Améliorations du langage

Superposition de classes

Héritage multiple d'applications

Superposition de classes

<?php

class toto extends self
{
    // ...
}
<?php
class toto
{
    function isAuth() {...};
}
<?php
class toto extends self
{
    function isAuth()
    {
        $is_auth = parent::isAuth();
        $this->logAuth($is_auth);
        return $is_auth;
    };
    function logAuth() {...};
}

Constructeurs et destructeurs statiques

<?php

class toto
{
    static function __constructStatic() {...}
    static function __destructStatic() {...}
}

Libérer le constructeur PHP4

En PHP 5 :

<?php

class toto
{
    function __construct(&$un, $deux = 2) {...}
}

En PHP 4 :

<?php

class toto
{
    function toto(&$un, $deux = 2) {...}
}

Rétro-compatibilité : fonctionne aussi en PHP 5

Superposition de classe :

<?php

class toto__3
{
    function toto(&$un, $deux = 'default') {...}
}

Compatibilité PHP 4 :

<?php

class toto__3
{
    function __construct(&$a1, $a2 = 'default') {$this->toto($a1, $a2);}
    function toto(&$un, $deux = 2) {...}
}

En réalité un peu plus compliqué à cause du nombre de paramètres potentiellement variable

Conclusion

Outils personnels
Espaces de noms
Variantes
Actions
Navigation
Boîte à outils