Astuces
|
<?php
sleep(1); // attendre 1 seconde
?>
# CLI
php -a
|
Lancer un serveur de développement
|
cd /path/mon/code/php
php -S localhost:8080
|
Écrire dans le fichier de log (/var/log/nginx/error.log)
|
error_log("message");
// print_r permet de transformer une variable en string
error_log(print_r($variable, true));
|
|
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
|
// 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
|
// 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
|
if ($a == $b && $a != $b || !&a) { .. }
elseif ($a > $b && $a <= $b) { ... }
else { ... }
|
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)
|
if (empty($variable)) { ... }
|
isset, is_null
|
// 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
|
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
|
for ($i = 1; $i <= 10; $i++) {
echo $i;
break;
continue;
}
|
Tableau / Array
|
$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
|
|
// [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
|
// 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. |
|
$file_content = file_get_contents("mon_fichier.txt");
if ($file_content === false)
echo "impossible de lire le contenu du fichier mon_fichier.txt";
|
|
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
|
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. |
|
$files = scandir('dossier');
// [0] => . [1] => .. [2] => file1 [3] => file2
for ($i = 2; $i <= count($files); $i++) {
echo "dossier/$files[$i]";
}
|
Ancienne méthode
|
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
|
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
|
$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
|
$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
|
substr("abcdef", 0, 2); // retourne "ab"
substr("abcdef", -2); // retourne "ef"
substr("abcdef", -3, 1); // retourne "d"
|
MAJUSCULE / minuscule
|
$var = strtolower('PHP'); // php
$var = strtoupper('php'); // PHP
|
|
$chiffres_string = "1,2,3";
$chiffres_tableau = explode(",", $chiffres_string);
echo $chiffres_tableau[0]; // 1
echo $chiffres_tableau[1]; // 2
|
Expressions rationnelles
|
if (preg_match('/id=(\d+)$/', "http://www.url.com?id=666", $matches))
{
// matches:
// 0 => string 'id=666'
// 1 => string '666'
$id = $matches[1];
}
|
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).
|
trim(' un mot - en passant - ', ' -'); // un mot - en passant
|
DateTime
|
$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()
// par défaut avec la locale courante, sinon redéfinir la locale
setlocale(LC_TIME, "fr_CH");
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
|
|
// définit la timezone depuis le code
date_default_timezone_set("Europe/Paris");
|
POO
Classe
|
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 |
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.
|
// 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';
}
|
Enum
|
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
|
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 = 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("command arg1 arg2 2>&1", $output, $return_var); // $output est un tableau de string
if ($return_var == 0) { /* ok */ }
# forcer la locale
putenv('LC_TIME=fr_CH');
|
JSON
|
'movie' =>
array (size=2)
'title' => string 'Las Vegas parano'
'originalTitle' => string 'Fear and Loathing in Las Vegas'
|
|
// 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.
|
|
// 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
|
$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
|
$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
// 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
|
$html = file_get_contents("http://url");
|
Afficher les erreurs dans la page
|
ini_set('display_errors', 1);
|
/etc/php/php.ini
|
display_errors = on
|
Input Form
|
<!-- $_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
++
|
$a = 1;
$a++;
echo "Variable a : $a";
echo "Variable a : ".$a++;
|
Opérateurs d'incrémentation et décrémentation
|
composer require athari/yalinqo
|
|
$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;
});
|
Nombre aléatoire
|
// un nombre aléatoire entre 0 et 10 inclus
$random_number = mt_rand(0, 10);
|
Tester si une variable est numérique
|
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 phpinfo(); ?>
|
$_SERVER variable
|
'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
|
$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;
|
Permet d'afficher les caractères accentués.
|
<?php
header('Content-Type: text/html; charset=utf-8');
?>
|
Rediriger automatiquement vers une autre page
|
<?php
// redirection relative vers dossier
header("Location: dossier/");
// redirection absolue vers un autre site
header("Location: http://un.autre.site/dossier/");
exit();
?>
|
|
location.href = http://un.autre.site/dossier/;
|
|
<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
|
// 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;
}
}
|
Téléchargez les sources
Online PHP interpreter
codepad viper-7