PHP

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écrit ce qu'une classe sait faire interface IEndpoint { public function handleWebRequest(IConfig $configuration): void; } // Centralise du code abstract class AHttpGetEndpoint implements IEndpoint { final public function handleWebRequest(IConfig $configuration): void { echo '<html><head><title>'; $this->echoTitle(); echo '</title></head><body>'; $this->echoBody(); echo '</body></html>'; } abstract protected function echoTitle(): void; abstract protected function echoBody(): void; } // Implémentation class CodetipsPhp extends AHttpGetEndpoint { protected function echoTitle(): void { echo 'PHP'; } protected function echoBody(): void { echo 'Des astuces en PHP!'; } }
Hiérarchie de classes que je recommande

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)

<<<SQL SELECT * FROM mytable AS t INNER JOIN myothertable AS o ON o.id = t.id_other WHERE t.id = ? SQL;
La syntaxe des blocs de texte en heredoc

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!

Liens utiles