php 5.3
DESCRIPTION
PHP 5.3Les namespaces, et les closuresTRANSCRIPT
Intervenant: Benoît DURAND b.durand at epixelic dot com
PHP 5.3Les namespaces, et les closures
05/10/2011 Développement
Les espaces de noms(namespaces)
3
La portée
1. Fonctions2. Classes3. Constantes
05/10/2011 PHP 5.3
4
La déclaration
Le mot clé est :namespace
Le séparateur est : \
05/10/2011 PHP 5.3
5
La déclaration
<?phpnamespace Epx;
function number_format($number) { return \number_format($number, 2, ',', ' ');}
echo number_format(2); // Affiche 2,00
05/10/2011 PHP 5.3
6
Les sous espaces de noms
Le séparateur d’espaces de noms permet de définir un sous espace de nom :
namespace Epx\Payment;
05/10/2011 PHP 5.3
7
L’ordre de résolution
1. Un nom qualifié
2. L’espace de nom courant
3. L’espace de nom global
05/10/2011 PHP 5.3
8
L’ordre de résolution
1. Un nom qualifiéException\RuntimeException
2. L’espace de nom courantRuntimeException
3. L’espace de nom global\RuntimeException
05/10/2011 PHP 5.3
9
Utilisation des espaces de noms
// Fonctionecho number_format(2); // Affiche 2echo Epx\number_format(2); // Affiche 2,00
// Classe$e = new \Exception('error');
// Constanteconst APPLICATION_ENV = 'cli'; // Nouveauté 5.3echo APPLICATION_ENV; // Affiche cli05/10/2011 PHP 5.3
10
Import
Le mot clé est :
use
05/10/2011 PHP 5.3
11
Import
namespace Epx;
use Zend\Registry, // import de la classe Zend\Translator; // import de l’espace de nom
$r = new Registry;$t = new Translator\Translator;
05/10/2011 PHP 5.3
12
Alias
Le mot clé est : as
05/10/2011 PHP 5.3
13
Alias
namespace Application;use Zend\Controller\Action as ActionController;
class IndexController extends ActionController {}
05/10/2011 PHP 5.3
14
Vous êtes perdus ?
• Nouvelle constante magique__NAMESPACE__
05/10/2011 PHP 5.3
15
Etude de cas
// Aujourd’hui, ZF1 est en style PHP 5.2require_once 'Zend_Controller_Action';
class IndexController extends Zend_Controller_Action {}
05/10/2011 PHP 5.3
16
Etude de cas : migration d’une librairie
// Import du contrôleur ZF1use Zend_Controller_Action as ActionController;class IndexController extends ActionController {}
// Après la migration ZF2use Zend\Controller\Action as ActionController;class IndexController extends ActionController {}
05/10/2011 PHP 5.3
17
Lisibilité du code
// Test sur un type d’objetnamespace Zend\Log;if ($writer instanceof Writer) {/*…*/}
// Type d’une classenamespace Zend\Log\Writer;use Zend\Log\Writer;class Mail implements Writer {}
05/10/2011 PHP 5.3
18
Lisibilité du code
// Notation ZF1 compatible PHP 5.2$vr = new Zend_Controller_Action_Helper_ViewRenderer;Zend_Controller_Action_HelperBroker::addHelper($vr);
// Notation raccourcieuse Zend\Controller\Action\HelperBroker, Zend\Controller\Action\Helper\ViewRenderer;HelperBroker::addHelper(new ViewRenderer);
05/10/2011 PHP 5.3
19
PSR-0 : PHP Specification Request 0
• Interopérabilité pour l’autoload entre les frameworks
• Zend Framework 2, Doctrine2, Symfony2 l’ont déjà adopté
05/10/2011 PHP 5.3
20
PSR-0 : exemples
• Zend\Mail\Message=> /vendor/Zend/Mail/Message.php• Doctrine\ORM\EntityManager=> /vendor/Doctrine/ORM/EntityManager.php• Symfony\Component\Yaml\Parser=> /vendor/Symfony/Component/Yaml/Parser.php
05/10/2011 PHP 5.3
21
Résumons
• Améliorer la lecture avec des noms courts
05/10/2011 PHP 5.3
22
Résumons
• Améliorer la lecture avec des noms courts• Refactoriser devient simple
05/10/2011 PHP 5.3
23
Résumons
• Améliorer la lecture avec des noms courts• Refactoriser devient simple• Chaque classe définit un espace de nom
05/10/2011 PHP 5.3
24
Résumons
• Améliorer la lecture avec des noms courts• Refactoriser devient simple• Chaque classe définit un espace de nom• Un espace de nom par fichier
05/10/2011 PHP 5.3
25
Résumons
• Améliorer la lecture avec des noms courts• Refactoriser devient simple• Chaque classe définit un espace de nom• Un espace de nom par fichier• Utiliser un espace de nom unique
05/10/2011 PHP 5.3
26
Résumons
• Améliorer la lecture avec des noms courts• Refactoriser devient simple• Chaque classe définit un espace de nom• Un espace de nom par fichier• Utiliser un espace de nom unique• Utiliser l’import au lieu de require_once
05/10/2011 PHP 5.3
27
Résumons
• Améliorer la lecture avec des noms courts• Refactoriser devient simple• Chaque classe définit un espace de nom• Un espace de nom par fichier• Utiliser un espace de nom unique• Utiliser l’import au lieu de require_once• Eviter d’utiliser la résolution globale (sauf pour
les chaînes de caractères)
05/10/2011 PHP 5.3
Les fonctions anonymes(closures)
29
Fonctions anonymes
// PHP 5.2$pages = array(…);$cmp_function = create_function( '$a,$b', 'return strcmp($a["label"], $b["label"]); ');usort($pages, $cmp_function); var_dump($pages);
05/10/2011 PHP 5.3
30
Fonctions de rappel (callback)
$pages = array( array('label' => 'home'), array('label' => 'about'),);// C’est plus rapide que create_function()usort($pages, function ($a, $b) { return strcmp($a['label'], $b['label']);});
05/10/2011 PHP 5.3
31
Contexte et variables
$logger = new Logger;$log = function ($msg) use ($logger) { if (is_array($msg)) { $msg = json_encode($msg); } $logger->crit((string) $msg);};$log('il neige');
05/10/2011 PHP 5.3
Bonus
33
Amélioration des performances
• Drupal : 20% plus rapide• Wordpress : 15% plus rapide
source : http://news.php.net/php.internals/36484
05/10/2011 PHP 5.3
34
Nouvelle méthode magique
namespace My\Filter;class Int{ public function __invoke($value) { return filter_var($value, FILTER_SANITIZE_NUMBER_INT); }}$filter = new Int;var_dump($filter('CL1234')); // Affiche 1234
05/10/2011 PHP 5.3
35
Les limitations du mot clé self
namespace Cwp\Boutique;class Commande{ public static function get($id) { return new self; }}
use Cwp\BoutiqueEvolution\Commande;$cl = get_class(Commande::get(42));var_dump($cl); // Affiche Cwp\Boutique\Commande05/10/2011 PHP 5.3
36
Late State Binding
Le mot clé est :
static
05/10/2011 PHP 5.3
37
Late State Binding
namespace Cwp\Boutique;class Commande{ public static function get($id) { return new static; }}
use Cwp\BoutiqueEvolution\Commande;$cl = get_class(Commande::get(42));var_dump($cl); // Affiche Cwp\BoutiqueEvolution\Commande05/10/2011 PHP 5.3
38
Autres nouveautés
• Nouvelle constante magique__DIR__ === dirname(__FILE__)
05/10/2011 PHP 5.3
39
Autres nouveautés
• Nouvelle constante magique__DIR__ === dirname(__FILE__)• Nouvelle méthode magique__callStatic()
05/10/2011 PHP 5.3
40
Autres nouveautés
• Nouvelle constante magique__DIR__ === dirname(__FILE__)• Nouvelle méthode magique__callStatic()• Phar (archive PHP)
05/10/2011 PHP 5.3
41
Autres nouveautés
• Nouvelle constante magique__DIR__ === dirname(__FILE__)• Nouvelle méthode magique__callStatic()• Phar (archive PHP)• Ajout de NOWDOC
05/10/2011 PHP 5.3
42
Autres nouveautés
• Nouvelle constante magique__DIR__ === dirname(__FILE__)• Nouvelle méthode magique__callStatic()• Phar (archive PHP)• Ajout de NOWDOC• Ajout d’un garbage collector
05/10/2011 PHP 5.3
43
Autres nouveautés
• Nouvelle constante magique__DIR__ === dirname(__FILE__)• Nouvelle méthode magique__callStatic()• Phar (archive PHP)• Ajout de NOWDOC• Ajout d’un garbage collector• Support amélioré pour Windows
05/10/2011 PHP 5.3
Git 44
Documentation
• http://php.net/namespace• http://tinyurl.com/fig-psr0• http://php.net/manual/fr/functions.anonymous.php• http
://php.net/manual/fr/language.oop5.late-static-bindings.php
• http://php.net/manual/fr/migration53.new-features.php
11/04/2011
PHP 5.3 45
Questions ?
05/10/2011