Quelques mémos sur le PHP

Afficher les messages d'erreur

De deux choses l'une, soit vous travaillez sur un serveur de développement et dans ce cas le serveur Apache, à travers le fichier php.ini, est configuré pour afficher les messages d'erreur.

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = On

On trouve généralement le fichier php.ini du coté de /etc/php/x.x/apache2/php.ini

Soit vous travaillez sur un serveur en production (ou pas) et vous souhaitez afficher ponctuellement les messages d'erreur pour un script php en particulier. Dans ce cas on indiquera directement ces deux lignes au début du script php.

error_reporting(E_ALL);
ini_set('display_errors', 1);

J'ai récemment eu une petite mésaventure avec les messages d'erreurs qui refusaient obstinément de s'afficher, seul résultat obtenu une page blanche un peu comme quand un script tourne en boucle. Le fait est que j'utilisais la fonction ob_start("ob_gzhandler");, j'ai donc du la supprimer pour enfin retrouver mes doux messages d'erreur.

index.php

Un fichier à placer dans les répertoires ne nécessitants pas un accès directe.

<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");

header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

header("Location: ../");
exit;

Expressions simplifiées

Une condition if/else classique ...

if($a == 1){
    $t = 'vrai';
}else{
    $t = 'faux';
}

... peut être simplifiée ainsi:

$t = $a == 1 ? 'vrai':'faux';

Si la condition qui se trouve avant le ? est vérifiée alors $t = la valeur située avant le : sinon $t = la valeur qui se trouve après le caractère :.
En d'autres termes:

$t = (condition) ? true:false;

Échappement depuis du HTML

Balises d'ouvertures et de fermetures PHP

<? echo 'Un peu de texte et des '.$variables.'<br />'; ?>

ou

<?= 'Un peu de texte et des '.$variables.'<br />'; ?>

ou en combinant avec une expression simplifiée

<?= $nbr > 0 ? 'positif' : 'négatif ou null' ?>

ce qui est équivalant à

<php
    if($nbr > 0)
        echo 'positif';
    else
        echo 'négatif ou null';
?>

Échappement avancé if, else, for, foreach

...
<ul>
     <?php
     $tableau = array('cell1','cell2','cell3');
     foreach ($tableau as $value): ?>
          <li><?= $value; ?></li>
     <?php endforeach; ?>
</ul>
...

ou encore


<?php if($var == "variables"): ?> <span style="color:blue";>Il y a plusieurs variables (pluriel)</span> <?php elseif($var == "variable"): ?> <span style="color:green";>Il n'y a qu'une seule variable (singulier)</span> <?php else: ?> <span style="color:red";>Il ne sagit pas d'une variable!</span> <?php endif; ?>

Upload de fichier

<?php

$errorsMsg = array(
    0 => 'Transfère réalisé avec succès!',
    1 => 'Le fichier est plus gros que le permet la directive <b>"upload_max_filesize"</b> de php.ini.',
    2 => 'Le fichier est plus gros que le permet la directive <b>"MAX_FILE_SIZE"</b> du formulaire.',
    3 => 'Le fichier n\'a été que partiellement téléchargé.',
    4 => 'Aucun fichier trouvé.',
    6 => 'Un dossier temporaire est manquant.',
    7 => 'Impossible d\'écrire sur le disque.',
    8 => 'Une extension PHP a stoppé le transfère. L\'examen de phpinfo() peut vous aider à identifier cette extension.',
);

?>

<!doctype html>
<html lang="fr">
<head>
    <meta charset="utf-8">
</head>
<body>

     <form method="post" action="<?= $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data">
          <input type="hidden" name="MAX_FILE_SIZE" value="100000" />
          <input type="file" name="fichier" id="fichier" /><br />
          <input type="submit" name="submit" value="Envoyer" />
     </form>

<?= '<pre>'.print_r($_FILES['fichier'],true).'</pre>'; ?>
<?= $errorsMsg[$_FILES['fichier']['error']]; ?>

</body>
</html>

spl_autoload_register

Créer simplement un chargeur de classes PHP avec spl_autoload_register.

Structure

A la racine d'un serveur web supposons l'arborescence suivante:

classes/

bootstarp.php
index.php

Le répertoire "classes" contiendra tous les fichiers "nom.class.php", pour l'exemple il contiendra un fichier nommé Test.class.php qui sera appelé lors de la création d'un objet par la page index.php.

bootstrap.php

<?php
    spl_autoload_register('app_autoload');

    function app_autoload($class){
    require "classes/$class.class.php";
    }

Ou, en utilisant une fonction anonyme (à partir de PHP 5.3.0)

<?php
    spl_autoload_register(function ($class) {
        require "classes/$class.class.php";
    });

index.php

<?php 
    require_once 'bootstrap.php';
    $objet = new Test();

Exemple simple pour l'initiation à la récursivité

Ci-dessous la fonction somme() permettant de calculer la somme de tous les chiffre d'un nombre. Elle ne prend qu'un seul argument, $str qui est un nombre sous la forme d'une chaîne de caractères.

$str = "0123456789";

function somme($str){
    echo $str."<br>";
    if(strlen($str) > 1) {
        // additionner les deux premiers caratères de la chaine
        $n = $str[0] + $str[1];
        // reconstruire la nouvelle chaine de caractères
        $str = $n.substr($str, 2, strlen($str));
        // c'est ici que la récursivité entre en jeu puisque la fonction s'appelle elle même.
        somme($str);
    }
}

somme($str);

Utilisée tel quelle cette fonction affichera ceci:

0123456789
123456789
33456789
6456789
1056789
156789
66789
12789
3789
1089
189
99
18
9

La grande difficulté avec la récursivité consiste à éviter d'entrer dans une boucle infinie. Dans mon exemple, même si vous entrer un nombre incroyablement grand sa somme sera toujours comprise entre 1 et 9. C'est finalement la condition if(strlen($str) > 1) (autrement dit tant que la chaîne est composée de plus de 1 caractère) qui mettra un terme à la redondance une fois que la condition n'est plus vraie.

01-Sep-2021
^