DEV Community

Cover image for Apprendre le PHP : require, include, manipulation fichiers et enumerations
 Eric Le Codeur
Eric Le Codeur

Posted on

Apprendre le PHP : require, include, manipulation fichiers et enumerations

Aujourd'hui, vous apprendrez les instructions "require" et "include", la manipulation de fichiers et les énumérations.

Ce cours accéléré PHP est gratuit et sera publié ici sur dev.to. Je publierai un nouvel article tous les deux jours environ. Pour ne rien manquer, vous pouvez me suivre sur twitter : Follow @EricLeCodeur

require et include

Jusqu’a présent nous avons créer seulement un fichier PHP pour tous nos tests.

Lors de la création d’une application il en sera presque toujours autrement. Très rapidement nous aurons besoin de diviser/organiser notre code en plusieurs fichiers.

Ici nous verrons deux instructions qui permettent d’exécuter du code qui à été définit dans un autre fichier.

Pour ce faire nous allons créer deux fichiers. Le premier nommé message.php et écrire le code suivant

<?php

function sendMessage(string $message)
{
    echo $message . '<br>';
}
Enter fullscreen mode Exit fullscreen mode

Ici c’est du code simple de chez simple. Une petite fonction qui affiche un message et un saut de ligne.

Ensuite, créer le second fichier nommé index.php et écrire le code suivant

<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <?php
        require 'message.php';
        sendMessage('Hello World');
    ?>
</body>

</html>
Enter fullscreen mode Exit fullscreen mode

Dans cet exemple, on découvre l’instruction require. Elle permet d’inclure le code du fichier message.php. Donc, par conséquent, permet l’utilisation de la fonction sendMessage()

Que se passe t’il si le fichier spécifié comme paramètre n’existe pas ? Dans ce cas, PHP retournera une erreure.

L’instruction include

Permet de faire exactement la même chose que require sauf que PHP ne retournera pas une erreure (seulement un Warning) si le fichier à inclure n’est pas présent.

require_once et include_once

Ces instructions sont identiques à leur instructions sœur (require et include). La différence c’est que PHP va inclure le fichier seulement s'il ne l’a pas déjà fait.

Manipulation de fichiers et dossiers

PHP inclut plusieurs fonctions pour manipuler les dossiers et fichier sur le serveur

Voici quelques fonctions très utiles

Créer un fichier

file_put_contents("test.txt", "Hello World!");
Enter fullscreen mode Exit fullscreen mode

Cette fonction va créer le fichier test.txt (dans le dossier en cours) avec le contenu ‘Hello World’.

Il est possible de spécifier le dossier.

file_put_contents("data/test.txt", "Hello World!");
Enter fullscreen mode Exit fullscreen mode

Si le dossier n’existe pas, PHP retournera un warning

Vous pouvez créer le dossier avec la fonction mkdir

mkdir('data');

file_put_contents("data/test.txt", "Hello World!");
Enter fullscreen mode Exit fullscreen mode

À noter que pour effacer un dossier vous pouvez utiliser la fonction rmdir(). Le dossier doit être vide afin que sa suppression soit possible.

Si vous désirez créer le fichier dans un dossier qui est parent au dossier en cours utilisez les deux points . .

file_put_contents("../test.txt", "Hello World!");
Enter fullscreen mode Exit fullscreen mode

Le fichier sera créé dans le dossier parent

Si le fichier existe déjà, la fonction file_put_contents va remplacer le fichier existant. Si votre objectif est d’ajouter au fichier existant, utiliser l’option FILE_APPEND

file_put_contents("test.txt", "Hello World!", FILE_APPEND);
Enter fullscreen mode Exit fullscreen mode

Lire un fichier

$content = file_get_contents("test.txt");
Enter fullscreen mode Exit fullscreen mode

Si le fichier n’existe pas, PHP va retourner un warning

Pour vérifier si le fichier existe vous pouvez utiliser la fonction file_exists()

if (file_exists('/posts/first.txt')) {
  // do some stuff
}
Enter fullscreen mode Exit fullscreen mode

Lire un fichier ligne par ligne

La fonction précédente permettait de lire un fichier d’un coup. Il existe une fonction pour lire ligne par ligne.

$file = fopen("test.txt", "r");

