##1. Structure du fichier source
####En C : script.c
#include <stdio.h>
void main(){
// commentaire
// Code ici !
printf("Hello world");
}
####En PHP : script.php
<?php
echo "Hello world";
?>
##2. Exécution du script
####En C : Compilation :
gcc script.c -o script
Exécution :
./script
####En PHP : Exécution (langage non compilé)
php script.php
##3. Définition de variables ####En C :
int a = 1; // int = nombre entier, double = grand entier, float = nombre à virgule, char = caractère
double b = 1;
float f = 1.1;
char c = 'a';
char chaine[80] = "Hello world"; // une chaine de caractères est un tableau de caractères dont on doit allouer une taille max
####En PHP :
$a = 1; // le typage est flexible et dynamique, php devine le type et on peut réattribuer une valeur d'un autre type à la même variable.
$a = 1.1;
$a = "Hello world!";
##3. Entrées / sorties ###3.1 Lire une saisie utilisateur ####En C :
char chaine[80] = "";
scanf("%s", chaine);
int nombre ;
scanf("%d", &nombre);
####En PHP :
$chaine = fgets(STDIN);
###3.2 Ecrire une variable à l'écran ####En C :
char chaine[80] = "Coucou";
printf("%s", chaine)
int nombre = 8;
printf("%d", nombre);
####En PHP :
$ma_variable = "Hello";
echo $ma_variable;
###3.3 Interpolation (écrire une variable dans une chaine de caractères) ####En C :
double variable = 12;
printf("Ma variable est %d", variable);
####En PHP :
$ma_variable = 12;
echo "Ma variable est {$ma_variable}";
##4. Structures de code ###4.1 Si ... alors ####En C :
int note = 12;
if( note > 12 ){
// alors
// (assez bien)
} else if ( $note > 10 ) {
// ou alors si
// (passable)
} else {
// sinon
// (insuffisant)
}
####En PHP (c'est pareil, sauf l'écriture de la variable --normal--) :
$note = 12;
if( $note > 12 ){
// alors
// (assez bien)
} else if ( $note > 10 ) {
// ou alors si
// (passable)
} else {
// sinon
// (insuffisant)
}
###4.2 Cas ... alors ####En C :
char c = 'a';
switch(c){
case 'a' :
// du code qui s'exécute si c == 'a'
break;
case 'b' :
// du code qui s'exécute si == 'b'
// note : Si on a pas mis de break dans le cas précédent, le code ici s'exécute aussi
break;
default:
// du code qui s'execute dans tous les cas
// note : Si on a pas mis le break dans les cas précédents, le code ici s'exécute aussi
}
####En PHP, c'est pareil (sauf l'écriture des variables comme ci-avant) !
###4.3 Pour i
allant de 0
à 4
par pas de 1
####En C :
for(int i = 0 ; i < 5 ; i ++){ // i ++ est un raccourci pour i = i + 1 ou
printf("%d", i);
}
####En PHP, c'est pareil
for($i = 0 ; i < 5 ; i ++){
echo $i
}
####Variante pour i
allant de 0
à 8
par pas de 2
// En C, mais c'est pareil en php
for(int i = 0 ; i < 9 ; i = i + 2){
printf("%d", i);
}
###4.4 Tant que la condition
est vraie, faire ...
####En C (c'est pareil en PHP) :
int c = 0;
while( c < 5 ){
// le code est exécuté et répété autant de fois que la condition est vraie
c = c + 1;
}
// Strictement équivalent à :
for(int c = 0 ; c < 5 ; c++){
// Et pour cause, un for c'est un juste while raccourci
}
###4.5 Faire ... tant que la condition
est vraie
do{
// ici, le code s'exécute au moins une fois, puisque le test est effectué plus bas
} while( condition );
##5 Les tableaux ###5.1 une dimensions ####En C :
int tab[3] = {1, 12, 15}; // un tableau d'entiers de trois cases
tab[1]; // vaut 12
####En PHP :
$tab = [1, 12, 15];
$tab[1]; // vaut 12 aussi
###5.2 deux dimensions ####En PHP (c'est pareil en C)
$tab = [[1, 12, 15],[5, 56, 24]];
$tab[0][1]; // vaut 12 : valeur dans la 1ème case de la deuxième dimension de la 0ème case de la première dimension
// autrement dit, 1ère ligne, 2è colonne
$tab[1][2]; // vaut 24 (2è ligne, 3è colonne)
####On peut avoir autant de dimensions qu'on veut ###5.3 Parcours d'un tableau à deux dimensions (exemple en PHP)
$tab = [[12, 54],[25, 48],[1, 24]]
for($ligne = 0 ; $ligne < 3 ; $ligne++){
for($colonne = 0 ; $colonne < 2 ; $colonne ++){
echo "({$ligne, $colonne}) : {$tab[$ligne][$colonne]} \n";
}
}
/* va afficher
(0,0) : 12
(0,1) : 54
(1,0) : 25
(1,1) : 48
(2,0) : 1
(2,1) : 24
La boucle sur $colonne aura été elle-même 3 fois parcourue par la boucle $ligne ($colonne valant successivement 0 puis 1 à chaque tour de boucle $ligne) */
###5.3 Parcours d'un tableau avec foreach
$tab = [[12, 54],[25, 48],[1, 24]]
foreach($tab as $value_tab ){
foreach($sous_tab as $value_sous_tab){
echo $value_sous_tab. ", ";
}
}
// si on veut connaitre l'index :
foreach($tab as $key_tab => $sous_tab ){
foreach($sous_tab as $key_sous_tab => $value_sous_tab){
echo "({$key_tab}, {$key_sous_tab}) : {$value_sous_tab}\n";
}
}
/* va afficher :
(0, 0) : 12
(0, 1) : 54
(1, 0) : 25
(1, 1) : 48
(2, 0) : 1
(2, 1) : 24 */
##6 Données structurées ####En C
typedef struct ELEVE ELEVE;
struct ELEVE{
char prenom[80];
int age;
}
ELEVE roger; // roger est une variable de type ELEVE
roger.prenom = "Roger";
roger.age = 22;
####Pseudo-équivalent en PHP non-objet (ici : dictionnaire)
$roger= [] ;
$roger['nom'] = "Roger";
$roger['age'] = 22;
// équivalent raccourci :
$roger = [
'nom' => 'Roger',
'age' => 22
];
echo $roger['nom'] // affiche 22
####Équivalent en PHP objet (bonus !)
class Eleve{
public $prenom; // public permet d'exposer la variable d'instance $prenom à l'extérieur de la classe
public $age;
}
$roger = new Eleve(); // $roger est une variable qui stocke une instance d'élève
$roger->prenom = "Roger";
echo $roger->prenom; // affiche "Roger"
##9. Quelques tâches courantes en PHP ####Concaténation
$a = "Hello" . " " . "world";
// $a vaut "Hello world";
####Transtypage
$a = "1";
$b = intval($a);
// $b vaut 1 (et non pas "1")
$c = "1.9";
$d = intval($c);
// $d vaut aussi 1
$e = floatval($c);
// $e vaut 1.9
On peut aussi caster les variables :
$a = (string) 6.8 ; // $a vaut la chaine de caractère "6.8" et non pas le nombre
$b = (int) $a ; // $b vaut le nombre 6
$c = (float) $b ; // $c vaut également 6 (les décimales ont été perdues dans le cast précédent)
$d = (float) $a ; // $d vaut le nombre 6.8 ; normal, on le cast dans sont propre type..
####Spliter et joindre, et faire des traitements de tableaux Exemple statique 1
$ma_chaine = "Roger;Robert;Bernadette";
$mon_tableau = split(";", $ma_chaine);
// $mon_tableau vaut ["Roger", "Robert", "Bernadette"]
$noms_joints = join(" -- ", $mon_tableau);
// $noms_joints vaut "Roger -- Robert -- Bernadette"
Exemple avec une saisie utilisateur
define("MON_SEPARATOR", ';');
echo "Entrez les notes séparées par des ". MON_SEPARATOR ." : " ;
$notes_saisies = fgets(STDIN);
$notes = split(MON_SEPARATOR, $notes_saisies);
// $notes est un nouveau tableau contenant les différentes notes sous forme de petites chaines de caractères.
// On va parcourir le tableau pour convertir les petites chaines en vrais nombres mathématiques :
$somme = 0;
for($i = 0 ; $i < count($notes) ; $i++){
$note = floatval($notes[$i]);
$notes[$i]= $note;
$somme += $note;
}
echo "Moyenne : " . ($somme / count($notes));
var_dump($notes);
Variante en utilisant array_map()
pour convertir les petites chaines en vrais nombres.
function convertisseur_en_float($nombre){
return intval($nombre);
}
$notes = array_map("convertisseur_en_float", $notes_saisies);
On aurait donc aussi pu appeler inval()
directement ainsi :
$notes = array_map("intval", $notes_saisies);
Pour faire la somme, on peut appeler array_sum($tableau)
ou utiliser reduce($tableau, "nom_de_fonction", valeur_initiale_de_memo)
function ma_somme($memo, $note){
return $memo + $note; // on envoie la valeur de return dans le "$memo" suivant
}
$somme = array_reduce($notes, "ma_somme", 0); // on initialise ce qui sera envoyé à $memo au premier appel à 0, toutes les cases successives du tableau seront consécutivement attribuées à $note
####Un peu plus loin avec map / reduce
On peu imaginer écrire notre propre fonction array_map()
function mon_array_map( $nom_de_la_fonction, $tab ){
for($i = 0 ; $i < $tab ; $i ++){
$tab[$i] = call_user_func( $nom_de_la_fonction, $tab[$i]);
}
return $tab ;
}
// variante qui modifie le tableau directement sans en faire une copie :
// (bien noter le &)
function mon_array_map_agressif( $nom_de_la_fonction, &$tab ){
for($i = 0 ; $i < $tab ; $i ++){
$tab[$i] = call_user_func( $nom_de_la_fonction, $tab[i] );
}
}
$tableau_inverse = mon_array_map("intval", $tab);
mon_array_map_agressif("intval", $tab);
Et également notre propre array_reduce()
function oppose($nombre){
return -1 * $nombre;
}
function mon_array_reduce( $tab, $callback, $initial){
$memo = $initial;
for($i = 0 ; $i < $tab ; $i ++){
$memo = call_user_func( $nom_de_la_fonction, $memo, $tab[i] );
}
return $memo ;
}
// version agressive :
function mon_array_reduce_agressif( &$tab, $callback, $initial){
$memo = $initial;
for($i = 0 ; $i < $tab ; $i ++){
$memo = call_user_func( $nom_de_la_fonction, $memo, $tab[i] );
}
$tab = $memo ;
}
$tableau_oppose = mon_array_reduce($tab, "oppose", 0);
mon_array_reduce_agressif($tab, "oppose", 0);
####9 Un serveur web
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket,"0.0.0.0", 80) or die('Impossible de lier le socket');
socket_listen($socket, 5);
socket_set_nonblock($socket);
while(true){
$client = socket_accept($socket);
$output = "Hello world " . strftime("%x %T");
socket_write($client, $output, strlen ($output));
socket_close($client);
}
?>
##0. Quelques remarques
###0.1 Façon d'écrire les variable ou les noms de fonctions, ou des identifiants :
snake_case
on_sépare_les_mots_avec_des_soulignés (lowdashes) : variable et fonctions en C, PHP, Ruby, Python...
SCREAMING_SNAKE_CASE
ON_SEPARE_LES_MOTS_EN_MAJUSCULES_AVEC_DES_LOWDASHES : constantes en C, PHP, Ruby, Python
CamelCase
OnSépareLesMotsAvecDesMajuscules : classes en Java, PHP, Ruby ...
dromedaryCase
onSépareLesMotsAvecDesMajuscules : variables et fonctions en Javascript, java, ...
kebab-case
on-sépare-les-mots-avec-des-tirets (hyphens) : Sélecteurs CSS
Train-Case
On-Sépare-Les-Mots-Avec-Des-Tirets-Et-Des-Majuscules : jamais rencontré.
###0.2 Indentation Quand on rentre dans une accolade, on met un tab. C'est pour être plus lisible en C ou en PHP mais en Python, il n'y a pas d'accolade et c'est ce qui délimite les structures de code :
En C si je fais une erreur d'indentation c'est pas grave :
if(condition)
a = 1 ; // Je ne m'exécute que si la condition est vraie
a = 2 ; // C'est mal indenté, je m'exécute après le if
En Python si je fais la même erreur d'indentation, c'est pluus problématique :
if( condition )
a = 1 # Je m'éxécute si la condition est vraie
a = 2 # Je m'exécute aussi si la condition est vraie
a = 3 # Je m'exécute ensuite
###0.2 Liens utiles ####0.2.1 Gravité avec scratch : https://scratch.mit.edu/projects/125269357