PHP

De Banane Atomic
Aller à la navigationAller à la recherche

Astuces

Php.svg
<?php
sleep(1);  // attendre 1 seconde
?>

Lancer un serveur de développement

Bash.svg
cd /path/mon/code/php
php -S localhost:8080

Écrire dans le fichier de log (/var/log/nginx/error.log)

Php.svg
error_log("message");

// print_r permet de transformer une variable en string
error_log(print_r($variable, true));

var_dump

Php.svg
var_dump($array);
Si xdebug est installé, la profondeur d'exploration est limitée par la variable xdebug.var_display_max_depth du fichier /etc/php/conf.d/xdebug.ini

Les variables globales

Php.svg
// variables globales
$a = 1;
$b = 2;
$c = 3;

function test() {
    global $b;

    // utilisation de la variable locale a (elle est vide)
    echo $a;

    // utilisation de la variable globale b car déclarée au début de la fonction
    echo $b;
    
    // utilisation de la variable globale c car appelée au travers du tableau associatif $GLOBALS
    echo $GLOBALS['c'];
}

Portée des variables

Les fonctions

Php.svg
// Déclaration de fonction
function ma_fonction($argument1, $argument2="2") {
    // retour de la fonction
    return "ok : $argument1 $argument";
}

// Utilisation de la fonction
echo ma_fonction("1");

if

Php.svg
if ($a == $b && $a != $b || !&a) { .. }
elseif ($a > $b && $a <= $b) { ... }
else { ... }

empty

Retourne vrai si $variable n'existe pas ou si elle est vide. Étant considéré comme vide:

  • "" (une chaîne vide)
  • 0, 0.0, "0"
  • NULL, FALSE
  • array() (un tableau vide)
  • $var; (une variable déclarée, mais sans valeur)
Php.svg
if (empty($variable)) { ... }

isset, is_null

Php.svg
// Détermine si une variable est définie et est différente de NULL
if (isset($variable)) { ... }

// Indique si la variable donnée vaut NULL.
if (is_null($variable)) { ... }

test type

Php.svg
if (is_bool($variable)) { ... }

if (is_string($variable)) { ... }

// vrai si $variable est un entier, un float ou un string contenant un entier ou un float
if (is_numeric($variable)) { ... }

if (is_array($variable)) { ... }

if (is_object($variable)) { ... }

for

Php.svg
for ($i = 1; $i <= 10; $i++) {
    echo $i;
    break;
    continue;
}

Tableau / Array

Php.svg
$tableau = array(1, 2, 3);
foreach ($tableau as $value) {
    echo $value;
}

// test si un élément est contenu dans le tableau
if (in_array(1, $tableau)) { ... }

// taille du tableau / nombre d'éléments
$taille = count($tableau);

// ajoutez un élément
array_push($tableau, 4);

// remplir le tableau de n valeurs
array_fill($start_index , $number , $value);

// to string
implode("|", $tableau) // 1|2|3

array map

Php.svg
// [1,2,3,4,5] → [2,4,6,8,10]
$new_array = array_map(
    function ($value) {
        return $value * 2;
    }, 
    range(1, 5)
);

// [1,2,3] & [4,5,6] → [5,7,9]
$array_1 = array(1, 2, 3);
$array_2 = array(4, 5, 6);
$new_array = array_map(
    function ($value_1, $value_2) {
        return $value_1 + $value_2;
    }, 
    $array_1,
    $array_2
);

Dictionnaire

Php.svg
// tableau clé-valeur
$tableau = array('clé1' => 1, 'clé2' => 2);
echo $tableau['clé1']; // 1

// ajoutez un élément
$tableau['clé3'] = 3;

// tester si une clé existe
if (array_key_exists('clé1', $tableau)) { ... }

// listez les clés ou les valeurs
foreach (array_keys($tableau) as $key) { ... }
foreach (array_values($tableau) as $value) { ... }

