Extraction d'un texte
$string[$n]
récupère le neme octet d'une chaîne,
alors que $string{$n}
récupère le neme caractère.
Cela peut faire une différence en UTF-8!
Classes abstraites
Les abstract class
servent à centraliser du code,
de même que les trait
, qui sont toutefois moins structurés à l'usage.
Ces classes abstraites ne doivent pas servir à dire ce qu'une classe
sait faire ou pour le typehinting: c'est le rôle d'une interface
).
Elles auront donc souvent des méthodes protected
ou des final public
mais "jamais" de
public
tout court.
Débordement d'entier
PHP n'a pas de notion unsigned, contrairement à MySQL. Si MySQL contient un
BIGINT UNSIGNED
, alors PHP l'interprètera comme un
float
.
Les autres types d'entiers MySQL ne présenteront pas de problème,
car un TINYINT|SMALLINT|MEDIUMINT UNSIGNED
ne dépassent pas 2^32-1
.
DOMDocument
N'utilisez surtout pas d'expression régulière pour valider/manipuler du HTML ou du XML!
Utilisez plutôt DOMDocument
.
N'oubliez pas de vous prémunir des
attaques XXE
via libxml_disable_entity_loader(true);
!
Exceptions natives
Ne faites pas directement des class MyException extends \Exception
car il existe des exceptions natives bien plus précises,
détaillées dans la doc
.
filter_input
Vous permet de valider les entrées utilisateur.
Donc, bannissez $_POST $_GET $_REQUEST $_COOKIE
au profit de
filter_input
!
Heredoc (syntaxe)
json_encode
Utilisez
json_encode
pour échapper toute donnée à insérer dans un javascript ou dans une balise
<script>
:
<script>var DATA = <?php echo json_encode($myVar); ?>;…
.
NULL et NaN
null === null
en PHP car il représente un élément (une variable)
"vide" (non initialisée). C'est différent de MySQL, pour qui
(NULL === NULL)?
renvoie…
NULL
!
Mais NaN !== NaN
en PHP car
il représente un "non-nombre": un nombre complexe, un nombre impossible à évaluer, indéfini, etc.
WHERE IN (?,…?) et performances
PHP, et surtout PDO, sont très mauvais pour faire des requêtes préparées avec énormément de paramètres.
En pratique, la durée de préparation de la requête est presque proportionnelle au carré du nombre de
paramètres: un WHERE IN (?,…?)
avec des milliers de "?"
prendra énormément de temps.
Mieux vaut alors utiliser des INNER JOIN
directement,
ou mettre votre DAO dans des procédures stockées!