Espaces de noms
Le plus gros changement dans PHP 5.3 concerne sans aucun doute les espaces de noms (il y avait déjà une FAQ sur les espaces de noms PHP auparavant). Cela apporte de nombreux avantages aux développeurs PHP, et le problème de dénomination des fonctions, largement critiqué, a également été résolu.
Le code est plus clair
Le code courant avant la version 5.3 nécessite un préfixe personnalisé pour distinguer les noms de fonctions et de classesCODE
DE TEXTE PLAIN
:
function MY_wrapper() {}
classe MY_DB { }
définir('MY_CONN_STR', '');
MON_wrapper();
nouveau MY_DB();
MY_CONN_STR ;
Après avoir utilisé les espaces de noms, le code semble plus propre.
CODE
EN TEXTE PLAIN
:espace de noms MY ;
fonction wrapper() {}
classe BD { }
const CONN_STR = '';
utilisez MON COMME MON ;
enveloppe();
nouvelle base de données ();
CONN_STR ;
Plusieurs espaces de noms définis dans un seul fichier
Que faut-il faire si plusieurs espaces de noms sont définis dans un fichier ?
CODE
EN TEXTE PLAIN
:espace de noms LIB ;
classe MySQL {}
classe SQLite {}
$b = nouveau SQLite();
espace de noms LIB_EXTRA ;
classe MScrypt {}
$a = nouveau MScrypt();
var_dump(
get_class($a),
get_class($b)
);
La sortie du code ci-dessus est :
CODE
TEXTE PLAIN
:string(18)"LIB_EXTRA::MScrypt"
chaîne(11)"LIB::SQLite"
PHP est un langage d'interprétation et d'exécution, et les résultats ci-dessus sont raisonnables.
priorité de l'espace de noms
Les fonctions, classes et constantes définies dans l'espace de noms sont prioritaires, suivies par les fonctions globales.
CODE
EN TEXTE PLAIN
:espace de noms foo ;
function strlen ($ foo) { return htmlentities ($ foo });
echo strlen("test"); //test
echo ::strlen("test"); // 4
echo espace de noms::strlen("test"); // tester
L'amitié entre l'espace de noms et le chargement automatique
autoload analysera l'emplacement du fichier de classe en fonction du nom de l'espace de noms et du nom de la classe. Le chargement automatique sera déclenché uniquement lorsque la définition de classe n'est pas trouvée dans l'espace de noms et la portée globale définie dans l'espace de noms ne sera pas automatiquement appelée.
TEXTE CLAIR
CODE:
function __autoload($var) { var_dump($var); } // LIB::foo
nécessite "./ns.php" /*
<?php
espace de noms LIB ;
nouveau foo();
*/
espace de noms quelques accessoires
CODE
EN TEXTE PLAIN
:espace de noms vraiment ::long::inutilement ::verbose ::ns ;
__NAMESPACE__; // Nouvelle constante magique représentant le nom actuel de l'espace de noms
classe a{}
get_class(new a()); // vraiment::long::inutilement::verbose::ns::a
use Really::long::pointlessly::verbose::ns::a AS b;// Référencement d'une classe à partir de l'espace de noms Remarque : Le contenu ici est extrait de pdfIntroduction to PHP 5.3 Slides et ne sera pas répété ultérieurement.
Améliorations des performances
Les performances globales de PHP 5.3 se sont améliorées de 5 à 15 %
et md5() est 10 à 15 % plus rapide.
Meilleure implémentation de la pile dans le moteur
Constantes déplacées vers la mémoire morte
Amélioration du processus de gestion des exceptions (simplification, moins d'opcodes)
(exiger/inclure)_une fois l'amélioration, supprimer les doublons ouverts
Taille binaire et taille de démarrage plus petites avec gcc4
Nouvelle fonctionnalité linguistique__DIR__
Avant la 5.3, afin d'obtenir le répertoire du script courant, un appel de fonction était nécessaire
: PLAIN TEXT
CODE :
echo dirname(__FILE__);
En 5.3, une seule constante magique __DIR__ est nécessaire.
CODE
EN TEXTE PLAIN
:echo __DIR__; // >= PHP 5.3
?:Opérateur L'opérateur ?: pratique peut obtenir rapidement une valeur non nulle à partir de deux valeurs/expressions.
CODE
EN TEXTE PLAIN
:$a = vrai ? : faux ;
$a = faux ? : vrai; // vrai
$a = "" ?: 1; // 1
$a = 0 ? : 2 ; // 2
$a = tableau() ?: tableau(1); // tableau(1);
$a = strlen("") ?: strlen("a"); // 1
__callStatic()
Une nouvelle méthode magique __callStatic est ajoutée. Sa fonction est similaire à __call, mais elle n'est valable que pour les méthodes statiques.
EN TEXTE PLAIN
:
assistant de classe {
fonction statique __callStatic($name, $args) {
echo $name.'('.implode(',', $args).')';
}
}
helper::test("foo","bar"); // test(foo,bar)
Appeler dynamiquement une méthode statique. Appeler dynamiquement une méthode statique ? Combinaison de mouvement et d'immobilité.
EN TEXTE PLAIN
:
assistant de classe {
fonction statique foo() { echo __METHOD__;
}
$a = "assistant" ;
$b = "foo" ;
$a::$b(); // aide ::foo
Liaison statique tardive
Je ne sais pas comment le traduire, c’est peut-être plus facile à comprendre si je laisse le texte original. Le calendrier de traitement des événements des méthodes statiques a changé. Auparavant, il était traité lors de la compilation, mais il est désormais traité lors de l'exécution.
Avant PHP 5.3, le code suivant produirait un A, mais ce n'est pas ce que nous voulons. La méthode whoami a été redéfinie dans la classe B. Elle devrait produire B pour se conformer à ce que nous tenons pour acquis.
CODEEN TEXTE CLAIR
:
classe A {
fonction statique publique whoami() {
écho __CLASS__;
}
identité de fonction statique publique() {
self::whoami();
}
}
la classe B étend A {
fonction statique publique whoami() {
écho __CLASS__;
}
}
B::identité(); // A <-- PHP <5.3
Le code suivant utilise static::whoami() pour appeler des méthodes statiques. Après PHP 5.3, puisque __CLASS__ est traité lors de l'exécution, la classe B peut être capturée avec succès dans cet exemple.
EN TEXTE CLAIR
:
classe A {
fonction statique publique whoami() {
écho __CLASS__;
}
identité de fonction statique publique() {
static :: whoami ();
}
}
la classe B étend A {
fonction statique publique whoami() {
écho __CLASS__;
}
}
B::identité(); // B <-->= PHP 5.3
mysqlnd
Voyez que mysqlnd est devenu le pilote mysql par défaut dans PHP 5.3
, mais PDO_MySQL ne prend pas encore en charge mysqlnd. Actuellement, seule l'extension mysql(i) peut utiliser
les nouvelles fonctionnalités de PHP 5.3 introduites auparavant, qui sont toutes pratiques pour les développeurs. Voici une fonctionnalité que les hébergeurs Web apprécient beaucoup.
Prise en charge améliorée des fichiers ini
CGI/FastCGI prend en charge une configuration INI similaire à .htaccess. Chaque répertoire peut avoir des paramètres INI. Le nom de fichier ini dépend de la configuration de php.ini, mais [PATH=/var/www/domain.com], [HOST=www. Les paramètres de la section .domain.com] ne peuvent pas être modifiés par l'utilisateur.
Gestion améliorée des erreurs
Les variables et constantes peuvent être définies dans les fichiers ini et peuvent être appelées directement dans le programme.
Vous trouverez ci-joint un exemple de fichier ini
EN TEXTE PLAIN
:
#Nom de fichier php.ini défini par l'utilisateur (.htaccess). La valeur par défaut est ".user.ini".
user_ini.filename=".user.ini"
#Si vous souhaitez désactiver cette fonctionnalité, définissez-la sur une valeur nulle.
user_ini.filename=
# Longueur TTL du fichier php.ini définie par l'utilisateur (durée de vie), l'unité est en secondes, je le comprends comme le délai d'expiration du cache. La valeur par défaut est 300 secondes
user_ini.cache_ttl=300
[CHEMIN=/var/www/domain.com]
variables_order = GPC
mode_sécurisé = 1
[mes variables]
var = "1234"
une autrevar = ${unevar}; une autrevar == unevar
[tableaux ini]
foo[barre]=1
foto[123]=2
foo[]=3