// rechercher un objet et obtenir sa clé
if(($key = array_search($item, $items, true)) !== FALSE) {
    // $key
}

// to string key=value
echo implode('<br>', array_map(
    function ($v, $k) { return sprintf("%s='%s'", $k, $v); },
    $_SERVER,
    array_keys($_SERVER)
));
Les clés ne peuvent être que du type integer ou string.

Lire un fichier

Php.svg
$file_content = file_get_contents("mon_fichier.txt");

if ($file_content === false)
    echo "impossible de lire le contenu du fichier mon_fichier.txt";

Écrire dans un fichier

Php.svg
if (file_put_contents("mon_fichier.txt", "données", FILE_APPEND) === false)
    echo "impossible d'écrire dans le fichier mon_fichier.txt";
Si le fichier n'existe pas il est créé.
Le contenu du fichier est écrasé si FILE_APPEND n'est pas utilisé.

Manipulation de fichiers et de dossiers

Php.svg
if (is_link($path)) { 
    $target = readlink($path);
}
elseif (is_dir($path)) { ... }
elseif (is_file($path)) { ... }
is_dir et is_file résolvent les liens symboliques.

Lister le contenu d'un dossier

Php.svg
$files = scandir('dossier');
// [0] => .  [1] => ..  [2] => file1  [3] => file2

for ($i = 2; $i <= count($files); $i++) {
  echo "dossier/$files[$i]";
}

Ancienne méthode

Php.svg
if ($handle = opendir($path_to_directory)) {
    while (($file = readdir($handle)) !== false) {
        // if ($file != "." && $file != "..")
        $path = $directory.'/'.$file;
        if (is_file($path))
        {
            echo "$path<br>";
        }
    }
    closedir($handle);
}
Avec .. , is_file peut causer l'erreur: open_basedir restriction in effect. File(/path/..) is not within the allowed path(s)

Opérations sur les path

Php.svg
basename("/chemin/vers/un/dossier");             // dossier
basename("/chemin/vers/un/fichier.ext");         // fichier.ext
basename("/chemin/vers/un/fichier.ext", ".ext"); // fichier

dirname("/chemin/vers/un/dossier");              // /chemin/vers/un
dirname("/chemin/vers/un/fichier.ext");          // /chemin/vers/un

$path_parts = pathinfo('/chemin/vers/un/fichier.ext');
$path_parts['dirname'];                          // /chemin/vers/un
$path_parts['basename'];                         // fichier.ext
$path_parts['extension'];                        // ext
$path_parts['filename'];                         // fichier

pathinfo('/chemin/vers/un/fichier.ext', PATHINFO_EXTENSION); // ext

realpath('.');                                   // /chemin/absolu/vers/point

String

Concaténer des string

Php.svg
$phrase = "$mot1 mot_deux $mot3";
// pour ne pas être pris en compte $ doit être utilisé avec le caractère d'échappement \$
$phrase = $mot1 . 'mot_deux'. $mot3;

// ajout à la suite
$phrase .= "mot quatre";

Remplacement dans un string

Php.svg
$var = str_replace(" ", "%20", "dossier/mon fichier.jpg");  // dossier/mon%20fichier.jpg

// expression rationnelles
$pattern = '/\[.+?\]/i';
preg_replace($pattern, '','mon [petit] fichier');  // mon  fichier

Découper un string

Php.svg
substr("abcdef", 0, 2);  // retourne "ab"
substr("abcdef", -2);    // retourne "ef"
substr("abcdef", -3, 1); // retourne "d"

MAJUSCULE / minuscule

Php.svg
$var = strtolower('PHP'); // php
$var = strtoupper('php'); // PHP

To Array (split, explode)

Php.svg
$chiffres_string  = "1,2,3";
$chiffres_tableau = explode(",", $chiffres_string);
echo $chiffres_tableau[0]; // 1
echo $chiffres_tableau[1]; // 2

