Exploiter PHP 5
en utilisant tous les outils qu'il met a disposition
En face de vous...

• Jean-François Lépine (jeanfrancois@lepine.pro)
• Vice secrétaire de l'AFUP
• auteur du mémento PHP 5 Industrialisation
• http://blog.lepine.pro
Combien d'entre vous...
• ont entendu parler de la SPL ?
• utilisent des fonctions de la SPL ?
• ont déjà utilisé des tableaux de taille fixe en PHP ?
• ont déjà exécuté du code même après un exit ou un die ?
• ont déjà mis un écouteur sur un code pour exécuter une
  fonction personnalisée tous les n blocs de code ?

• ont déjà passé un paramètre (post ou get) de page en
  page automatiquement ?
Standard PHP Library
Standard PHP Library

• des interfaces
• des outils
• des itérateurs
• des structures de données
• des exceptions
Standard PHP Library

• des interfaces
• des outils
• des itérateurs
• des structures de données
• des exceptions
SPL - des interfaces


• Ajouter de nouveaux contrats entre vos objets et
 PHP

• un exemple : Countable.
     Combien d'entre vous ont déjà utilisé Countable ?
SPL - des interfaces
class Batiment {}



class Salle implements Countable {

    public function count() {

        return 5;

    }

}



$batiment = new Batiment;

$salle = new Salle;

$n1 = sizeof($salle); // 5

$n2 = sizeof($batiment) // 1
SPL - des interfaces

• Countable
• ArrayObject
• Iterator
• SplObserver / SplSubject
• ...
Standard PHP Library

• des interfaces
• des outils
• des itérateurs
• des structures de données
• des exceptions
SPL - des outils
 Au toload ing !!
set_include_path(

     get_include_path().PATH_SEPARATOR.'./library/class/'

);

spl_autoload_extensions('.php,.php5,.inc');

spl_autoload_register();

                                 Et c'est tout !
Autoloading et PSR-0
• Les espaces de nom et les classes doivent être préfixées
 par le nom de fournisseur de code (ex: Zend_)

• Chaque séparateur d'espace de nom (/) et chaque
 underscore (_) dans le nom d'une classe correspond à
 un changement de dossier

• Le nom complet d'une classe est suffixé par ".php"
• Les noms de classes, espaces de noms... peuvent
 contenir des minuscules et des majuscules
SPL - des outils
• spl_autoload_register()
• class_implements()
• iterator_to_array()
• spl_object_hash()
• Classe SplFileInfo
• ...
Standard PHP Library

• des interfaces
• des outils
• des itérateurs
• des structures de données
• des exceptions
SPL - des itérateurs

• Permet de parcourir un objet, qui représente alors
  une liste, un ensemble, une pile, une collection...

• L'objet implémente une Interface spécifique
$objet = new Exemple;

foreach($objet as $o) { ... }
SPL - des itérateurs
interface Iterator extends Traversable {

    function rewind();   Réinitialiser
    function valid();    Tester
    function current(); Valeur courante

    function key();      Clef courante
    function next();     Avancer
}
SPL - des itérateurs



• IteratorAggregate
•
SPL - Itérateurs et récursivité
• RecursiveArrayIterator          Les classes respectent le
                                  contrat de la récursivite,
                                  mais ne l'implémentent
• RecursiveCachingIterator        pas

• RecursiveDirectoryIterator
• RecursiveRegexIterator
                                                   terator
                                           eratorI
• RecursiveTreeIterator      R ecu rsiveIt
                                         cette réc
                                                   ursivité
                             impl émente
• ...
SPL - Récursivite
$arr = array(1, 2, array(3, 4, 5), 6);

$obj1 = new RecursiveArrayIterator($arr);

foreach($obj1 as $e) { echo $e; };

// 12Array6



$obj2 = new RecursiveIteratorIterator($obj1);

foreach($obj2 as $e) { echo $e; };

// 123456
SPL - itérateur -> tableau
$obj1 = new MyIterator;

print_r(iterator_to_array($obj1));



Array

(

    [0] => 1

    [1] => 2

)
RegexIterator / RecursiveRegexIterator

preg_match_all() => RegexIterator::ALL_MATCHES
preg_match()     => RegexIterator::GET_MATCH
preg_match()     => RegexIterator::MATCH
preg_replace() => RegexIterator::REPLACE
preg_split()    => RegexIterator::SPLIT




                          Ju ste génial !
RegexIterator : Match
$a = new ArrayIterator(array('test 1', 'another test', 'test 123'));
$b = new RegexIterator($a, '/^test/', RegexIterator::MATCH);

