Php : mécanismes a connaitre
Description
Php est un langage interprété simple dans son ensemble. Il recèle néanmoins certaines astuces ou subtilités ou tout simplement des mots clef vraiment utiles que l'on ne connait pas forcement quand on commence à travailler. Je vais essayer de vous donner ici quelques unes de ces subtilités.
Les notions de base a bien comprendre
La visibilité des variables
Comme dans tout langage les variables ont un contexte, en PhP on peut les réduire simplement à 4 portées différentes :
- Je suis dans une fonction => Je suis disponible que dans cette fonction
- Je suis une globale => Je suis disponible partout
- Je suis une propriété de classe => Je suis disponible en fonction de mon type de déclaration :
- private => Que dans la classe
- protected => Dans la classe et dans ses enfants
- public => Directement depuis une instance de la classe
- Le scope => Un scope est un contexte d'exécution et plus particulièrement de visibilite des variables et des fonctions. C'est une notion complexe aussi je vous laisse lire ceci pour mieux la comprendre : http://www.projectperfect.com.au/info_define_the_scope.php
Les designs patterns
Ce sont des méthodes de programmation purement logique pour répondre a un problème donne.
Il faut les connaitre, il faut savoir que ça existe et il faut se renseigner dessus.
A lire à ce propos.
L'operateur ::
La résolution de portée.
Si vous voulez utiliser des fonctions ou des variables statiques il sera obligatoire et pour plus d'explications :
http://php.net/manual/fr/language.oop5.paamayim-nekudotayim.php
Les mots clés méconnus ou peu utilisés
const et la fonction define
Ces deux mots clefs vous permettront de déclarer les variables dont vous pouvez avoir besoin partout dans votre code.
Notez que avec le mot clef const vous pourrez définir des variables complexes comme des objets ce que vous ne pourrez pas faire avec define qui se contente des type simples.
Pour plus d'informations :
http://stackoverflow.com/questions/2447791/define-vs-const
global
Un mot clef vraiment utile, soit le code suivant :
$a = 10;
function toto()
{
global $a; # Ici $a vaudra 10
}
Le fait de mettre global devant la variable $a va préciser agir comme le mot clef extern en c, c'est à dire que PhP va regarder si une variable de ce nom a été déclaré quelque part dans votre code et si elle existe ce sera celle la qui sera utilisée.
static
Souvent mal compris ce mot clef est très utile.
Il va vous permettre de déclarer des variables ou des fonctions dites statiques et cela implique que vous n'aurez pas à instancier un objet pour y accéder !
Souvent il est plus intéressant de faire une fonction statique ou déclarer une variable statique et des fois ça sera même indispensable notamment si vous comptez par exemple implémenter un Singleton (la je vous laisse découvrir les design pattern).
Ce que vous devez retenir c'est que pour accéder à une fonction ou une variable statique vous devrez utiliser l'opérateur ::
self
Le mot-clef self permet d'utiliser une méthode ou une propriété de la classe elle-même.
parent
Là, c'est la notion de l'héritage qui est en jeu et je vous conseille de lire ceci :
http://php.net/manual/fr/keyword.extends.php
A vous de comprendre la notion d'héritage. Ce n'est plus du PhP mais de la programmation orientée objet.
Les constantes dynamiques
__CLASS__
Dans une classe ce mot clef vaut le nom de la classe ou on se trouve.
Exemple :
class maClasse
{
public function __construct()
{
echo __CLASS__; # Affichera "maClasse"
}
}
__FUNCTION__
Dans une fonction ce mot clef vaut le nom de la fonction ou on se trouve.
Exemple :
function maFonction()
{
echo __FUNCTION__; # Affichera "maFonction"
}
__FILE__
Nom du fichier ou cette constante est utilisée.
Les raccourcis
++ : Incrémentation de la variable de 1 selon son type
-- : Décrémentation de la variable de 1 selon son type
+=,
-=,
*=,
/= : les opérations de bases appliquées directement du cote gauche
Exemple : $var a = 10; $a *= 10 donnera 100;
L'operateur & devant une variable
Plutôt qu'une longue explication un exemple sera plus parlant :
function a(¶m){
param / 2;
}
$b = 10;
a($b); # La fonction a reçu la variable par référence et non par copie,
# son contenu est directement modifie par la fonction !
# $b vaut 5 après l'appel.
Le $$
Non non ce n'est pas un barbarisme mais une beauté du langage interprété :)
Nous savons tous que une variable se déclare de la manière suivante en PhP : $nom_de_ma_variable.
Maintenant un cas pratique : soit une variable $var = 'toto';
En utilisant $ devant une variable contenant une chaine PhP va tout simplement agir comme suit et ce grâce a la priorité des opérateurs (chaque opérateur a une priorité d'interprétation lorsque les code est analysé).
$var => contient la chaine 'toto'
$ => ce qui suit est une variable
Conclusion :
$$var = que contient la variable de nom $var soit que contient la variable $toto !
Utilité : Créer du code générique principalement, grâce à ce mécanisme on va pouvoir faire de jolies choses en évaluant le contenu de variable dynamiquement !
Les structures conditionnelles
Le foreach
Vraiment TRES utile !
Je ne vais pas trop m'étendre dessus mais c'est comme un for mais en mieux :)
Exemples :
$arr = array(1, 2, 3);
foreach ($arr as $value)
{
echo $value;
}
# Ceci affichera : 123
foreach ($arr as $index => $value)
{
echo $index.':'.$value;
}
# Ceci affichera : 011223
et pour plus de précisions :
$arr = array(
'clef1' => 1,
'clef2' => 2,
'clef3' => 3
);
foreach ($arr as $index => $value)
{
echo $index.':'.$value;
}
# Ceci affichera : clef1:1clef2:2clef3:3
Je pense que c'est assez clair ^^
Pour finir du côté des structures utiles, je vous conseille de vous renseigner sur le "switch" et le "do / while".
Si vous devez optimiser la rapidité de votre code :
Utilisez = = = plutôt que = = c'est l'opérateur d'égalité stricte qui est plus rapide
mais attention :
true === true est vrai alors que 1 === true est faux, pourtant 1 == true est vrai (l'égalité stricte se base aussi sur le type)
Le switch est plus rapide qu'une batterie de if, c'est toujours bon a savoir :).
Un for est traduit en while alors utilisez un while (Bon la j'avoue c'est vraiment minime).
Voila ce tutoriel évoluera certainement avec le temps, j'espère vous avoir donné quelques informations intéressantes :)