Expressions rationnelles

Php.svg
if (preg_match('/id=(\d+)$/', "http://www.url.com?id=666", $matches))
{
    // matches:
    // 0 => string 'id=666'
    // 1 => string '666'
    $id = $matches[1];
}

Trim

Supprime au début et à la fin de la chaine les caractères spécifiés (par défaut: espace, \t, \n, \r, \0, \x0B).

Php.svg
trim(' un mot - en passant - ', ' -');  // un mot - en passant

DateTime

Php.svg
$date = new DateTime('1984-01-30');
$date = date_create('1984-01-30'); // alias PHP 5 de new DateTime
$date = date_create_from_format('d/m/Y', '13/12/2013');

echo $date->format('d F Y'); // 30 January 1984
echo date_format($date, 'd F Y'); // alias PHP 5 de DateTime::format()

// Avec la configuration locale
echo strftime('%e %B %Y' ,$date->getTimestamp()); // 30 Janvier 1984

date(): It is not safe to rely on the system's timezone settings

date(): It is not safe to rely on the system's timezone settings. 
You are *required* to use the date.timezone setting or the date_default_timezone_set() function. 
In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier.
We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone.

L'utilisation de la fonction date() sans avoir définit la timezone entraine l’apparition de ce warning.

/etc/php/php.ini
; définit la timezone dans la configuration de php
date.timezone = Europe/Paris
Php.svg
// définit la timezone depuis le code
date_default_timezone_set("Europe/Paris");

POO

Classe

Php.svg
class MaClasse extends ClasseParente
               implements MonInterface {
    private $Attribut = 0;
    public function Méthode() {
       return $this->Attribut++;
    }

    // Constante de classe: non modifiable.
    const CONSTANT = 'valeur constante';
    // Utilisation dans la classe: self::$CONSTANT
    // Utilisation hors de la classe: MaClasse::$CONSTANT

    // Attribut statique
    public static $StaticAttribut = 'variable statique';
    // Utilisation dans la classe: self::$StaticAttribut
    // Utilisation hors de la classe: MaClasse::$StaticAttribut

    // Constructeur, appelé par new
    function __construct() { ... }
    // autre constructeur
    function __construct($var1)
    {
        $this->Attribut = $var1;
    }
    // Destructeur, appelé dès qu'il n'y a plus de référence sur un objet donné
    function __destruct() { ... }
}

// Instanciation
$ma_classe = new MaClasse();
$ma_classe->Attribut;
$ma_classe->Méthode();
MaClasse::$StaticAttribut;

Les classes et les objets

Par défault les méthodes et attribut sont public
Les constantes sont exclusivements public
Une classe ne peut être déclarée static. On utilisera abstract à la place et des attributs static ou const.
Les attributs static ne sont persistants qu'au sein d'une même page.
Pour faire persister des données au travers de différentes pages, il faut utiliser Session

Auto-chargement de classes

Permet d'éviter d'avoir à écrire une longue liste d'inclusions de fichier de classes au début de chaque script.
La fonction __autoload() sera automatiquement appelée lors de l'utilisation d'une classe ou interface qui n'est pas encore définie. Cette méthode donne une dernière chance pour inclure une définition de classe.

Php.svg
// le fichier php a inclure doit avoir le même nom que la classe.
spl_autoload_register(function ($class) {
    require_once $class . '.php';
});

// Méthode __autoload obsolète
function __autoload($class) {
    require_once $class . '.php';
}
La fonction spl_autoload_register est amené à remplacer la fonction __autoload().

Enum

Php.svg
abstract class Enum {
    private static $constCache = NULL;
    
    private static function getConstants() {
        if (self::$constCache === NULL) {
            $reflect = new ReflectionClass(get_called_class());
            self::$constCache = $reflect->getConstants();
        }

        return self::$constCache;
    }
    
    public static function DisplayName($value) { 
        return array_keys(self::getConstants())[$value - 1];
    }
    
