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
• 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
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 - 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
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 - OverflowException
class Voiture
{
public function ajouterPassager()
{
if ($this->nbPassagers > 4) {
throw new OverflowException('Voitre pleine');
}
}
}
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
}
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