while(! feof($file)) {
  $line = fgets($file);
  echo $line. "<br>";
}
fclose($file);
Enter fullscreen mode Exit fullscreen mode

ici le fichier est ouvert avec l’option ‘r’ pour read.

Le bloc de code va s’exécuter tant que la fin du fichier n’est pas détectée feof()

Écrire dans un fichier ligne par ligne

$file = fopen('export.csv', 'w');
Enter fullscreen mode Exit fullscreen mode

Ici le fichier est ouvert avec l’option ‘w’ pour créer ou overwrite. Si on aurait voulu faire un ajout on aurait pu utiliser l’option ‘a’ pour append

Une fois le fichier ouvert on peut insérer des lignes

$array = [
    ['name' => 'Mike', 'age' => 45],
    ['name' => 'John', 'age' => 38],
];

//Write key name as csv header
fputcsv($file, array_keys($array[0]));

//Write lines (format as csv)
foreach ($array as $row) {
    fputcsv($file, $row); 
}
fclose($file);
Enter fullscreen mode Exit fullscreen mode

La fonction fputfile() permet d’écrire des lignes. Ici nous avons plustot utiliser sa fonction soeur fputcsv() qui fait sensiblement la même chose mais au format csv.

À noter que nous avons utilisé un fputcsv avant la boucle. Cette ligne sera la première ligne du fichier et devra inclure le nom des colonnes. La fonction array_keys() permet justement de récupérer le nom des clé du tableau (name et age)

Énumérations

Les énumérations, ou "Enums" permettent de définir un “type” personnalisé qui se limitera à l'une des valeurs possibles parmi celle spécifiée. Les Enums sont un type d’objet et peuvent donc être utilisés partout ou un objet peut être utilisé.

Voici un exemple de déclaration

// Définir le nom et les valeurs posssible
enum InvoiceStatus
{
    case Sent;
    case Paid;
    case Cancelled;
}
Enter fullscreen mode Exit fullscreen mode

Cette déclaration crée un type InvoiceStatus qui peut avoir seulement trois valeurs

InvoiceStatus::Sent

InvoiceStatus::Paid

InvoiceStatus::Cancel

Il est possible d’utiliser ce type dans une fonction avec type hint

function printInvoiceStatus(InvoiceStatus $status)
{
    print($status->name);
}

printInvoiceStatus(InvoiceStatus::Sent);
// Sent
Enter fullscreen mode Exit fullscreen mode

La propriété name permet de récupérer le nom du case

Il est possible d’associé une valeur pour chacun des “case”. Pour ce faire il faut absolument spécifier le type du enum lors de sa déclaration : ex. enum InvoiceStatus : int

Il est également possible d’ajouter une méthode à notre enum

enum InvoiceStatus : int
{
    case Sent = 0;
    case Paid = 1;
    case Cancelled = 2;
}

print(InvoiceStatus::Paid->value);
Enter fullscreen mode Exit fullscreen mode

La propriété value permet de récupérer la valeur associée au “case”

Tout comme un objet, il est possible d’ajouter une méthode au Enum

enum InvoiceStatus : int
{
    case Sent = 0;
    case Paid = 1;
    case Cancelled = 2;

    public function text() : string
    {
        return match ($this) {
            self::Sent => 'Sent',
            self::Paid => 'Paid',
            self::Cancelled => 'Cancelled'
        };
    }
}

function getInvoiceStatus(InvoiceStatus $status)
{
    print($status->text());
    print($status->value);
}

getInvoiceStatus(InvoiceStatus::Paid);
// Paid1
Enter fullscreen mode Exit fullscreen mode

Conclusion

C'est tout pour aujourd'hui, je publierai un nouvel article tous les deux jours environ. Pour être sûr de ne rien rater vous pouvez me suivre sur twitter : Suivre @EricLeCodeur

Discussion (2)

Collapse
duboiss profile image
Steven

Hello,

include & require s'écrivent sans parenthèses, ce ne sont pas des fonctions mais des instructions :)

Collapse
ericlecodeur profile image
Eric Le Codeur Author

Oups tu as raison, je viens de faire la correction. A noter que si on inclut les parenthèses, PHP va tout de même executer le code sans erreur mais ce n'est définitivement pas la bonne pratique a suivre.

Merci pour ton commentaire