    public static function AllValues() {
        return array_keys(self::getConstants());
    }
}

abstract class MonEnum extends Enum {
    const Valeur1 = 1;
    const Valeur2 = 2;
}

echo MonEnum::DisplayName(MonEnum::Valeur1); // Valeur1

foreach (MonEnum::AllValues() as $value) { ... }

Trait

Php.svg
trait MonTrait {
    public function Méthode() { ... }
    public static function MéthodeStatic() { ... }
    public $Attribut = 1;
}

class MaClasse {
    use MonTrait;
}

MaClasse::MéthodeStatic();
$maClasse = new MaClasse();
$maClasse->Méthode();
A la différence de l'héritage, si un trait a une propriété publique, chaque classe qui utilise le trait a une instance indépendante (non partagée) de cette propriété.

Reflection

Php.svg
$reflection = new ReflectionClass('MaClasse');
$constants = $reflection->getConstants();

// obtenir le nom de la classe courante où est écrit le code
$classe = get_class();
// obtenir le nom d'une classe depuis son objet
$classe = get_class($this);
// obtenir le nom de la classe courante depuis une méthode static
$classe = get_called_class();

get_class

exec

Php.svg
exec("command arg1 arg2 2>&1", $output, $return_var);  // $output est un tableau de string
if ($return_var == 0) { /* ok */ }

JSON

Javascript.svg
'movie' => 
    array (size=2)
      'title' => string 'Las Vegas parano'
      'originalTitle' => string 'Fear and Loathing in Las Vegas'
Php.svg
// Convertit une chaîne JSON en un tableau associatif
$data = json_decode($json, true);
$data['movie']['title']; // Las Vegas parano

// Convertit une chaîne JSON en objet
$mon_objet = new MaClasse();
foreach ($json as $key => $value) {
    $mon_objet->{$key} = $value;
}

// Convertit un objet en une chaîne JSON
$json = json_encode($objet, JSON_PRETTY_PRINT);
//  JSON_PRETTY_PRINT: Use whitespace in returned data to format it.
Php.svg
// Redéfinir la méthode json_encode
class MaClasse implements JsonSerializable {
    public function jsonSerialize() {
        return [ 'movie' => [
            'title' => $this->Title,
            'originalTitle' => $this->OriginalTitle
        ]];
    }
}

$maClasse = new MaClasse();
$json = json_encode($maClasse, JSON_PRETTY_PRINT); // utilisation de la surcharge de jsonSerialize

json_decode
json_encode

DOM

Php.svg
$dom = DOMDocument::loadXML('<node attribut="attribut value">text content</node>');
$node = $doc->getElementsByTagName('node')->item(0);
echo $node->textContent; // text content

// remplacer le texte
$node->removeChild($node->firstChild);
$node->appendChild(new DOMText('new content'));

$node->getAttribute('attribut'); // attribut value
$node->setAttribute("attibut", "new value"); // remplace la valeur de l'attribut
$node->removeAttribute('attribut'); // supprime l'attribut

XPath

Php.svg
$dom = new DOMDocument;
// @ pour éviter l'affichage des Warnings
@$dom->loadHTML($html);

$xpath = new DOMXPath($dom);
$query = '//div';
$entries = $xpath->query($query);

echo $entries->length." resultats.<br/>";

foreach ($entries as $entry) {
    echo "$entry->tagName ; $entry->nodeValue<br/>";
}

if($entries->length > 0)
{
    echo $dom->saveHTML($entries->item(0)); // affiche le code HTML
}

Session

Permet un stockage temporaire de données par utilisateur.

Php.svg
<?php 
// Appeler l'auto-chargement de classes avant session_start
// pour éviter l'erreur «The script tried to execute a method or access a property of an incomplete object»
spl_autoload_register(function ($class) {
    require_once $class . '.php';
});