foreach ($b as $value) {
  echo $value . "n";
}
// test 1
// test 123
RegexIterator : Replace
$a = new ArrayIterator(array('test1', 'test2', 'test3'));
$b = new RegexIterator($a, '/^(test)(d+)/',
RegexIterator::REPLACE);
$b>replacement = '$2:$1';

print_r(iterator_to_array($b));
// Array
// (
// [0] => 1:test
// [1] => 2:test
// [2] => 3:test
// )
Standard PHP Library

• des interfaces
• des outils
• des itérateurs
• des structures de données
• des exceptions
A vous de jouer...

Quelles structures de données avez vous l'habitude
d'utiliser ?
A vous de jouer...

Quelles structures de données avez vous l'habitude
d'utiliser ?

• Des piles triées ?                       • Des conteneurs ?

                       • Des files d'attente ?
  • Des tas ?
                                • Des tableaux ?
SPL - Principales structures de données
• Des piles triées ?
         SplHeap, SplHeapMin, SplHeapMax

• Des conteneurs ?
         SplObjectStorage

• Des files d'attente ?
         SplQueue, SplPriorityQueue
• Des tas ?
         SplStack
Exemple : SplObjectStorage
$container = new SplObjectStorage;

$pierre = new StdClass;
$paul = new StdClass;

$container->attach($pierre);
$container->attach($paul);
$container->attach($pierre);
$container->attach($pierre);

var_dump(sizeof($container)); // 2
Eh ! Et les tableaux ?
$array = new SplFixedArray(3);
$array[0] = 'A';
$array[1] = 'B';
$array[2] = 'C';

$array->setSize(4);
                         lus performant en lecture !
$array[3] = 'D';        P

try {
   var_dump($array[10]);
} catch(RuntimeException $re) {
   ...
}
Standard PHP Library

• des interfaces
• des outils
• des itérateurs
• des structures de données
• des exceptions
SPL - Exceptions
• LogicException (étend la classe Exception)
    • BadFunctionCallException
        • BadMethodCallException
    • DomainException
    • InvalidArgumentException
    • LengthException
    • OutOfRangeException
SPL - Exceptions
• RuntimeException (étend la classe Exception)
    • OutOfBoundsException
    • OverflowException
    • RangeException
    • UnderflowException
    • UnexpectedValueException
InvalidArgumentException

function triple($nombre) {
  if(!is_int($nombre)) {
     throw new InvalidArgumentException(
        'Un entier était attendu');
  }
  return $nombre * 3;
}
SPL - OverflowException
class Voiture
{
  public function ajouterPassager()
  {
     if ($this->nbPassagers > 4) {
        throw new OverflowException('Voitre pleine');
     }
  }
}
Quelques outils bons à
     connaître
appel dynamique de fonction

function doAny($a) {}
                              Un callable c'est :

$func = 'doAny';              • une fonction anonyme
$func(1);                     • une closure
                              • une chaine
                              • un tableau
call_user_func('doAny', 1);
Exécuter une fonction... en dernier

• Vraiment en dernier
• Après tous les __destruct()
• Même après un die() ou un exit()


                         wn_function()
         register _shutdo
Exécuter une fonction... en dernier

register_shutdown_function(function() {
  echo 'je nettoie, je loggue, etc...' ;
});

echo "1n";
exit;
echo "2n";
Inclure automatiquement des fichiers

                                      r est int erprété
                           e fichie
• dans le php.ini         L

           auto_prepend_file=/path/
         auto_append_file=/path/


• Apache
        Php_value auto_prepend_file /path/
Bufferisation

ob_start();
echo 'ok';                     • Fonction de rappel
$result = ob_get_contents();   • Compression
ob_clean();                     (ob_gzhandler)
if($result == 'ok') {
   echo 'super !';             • Taille du tampon
}
Réecriture du tampon de sortie
output_add_rewrite_var('prenom', 'jeanfrancois');
?>
<a href="page2.php">page2</a>
<form method="post" action="page3.php">
  <input type="text" name="any" />
</form>


<a href="page2.php?prenom=jeanfrancois">page2</a>
<form method="post" action="page3.php">
  <input type="hidden" name="prenom" value="jeanfrancois" />
  <input type="text" name="any" />
</form>
Fonction exécutée en cycles
function myFunction() {
  echo 'demo'.PHP_EOL;
}

declare(ticks=1);
register_tick_function('myFunction');

echo 1;
echo 2;
                              Danger !
// demo                Pour des be soins précis !
// 1demo
// 2demo
C'est l'heure des
   questions
    Merci à vous !