// Appeler session_start avant la balise html et dans chaque page où $_SESSION est utilisé
session_start(); 
?>

<html>
<body>
    <?php        
    $_SESSION['clé'] = 'valeur';

require vs include

En cas d'échec:

  • include génère un warning et le script continue
  • require génère une erreur et le script stoppe

Les variantes include_once et require_once permettent de s'assurer que le fichier ne sera inclut qu'une seule fois.

Stocker le code d'une page dans une variable

Php.svg
$html = file_get_contents("http://url");

Afficher les erreurs dans la page

Php.svg
ini_set('display_errors', 1);
/etc/php/php.ini
display_errors = on

Input Form

Html.svg
<!-- $_SERVER['PHP_SELF'] permet d'obtenir le chemin vers le fichier courant et donc de recharger la page elle-même -->
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
    Texte: <input type="text" name="identifiant du champs input">

    <!-- menu déroulant dynamique -->
    <select name="identifiant du select">
        <option value="">--- Select ---</option>
        <?php
        foreach ($tous_les_choix as $choix) {
            echo '<option value="' . $choix . '">' . $choix . '</option>';
        }
        ?>
    </select>

    <input type="submit" name="identifiant du bouton" value="texte affiché dans le bouton">
</form>

<?php
$texte = $_POST["identifiant du champs input"];
if (isset($_POST["identifiant du bouton"])) { /* test si on a appuyé sur le bouton */
    echo "TEXTE: $texte";
}
?>
Si l'on utilise la méthode get le dictionnaire contenant les valeurs sera $_GET

POST

++

Php.svg
$a = 1;
$a++;

echo "Variable a : $a";
echo "Variable a : ".$a++;

Opérateurs d'incrémentation et décrémentation

YaLinqo: Yet Another LINQ to Objects for PHP

Bash.svg
composer require athari/yalinqo
Php.svg
$id = 5;

$i = from($items)->single('$v["id"] == $id');

// Closure syntax, utilise use car $id est en dehors du scope de function
$i = from($items)->single(function($item) use($id) {
    return $item->id == $id;
});
Bug Function create_function() is deprecated.
En attendant PHP 7.3 utiliser la syntaxe closure.

Nombre aléatoire

Php.svg
// un nombre aléatoire entre 0 et 10 inclus
$random_number = mt_rand(0, 10);

Tester si une variable est numérique

Php.svg
if (is_numeric ($maVariable))
  // test si maVariable est un type numérique

if (is_int ($maVariable))
  // test si maVariable est un entier

Informations sur le serveur

Php.svg
<?php phpinfo(); ?>

$_SERVER variable

Php.svg
'UNIQUE_ID' => string 'UlLqJ8CoAAEAAB7dBHEAAAAE' (length=24)
  'HTTP_HOST' => string 'xxx' (length=3)
  'HTTP_USER_AGENT' => string 'Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0' (length=68)
  'HTTP_ACCEPT' => string 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' (length=63)
  'HTTP_ACCEPT_LANGUAGE' => string 'fr-fr,en-us;q=0.7,en;q=0.3' (length=26)
  'HTTP_ACCEPT_ENCODING' => string 'gzip, deflate' (length=13)
  'HTTP_DNT' => string '1' (length=1)
  'HTTP_CONNECTION' => string 'keep-alive' (length=10)
  'PATH' => string '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin' (length=49)
  'SERVER_SIGNATURE' => string '<address>Apache/2.2.25 (Unix) DAV/2 PHP/5.5.4 mod_perl/2.0.8 Perl/v5.18.1 Server at xxx Port 80</address>
' (length=106)
  'SERVER_SOFTWARE' => string 'Apache/2.2.25 (Unix) DAV/2 PHP/5.5.4 mod_perl/2.0.8 Perl/v5.18.1' (length=64)
  'SERVER_NAME' => string 'xxx' (length=3)
  'SERVER_ADDR' => string '127.0.0.1' (length=9)
  'SERVER_PORT' => string '80' (length=2)
  'REMOTE_ADDR' => string '127.0.0.1' (length=9)
  'DOCUMENT_ROOT' => string '/srv/http/xxx' (length=13)
  'SERVER_ADMIN' => string 'you@example.com' (length=15)
  'SCRIPT_FILENAME' => string '/srv/http/xxx/index.php' (length=23)
  'REMOTE_PORT' => string '42707' (length=5)
  'GATEWAY_INTERFACE' => string 'CGI/1.1' (length=7)
  'SERVER_PROTOCOL' => string 'HTTP/1.1' (length=8)
  'REQUEST_METHOD' => string 'GET' (length=3)
  'QUERY_STRING' => string '' (length=0)
  'REQUEST_URI' => string '/index.php' (length=10)
  'SCRIPT_NAME' => string '/index.php' (length=10)
  'PHP_SELF' => string '/index.php' (length=10)
  'REQUEST_TIME_FLOAT' => float 1381165607.717
  'REQUEST_TIME' => int 1381165607

URL de la page courante

Php.svg
$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? 'https' : 'http';
$protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === FALSE ? 'http' : 'https';
$host = $_SERVER['HTTP_HOST'];
$script = $_SERVER['SCRIPT_NAME'];
$params = $_SERVER['QUERY_STRING'];
$currentUrl = $protocol . '://' . $host . $script . '?' . $params;

Modifier le header

Permet d'afficher les caractères accentués.

Php.svg
<?php
header('Content-Type: text/html; charset=utf-8');
?>

Rediriger automatiquement vers une autre page

Php.svg
<?php
// redirection relative vers dossier
header("Location: dossier/");
// redirection absolue vers un autre site
header("Location: http://un.autre.site/dossier/");

exit();
?>
Javascript.svg
location.href = http://un.autre.site/dossier/;
Html.svg
<META http-equiv="refresh" content="5;URL=http://un.autre.site/dossier/">

Master Page

MasterPage.php
<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8">
        <!-- Scripts et CSS communs -->
        <title></title>
    </head>
    <body>
        <!-- Titre -->
        <!--Menu-->
        <?php
        echo $content;
        ?>
        <!--Footer-->
    </body>
</html>
Page1.php
<?php
// ajout de CSS ou de Javascript spécifique pour cette page
$content .= '<link href="style.less" rel="stylesheet/less" type="text/css" />';
$content .= '<script src="less-1.5.0.min.js"></script>';

$content .= 'Contenu de la page 1';

include('MasterPage.php');
?>

Web API

Php.svg
// required headers
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
header("Content-Type: application/json; charset=UTF-8");

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    $arg1 = filter_input(INPUT_GET, 'arg1', FILTER_SANITIZE_STRING);
    $arg2 = filter_input(INPUT_GET, 'arg2', FILTER_SANITIZE_STRING);

    switch ($arg1) {
        case 'xxx':
            MakeResponse('data');
            break;
        case 'yyy':
            MakeResponse('data');
            break;
        default:
            MakeResponse('error', 400);
    }
}
else if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // lecture du body
    $body = file_get_contents('php://input');
    $body = json_decode(file_get_contents("php://input"));
}

function MakeResponse($data, $response_code = 200) {
    // set response code - 200 OK
    http_response_code($response_code);
    echo json_encode($data);
}
/etc/nginx/nginx.conf
server {
    listen      80;
    server_name mywebapiserver;
    root        /srv/http/mywebapiserver;
    index       index.php;
    
    rewrite ^/api/([^/]+)/([^/]+)/?$ /api/api.php?arg1=$1&arg2=$2 last;
        
    location = /api/api.php {
        fastcgi_pass    unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index   api.php;
        include         /etc/nginx/fastcgi.conf;
    }
}

Customisez Index of

Téléchargez les sources

Online PHP interpreter

codepad viper-7