Exploiter php 5

  • 1.
    Exploiter PHP 5 enutilisant tous les outils qu'il met a disposition
  • 2.
    En face devous... • Jean-François Lépine (jeanfrancois@lepine.pro) • Vice secrétaire de l'AFUP • auteur du mémento PHP 5 Industrialisation • http://blog.lepine.pro
  • 3.
    Combien d'entre vous... •ont entendu parler de la SPL ? • utilisent des fonctions de la SPL ? • ont déjà utilisé des tableaux de taille fixe en PHP ? • ont déjà exécuté du code même après un exit ou un die ? • ont déjà mis un écouteur sur un code pour exécuter une fonction personnalisée tous les n blocs de code ? • ont déjà passé un paramètre (post ou get) de page en page automatiquement ?
  • 4.
  • 5.
    Standard PHP Library •des interfaces • des outils • des itérateurs • des structures de données • des exceptions
  • 6.
    Standard PHP Library •des interfaces • des outils • des itérateurs • des structures de données • des exceptions
  • 7.
    SPL - desinterfaces • Ajouter de nouveaux contrats entre vos objets et PHP • un exemple : Countable. Combien d'entre vous ont déjà utilisé Countable ?
  • 8.
    SPL - desinterfaces class Batiment {} class Salle implements Countable { public function count() { return 5; } } $batiment = new Batiment; $salle = new Salle; $n1 = sizeof($salle); // 5 $n2 = sizeof($batiment) // 1
  • 9.
    SPL - desinterfaces • Countable • ArrayObject • Iterator • SplObserver / SplSubject • ...
  • 10.
    Standard PHP Library •des interfaces • des outils • des itérateurs • des structures de données • des exceptions
  • 11.
    SPL - desoutils Au toload ing !! set_include_path( get_include_path().PATH_SEPARATOR.'./library/class/' ); spl_autoload_extensions('.php,.php5,.inc'); spl_autoload_register(); Et c'est tout !
  • 12.
    Autoloading et PSR-0 •Les espaces de nom et les classes doivent être préfixées par le nom de fournisseur de code (ex: Zend_) • Chaque séparateur d'espace de nom (/) et chaque underscore (_) dans le nom d'une classe correspond à un changement de dossier • Le nom complet d'une classe est suffixé par ".php" • Les noms de classes, espaces de noms... peuvent contenir des minuscules et des majuscules
  • 13.
    SPL - desoutils • spl_autoload_register() • class_implements() • iterator_to_array() • spl_object_hash() • Classe SplFileInfo • ...
  • 14.
    Standard PHP Library •des interfaces • des outils • des itérateurs • des structures de données • des exceptions
  • 15.
    SPL - desitérateurs • Permet de parcourir un objet, qui représente alors une liste, un ensemble, une pile, une collection... • L'objet implémente une Interface spécifique $objet = new Exemple; foreach($objet as $o) { ... }
  • 16.
    SPL - desitérateurs interface Iterator extends Traversable { function rewind(); Réinitialiser function valid(); Tester function current(); Valeur courante function key(); Clef courante function next(); Avancer }
  • 17.
    SPL - desitérateurs • IteratorAggregate •
  • 18.
    SPL - Itérateurset récursivité • RecursiveArrayIterator Les classes respectent le contrat de la récursivite, mais ne l'implémentent • RecursiveCachingIterator pas • RecursiveDirectoryIterator • RecursiveRegexIterator terator eratorI • RecursiveTreeIterator R ecu rsiveIt cette réc ursivité impl émente • ...
  • 19.
    SPL - Récursivite $arr= array(1, 2, array(3, 4, 5), 6); $obj1 = new RecursiveArrayIterator($arr); foreach($obj1 as $e) { echo $e; }; // 12Array6 $obj2 = new RecursiveIteratorIterator($obj1); foreach($obj2 as $e) { echo $e; }; // 123456
  • 20.
    SPL - itérateur-> tableau $obj1 = new MyIterator; print_r(iterator_to_array($obj1)); Array ( [0] => 1 [1] => 2 )
  • 21.
    RegexIterator / RecursiveRegexIterator preg_match_all()=> RegexIterator::ALL_MATCHES preg_match() => RegexIterator::GET_MATCH preg_match() => RegexIterator::MATCH preg_replace() => RegexIterator::REPLACE preg_split() => RegexIterator::SPLIT Ju ste génial !
  • 22.
    RegexIterator : Match $a= new ArrayIterator(array('test 1', 'another test', 'test 123')); $b = new RegexIterator($a, '/^test/', RegexIterator::MATCH); foreach ($b as $value) { echo $value . "n"; } // test 1 // test 123
  • 23.
    RegexIterator : Replace $a= new ArrayIterator(array('test1', 'test2', 'test3')); $b = new RegexIterator($a, '/^(test)(d+)/', RegexIterator::REPLACE); $b>replacement = '$2:$1'; print_r(iterator_to_array($b)); // Array // ( // [0] => 1:test // [1] => 2:test // [2] => 3:test // )
  • 24.
    Standard PHP Library •des interfaces • des outils • des itérateurs • des structures de données • des exceptions
  • 25.
    A vous dejouer... Quelles structures de données avez vous l'habitude d'utiliser ?
  • 26.
    A vous dejouer... Quelles structures de données avez vous l'habitude d'utiliser ? • Des piles triées ? • Des conteneurs ? • Des files d'attente ? • Des tas ? • Des tableaux ?
  • 27.
    SPL - Principalesstructures de données • Des piles triées ? SplHeap, SplHeapMin, SplHeapMax • Des conteneurs ? SplObjectStorage • Des files d'attente ? SplQueue, SplPriorityQueue • Des tas ? SplStack
  • 28.
    Exemple : SplObjectStorage $container= new SplObjectStorage; $pierre = new StdClass; $paul = new StdClass; $container->attach($pierre); $container->attach($paul); $container->attach($pierre); $container->attach($pierre); var_dump(sizeof($container)); // 2
  • 29.
    Eh ! Etles tableaux ? $array = new SplFixedArray(3); $array[0] = 'A'; $array[1] = 'B'; $array[2] = 'C'; $array->setSize(4); lus performant en lecture ! $array[3] = 'D'; P try { var_dump($array[10]); } catch(RuntimeException $re) { ... }
  • 30.
    Standard PHP Library •des interfaces • des outils • des itérateurs • des structures de données • des exceptions
  • 31.
    SPL - Exceptions •LogicException (étend la classe Exception) • BadFunctionCallException • BadMethodCallException • DomainException • InvalidArgumentException • LengthException • OutOfRangeException
  • 32.
    SPL - Exceptions •RuntimeException (étend la classe Exception) • OutOfBoundsException • OverflowException • RangeException • UnderflowException • UnexpectedValueException
  • 33.
    InvalidArgumentException function triple($nombre) { if(!is_int($nombre)) { throw new InvalidArgumentException( 'Un entier était attendu'); } return $nombre * 3; }
  • 34.
    SPL - OverflowException classVoiture { public function ajouterPassager() { if ($this->nbPassagers > 4) { throw new OverflowException('Voitre pleine'); } } }
  • 35.
    Quelques outils bonsà connaître
  • 36.
    appel dynamique defonction function doAny($a) {} Un callable c'est : $func = 'doAny'; • une fonction anonyme $func(1); • une closure • une chaine • un tableau call_user_func('doAny', 1);
  • 37.
    Exécuter une fonction...en dernier • Vraiment en dernier • Après tous les __destruct() • Même après un die() ou un exit() wn_function() register _shutdo
  • 38.
    Exécuter une fonction...en dernier register_shutdown_function(function() { echo 'je nettoie, je loggue, etc...' ; }); echo "1n"; exit; echo "2n";
  • 39.
    Inclure automatiquement desfichiers r est int erprété e fichie • dans le php.ini L auto_prepend_file=/path/ auto_append_file=/path/ • Apache Php_value auto_prepend_file /path/
  • 40.
    Bufferisation ob_start(); echo 'ok'; • Fonction de rappel $result = ob_get_contents(); • Compression ob_clean(); (ob_gzhandler) if($result == 'ok') { echo 'super !'; • Taille du tampon }
  • 41.
    Réecriture du tamponde sortie output_add_rewrite_var('prenom', 'jeanfrancois'); ?> <a href="page2.php">page2</a> <form method="post" action="page3.php"> <input type="text" name="any" /> </form> <a href="page2.php?prenom=jeanfrancois">page2</a> <form method="post" action="page3.php"> <input type="hidden" name="prenom" value="jeanfrancois" /> <input type="text" name="any" /> </form>
  • 42.
    Fonction exécutée encycles function myFunction() { echo 'demo'.PHP_EOL; } declare(ticks=1); register_tick_function('myFunction'); echo 1; echo 2; Danger ! // demo Pour des be soins précis ! // 1demo // 2demo
  • 43.
    C'est l'heure des questions Merci à vous !

Notes de l'éditeur