Effet Accordéon

Section 1

Mauris mauris ante, blandit et, ultrices a, suscipit eget. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio.

Section 2

Sed non urna. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor aliquet laoreet, mauris turpis velit, faucibus interdum tellus libero ac justo.

Section 3

Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis.Phasellus pellentesque purus in massa.

  • List item one
  • List item two
  • List item three

lundi 29 avril 2013

What is an Array?

What is an Array?

An array is a special variable, which can hold more than one value at a time.
If you have a list of items (a list of car names, for example), storing the cars in single variables could look like this:
$cars1="Volvo";
$cars2="BMW";
$cars3="Toyota";
However, what if you want to loop through the cars and find a specific one? And what if you had not 3 cars, but 300?
The solution is to create an array!
An array can hold many values under a single name, and you can access the values by referring to an index number.

Create an Array in PHP

In PHP, the array() function is used to create an array:
array();
In PHP, there are three types of arrays:
  • Indexed arrays - Arrays with numeric index
  • Associative arrays - Arrays with named keys
  • Multidimensional arrays - Arrays containing one or more arrays

PHP Indexed Arrays

There are two ways to create indexed arrays:
The index can be assigned automatically (index always starts at 0):
$cars=array("Volvo","BMW","Toyota");
or the index can be assigned manually:
$cars[0]="Volvo";
$cars[1]="BMW";
$cars[2]="Toyota";
The following example creates an indexed array named $cars, assigns three elements to it, and then prints a text containing the array values:

Example

<?php
$cars=array("Volvo","BMW","Toyota");
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>

Run example »


Get The Length of an Array - The count() Function

The count() function is used to return the length (the number of elements) of an array:

Example

<?php
$cars=array("Volvo","BMW","Toyota");
echo count($cars);
?>

Run example »


Loop Through an Indexed Array

To loop through and print all the values of an indexed array, you could use a for loop, like this:

Example

<?php
$cars=array("Volvo","BMW","Toyota");
$arrlength=count($cars);

for($x=0;$x<$arrlength;$x++)
  {
  echo $cars[$x];
  echo "<br>";
  }
?>

Run example »


PHP Associative Arrays

Associative arrays are arrays that use named keys that you assign to them.
There are two ways to create an associative array:
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
or:
$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";
The named keys can then be used in a script:

Example

<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>

Run example »


Loop Through an Associative Array

To loop through and print all the values of an associative array, you could use a foreach loop, like this:

Example

<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");

foreach($age as $x=>$x_value)
  {
  echo "Key=" . $x . ", Value=" . $x_value;
  echo "<br>";
  }
?>

Run example »


Multidimensional Arrays

Multidimensional arrays will be explained in the PHP advanced section.

Complete PHP Array Reference

For a complete reference of all array functions, go to our complete PHP Array Reference.
The reference contains a brief description, and examples of use, for each function!

samedi 27 avril 2013

The PHP Switch Statement

The PHP Switch Statement

Use the switch statement to select one of many blocks of code to be executed.

Syntax

switch (n)
{
case label1:
  code to be executed if n=label1;
  break;
case label2:
  code to be executed if n=label2;
  break;
default:
  code to be executed if n is different from both label1 and label2;
}
This is how it works: First we have a single expression n (most often a variable), that is evaluated once. The value of the expression is then compared with the values for each case in the structure. If there is a match, the block of code associated with that case is executed. Use break to prevent the code from running into the next case automatically. The default statement is used if no match is found.

Example

<?php
$favcolor="red";
switch ($favcolor)
{
case "red":
  echo "Your favorite color is red!";
  break;
case "blue":
  echo "Your favorite color is blue!";
  break;
case "green":
  echo "Your favorite color is green!";
  break;
default:
  echo "Your favorite color is neither red, blue, or green!";
}
?>

mardi 23 avril 2013

PHP String Variables

A string variable is used to store and manipulate text.

String Variables in PHP

String variables are used for values that contain characters.
After we have created a string variable we can manipulate it. A string can be used directly in a function or it can be stored in a variable.
In the example below, we create a string variable called txt, then we assign the text "Hello world!" to it. Then we write the value of the txt variable to the output:

Example

<?php
$txt="Hello world!";
echo $txt;
?>

Run example »

lamp Note: When you assign a text value to a variable, remember to put single or double quotes around the value.
Now, lets look at some commonly used functions and operators to manipulate strings.

The PHP Concatenation Operator

There is only one string operator in PHP.
The concatenation operator (.)  is used to join two string values together.
The example below shows how to concatenate two string variables together:

Example

<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
?>

Run example »
The output of the code above will be: Hello world! What a nice day!
Tip: In the code above we have used the concatenation operator two times. This is because we wanted to insert a white space between the two strings.

The PHP strlen() function

Sometimes it is useful to know the length of a string value.
The strlen() function returns the length of a string, in characters.
The example below returns the length of the string "Hello world!":

Example

<?php
echo strlen("Hello world!");
?>

Run example »
The output of the code above will be: 12
Tip: strlen() is often used in loops or other functions, when it is important to know when a string ends. (i.e. in a loop, we might want to stop the loop after the last character in a string).

The PHP strpos() function

The strpos() function is used to search for a character or a specific text within a string.
If a match is found, it will return the character position of the first match. If no match is found, it will return FALSE.
The example below searches for the text "world" in the string "Hello world!":

Example

<?php
echo strpos("Hello world!","world");
?>

Run example »
The output of the code above will be: 6.
Tip: The position of the string "world" in the example above is 6. The reason that it is 6 (and not 7), is that the first character position in the string is 0, and not 1.

Complete PHP String Reference

For a complete reference of all string functions, go to our complete PHP String Reference.
The PHP string reference contains description and example of use, for each function!

lundi 22 avril 2013

PHP Variables

PHP Variables


Variables are "containers" for storing information:

Example

<?php
$x=5;
$y=6;
$z=$x+$y;
echo $z;
?>

Run example »

Much Like Algebra

x=5
y=6
z=x+y
In algebra we use letters (like x) to hold values (like 5).
From the expression z=x+y above, we can calculate the value of z to be 11.
In PHP these letters are called variables.
lamp Think of variables as containers for storing data.


PHP Variables

As with algebra, PHP variables can be used to hold values (x=5) or expressions (z=x+y).
Variable can have short names (like x and y) or more descriptive names (age, carname, totalvolume).
Rules for PHP variables:
  • A variable starts with the $ sign, followed by the name of the variable
  • A variable name must begin with a letter or the underscore character
  • A variable name can only contain alpha-numeric characters and underscores (A-z, 0-9, and _ )
  • A variable name should not contain spaces
  • Variable names are case sensitive ($y and $Y are two different variables)
lamp Both PHP statements and PHP variables are case-sensitive.

Creating (Declaring) PHP Variables

PHP has no command for declaring a variable.
A variable is created the moment you first assign a value to it:
$txt="Hello world!";
$x=5;
After the execution of the statements above, the variable txt will hold the value Hello world!, and the variable x will hold the value 5.
Note: When you assign a text value to a variable, put quotes around the value.

PHP is a Loosely Typed Language

In the example above, notice that we did not have to tell PHP which data type the variable is.
PHP automatically converts the variable to the correct data type, depending on its value.
In a strongly typed programming language, we will have to declare (define) the type and name of the variable before using it.

PHP Variable Scopes

The scope of a variable is the part of the script where the variable can be referenced/used.
PHP has four different variable scopes:
  • local
  • global
  • static
  • parameter

Local Scope

A variable declared within a PHP function is local and can only be accessed within that function:

Example

<?php
$x=5; // global scope

function myTest()
{
echo $x; // local scope
}

myTest();
?>

Run example »
The script above will not produce any output because the echo statement refers to the local scope variable $x, which has not been assigned a value within this scope.
You can have local variables with the same name in different functions, because local variables are only recognized by the function in which they are declared.
Local variables are deleted as soon as the function is completed.

Global Scope

A variable that is defined outside of any function, has a global scope.
Global variables can be accessed from any part of the script, EXCEPT from within a function.
To access a global variable from within a function, use the global keyword:

Example

<?php
$x=5; // global scope
$y=10; // global scope

function myTest()
{
global $x,$y;
$y=$x+$y;
}

myTest();
echo $y; // outputs 15
?>

Run example »
PHP also stores all global variables in an array called $GLOBALS[index]. The index holds the name of the variable. This array is also accessible from within functions and can be used to update global variables directly.
The example above can be rewritten like this:

Example

<?php
$x=5;
$y=10;

function myTest()
{
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}

myTest();
echo $y;
?>

Run example »


Static Scope

When a function is completed, all of its variables are normally deleted. However, sometimes you want a local variable to not be deleted.
To do this, use the static keyword when you first declare the variable:

Example

<?php

function myTest()
{
static $x=0;
echo $x;
$x++;
}

myTest();
myTest();
myTest();

?>

Run example »
Then, each time the function is called, that variable will still have the information it contained from the last time the function was called.
Note: The variable is still local to the function.

Parameter Scope

A parameter is a local variable whose value is passed to the function by the calling code.
Parameters are declared in a parameter list as part of the function declaration:

Example

<?php

function myTest($x)
{
echo $x;
}

myTest(5);

?>

Run example »
Parameters are also called arguments. We will discuss it in more details in our PHP functions chapter.

dimanche 21 avril 2013

Basic PHP Syntax

Basic PHP Syntax

A PHP script can be placed anywhere in the document.
A PHP script starts with <?php and ends with ?>:
<?php
// PHP code goes here
?>
The default file extension for PHP files is ".php".
A PHP file normally contains HTML tags, and some PHP scripting code.
Below, we have an example of a simple PHP file, with a PHP script that sends the text "Hello World!" back to the browser:

Example

<!DOCTYPE html>
<html>
<body>

<h1>My first PHP page</h1>

<?php
echo "Hello World!";
?>


</body>
</html>

Run example »
Each code line in PHP must end with a semicolon. The semicolon is a separator and is used to distinguish one set of instructions from another.
With PHP, there are two basic statements to output text in the browser: echo and print.

Comments in PHP

Example

<!DOCTYPE html>
<html>
<body>

<?php
//This is a PHP comment line

/*
This is
a PHP comment
block
*/
?>


</body>
</html>

samedi 20 avril 2013

PHP code is executed on the server.

PHP code is executed on the server.

What You Should Already Know

Before you continue you should have a basic understanding of the following:
  • HTML
  • JavaScript
If you want to study these subjects first, find the tutorials on our Home page.

What is PHP?

  • PHP stands for PHP: Hypertext Preprocessor
  • PHP is a widely-used, open source scripting language
  • PHP scripts are executed on the server
  • PHP is free to download and use
lamp PHP is simple for beginners.

PHP also offers many advanced features for professional programmers.


What is a PHP File?

  • PHP files can contain text, HTML, JavaScript code, and PHP code
  • PHP code are executed on the server, and the result is returned to the browser as plain HTML
  • PHP files have a default file extension of ".php"

What Can PHP Do?

  • PHP can generate dynamic page content
  • PHP can create, open, read, write, and close files on the server
  • PHP can collect form data
  • PHP can send and receive cookies
  • PHP can add, delete, modify data in your database
  • PHP can restrict users to access some pages on your website
  • PHP can encrypt data
With PHP you are not limited to output HTML. You can output images, PDF files, and even Flash movies. You can also output any text, such as XHTML and XML.

Why PHP?

  • PHP runs on different platforms (Windows, Linux, Unix, Mac OS X, etc.)
  • PHP is compatible with almost all servers used today (Apache, IIS, etc.)
  • PHP has support for a wide range of databases
  • PHP is free. Download it from the official PHP resource: www.php.net
  • PHP is easy to learn and runs efficiently on the server side

vendredi 19 avril 2013

Sauvegarder ses objets
 Cas d'une session
Les informations indiquées ici fonctionnent aussi bien en PHP 4 qu'en PHP 5. Il faut distinguer le
cas des sessions où il faut passer un objet d'une page à l'autre et le cas d'une sauvegarde d'un objet
sur disque.
Dans le premier cas, si les sessions sont utilisées les objets peuvent être passés directement d'une
page à une autre en respectant quelques règles :
• La session doit être ouverte sur chaque page par la fonction « session_start() » avant l'utilisation
de l'objet
• Les classes  doivent  être définies  avant   l'ouverture de  session par   session_start()  et   l'appel  à
l'objet, ce qui implique soit de répéter cette déclaration dans chaque page, soit de la placer dans
un fichier à inclure avec « require() » ou « require_once() » en début de script.
• L'objet doit être une variable de session stockée soit par la fonction « session_register() », soit à
l'aide du tableau global « $_SESSION[] ».
Voici un exemple :
objet.inc :
<?
class Panier {
      // Eléments de notre panier
      var $contenu;
      // Ajout de $qte articles de type $code au panier
      function ajout_article ($code, $qte) {
               if(isset($this->contenu[$code])) $this->contenu[$code] += $qte;
               else $this->contenu[$code] = $qte;
      }
      // Suppression de $num articles du type $artnr du panier
      function suppr_article ($code, $qte) {
               if ($this->contenu[$code] > $qte) {
                  $this->contenu[$code] -= $qte;
                  return TRUE;
               } else {
                 return FALSE;
               }
      }
      function liste_article() {
               foreach($this->contenu as $ref => $qte) echo "$ref=$qte <br />";
      }
}
class Panier_nomme extends Panier {
   var $proprietaire;
   function nom_proprietaire ($nom) {
       $this->proprietaire = $nom;
   }
}
S. ROHAUT Cours Programmation PHP Page 91/93?>
objet.php :
<?php
require_once("objet.inc");
session_start();
?>
<html>
<head>
<title>Page 1</title>
</head>
<body>
<?
$_SESSION['objet']=new Panier_nomme;
$_SESSION['objet']->nom_proprietaire("seb");
$_SESSION['objet']->ajout_article("ref01",3);
$_SESSION['objet']->suppr_article("ref01",1);
$_SESSION['objet']->ajout_article("ref02",3);
echo "{$_SESSION['objet']->proprietaire}<br />";
?>
<a href="objet2.php">Page 2</a>
</body>
</html>
objet2.php :
<?php
require_once("objet.inc");
session_start();
?>
<html>
<head>
<title>Page 2</title>
</head>
<body>
<?
echo $_SESSION['objet']->proprietaire."<br />";
$_SESSION['objet']->liste_article();
?>
</body>
</html>
 Autres cas
Rien n'empêche de conserver  un objet  pour   le récupérer  plus  tard,  même après avoir   fermé une
session. Pour ça on peut le stocker dans un fichier ou en base de données. Pour récupérer un format
correct de données pour stockage, il faut utiliser les fonctions « serialize() » et « unserialize() ».
La première fonction retourne une chaîne de texte représentant la variable (pas forcément un objet)
passée en paramètre. Ce format de donnée peut ainsi être stocké dans la manière qui vous convient.
Le seconde fonction prend comme paramètre  la chaîne de  texte  issue de serialize et  retourne  la
variable du type originel, dans notre cas un objet.
classa.inc:
<?php
  class A {
   var $one = 1;
   function show_one() {
     echo $this->one;
S. ROHAUT Cours Programmation PHP Page 92/93

jeudi 18 avril 2013

Nouveautés en PHP 5
16.1 Les objets
16.1.1 La fonction __autoload
La  fonction « __autoload »  indique à PHP comment  réagir quand on  tente de créer un objet
depuis une classe qui n'a pas été définie. C'est une facilité offerte qui ne se substitue pas forcément
aux require et include. Elle peut être utile par exemple pour éviter d'inclure l'ensemble des classes
utilisées dans un projet. On préférera inclure la définition de la classe au moment de la création de
son instance. La fonction « __autoload » ne prend qu'un paramètre, le nom de la classe. A vous
de la programmer ensuite pour inclure le code nécessaire.
function __autoload($class) {
require_once("/inc/{$class]}.php");
}
16.1.2 Les classes abstraites
Les   classes   abstraites   sont  une  nouveauté  de  PHP 5.  Une   classe   abstraite   est  une   classe   sans
implémentation   (qui   ne   peut   être   instanciée),   représentée   par   au  moins   une   fonction   abstraite
(virtuelle pure, sans code), l'implémentation étant effectuée dans les classes dérivées.
Les   classes   abstraites   servent   essentiellement   à  définir  une   classe   de  base   normalisée  dont   la
structure pourra être reprise pour le développement d'autres classes effectives.
Toute classe qui contient au moins une méthode abstraite doit être définie comme abstraite.
Si la classe dérivée ne redéfinit pas une méthode abstraite de la classe parente (de base), elle devra
être déclarée abstraite à son tour et ne pourra être instanciée.
 La classe qui  implémente  la méthode abstraite doit être définie avec la même visibilité ou plus
faible. Si la méthode abstraite est définie en tant que protégée, la fonction l'implémentant doit être
définie en tant que protégée ou publique.
L'instruction pour définir des classes et méthodes est « abstract ».
// Classe abstraite : elle contient une méthode abstraite
abstract class AbstractClass {
   // Méthode abstraite qui devra être redéfinie dans la classe dérivée
   abstract protected function getValue();
   public function prt() {
     print $this->getValue();
   }
}
class ConcreteClass1 extends AbstractClass {
   // Redéfinition de la méthode abstraite de la classe de base
   protected function getValue() {
     return "ConcreteClass1";
   }
}
S. ROHAUT Cours Programmation PHP Page 83/93class ConcreteClass2 extends AbstractClass {
   // Redéfinition de la méthode abstraite de la classe de base
   protected function getValue() {
     return "ConcreteClass2";
   }
}
$class1 = new ConcreteClass1;
$class1->prt(); // affiche ConcreteClass1
$class2 = new ConcreteClass2;
$class2->prt(); // affiche ConcreteClass2
16.1.3 Classes, méthodes et variables finales
PHP inclut un nouveau mécanisme de protection interdisant aux classes dérivées de réimplémenter
une  méthode   ou   une   variable,   ou   à   une   classe   d'être   elle-même   dérivée.   Avec   le  mot-clé
« final », on  indique que  la classe,   la méthode ou  la variable sont  définitives et  qu'elles ne
pourront plus être implémentées. Voici un cas d'erreur :
class A {
    protected $val;
    function __construct() {
        $this->val=1;
    }
    final function affiche() {
        print $this->val;
    }
}
class B extends A {
    function __construct() {
        parent::_construct();
    }
    function affiche() { // ERREUR ! ON NE PEUT PAS REDEFINIR !
        print $this->val;
    }
}
$o1=new B;
$o1->affiche();
Dans la classe B nous avons tenté de récrire la méthode affiche déclarée en « final », et PHP
nous retournera une erreur.
16.1.4 Les interfaces objet
Les interfaces permettent de créer du code qui spécifie quelles méthodes et attributs une classe peut
implémenter sans avoir à définir comment elles seront gérées. Toutes les méthodes spécifiées dans
l'interface doivent être implémentées dans la classe qui la définit. L'interface est donc un moyen de
définir les pré-requis obligatoires à la construction d'un modèle de classe en en donnant la liste des
prototypes.
On créé une interface avec le mot-clé « interface ». Dans notre exemple, nous allons définir
que toutes les classes qui implémentent notre interface doivent obligatoirement définir les fonctions
affiche et incrémente.
S. ROHAUT Cours Programmation PHP Page 84/93interface Template
{
    public function affiche();
    public function incremente($cpt);
}
Attention   :   la   déclaration   des   méthodes   (notamment   des   paramètres)   doit   être
rigoureusement identique dans la classe à celle de l'interface.
On indique qu'une classe implémente une interface avec le mot-clé « implements ».
class A implements Template {
    protected $val;
    function __construct() {
        $this->val=1;
    }
    function affiche() {
        print $this->val;
    }
    function incremente($cpt) {
        $this->val+=$cpt;
    }
}
$o1=new A;
$o1->incremente(2);
$o1->affiche();
Une classe peut implémenter plusieurs interfaces en même temps. Dans ce cas la liste des interfaces
doit être précisée après le mot-clé « implements », et chaque interface séparée par des virgules.
interface Template  {
    public function affiche();
    public function incremente($cpt);
}
interface Template2 {
    public function decremente($cpt);
}
class A implements Template, Template2 {
    protected $val;
    function __construct() {
        $this->val=1;
    }
    function affiche() {
        print $this->val;
    }
    function incremente($cpt) {
        $this->val+=$cpt;
    }
    function decremente($cpt) {
        $this->val-=$cpt;
    }
}
S. ROHAUT Cours Programmation PHP Page 85/9316.1.5 Gestion dynamique des méthodes et attributs
On ne peut   toujours pas surcharger  directement  ses méthodes,  attributs et  opérateurs en PHP 5
comme   en  C++.  Cependant   de   nouvelles   fonctions   permettent   d'intercepter   des   appels   à   des
méthodes ou attributs non prévus.
Note : Ces méthodes peuvent uniquement être déclenchées lorsque votre objet, hérité ou non,
ne contient pas l'attribut ou la méthode que vous tentez d'accéder. Dans le cas contraire, la
méthode ou l'attribut sont utilisés.
Pour une méthode, on utilise la méthode « __call » qui prend deux paramètres. Le premier est le
nom de la méthode, le second est un tableau des paramètres passés à la méthode. Imaginons que
nous souhaitons appeler la méthode « test » de notre objet, mais que nous n'avions pas prévu ce
cas. Il suffit de gérer ce cas dans la méthode « __call » :
class A {
  function __call($m, $a) { // Gère les appels aux méthodes non définies
        if($m=="test") {
            echo "fonction test appelée avec les valeurs $a";
return $a;
        }
  }
}
$o1 = new A();
$a = $o1->test(1, "2", 3.4, true); // test n'existe pas et pourtant...
print_r($a); // ça marche et ça retourne les paramètres de test.
Pour un attribut,  on utilise  les méthodes « __get » et  « __set ». La méthode « __get » est
appelée implicitement lorsque vous tentez d'accéder à la valeur d'une variable qui n'est pas définie
dans  votre classe.  Elle prend comme unique paramètre  le nom de  l'attribut  auquel  vous   tentez
d'accéder. La méthode « __set » est appelée lorsque vous tentez d'affecter une valeur à un attribut
qui n'est pas défini, et prend deux paramètres : le nom de la variable et la valeur affectée.
class A {
    private $tab=array();
    function __get($v) {
        if(!isset($this->tab[$v])) return false;
        else return $this->tab[$v];
    }
    function __set($v,$c) {
        $this->tab[$v]=$c;
    }
}
$o1 = new A();
$o1->var=1; // Le membre var n'existe pas et pourtant ...
echo $o1->var; // ça marche et ça affiche 1 !
16.1.6 Les itérations d'objets
PHP 5  indexe  les  attributs  de  ses  objets.   Il  est  possible d'accéder  à  la  liste des  attributs   (si   la
visibilité le permet) à l'aide du simple boucle itérative comme « foreach ».
S. ROHAUT Cours Programmation PHP Page 86/93class A {
    public $v1="salut";
    public $v2="les";
    public $v3="amis !";
    private $v4="privé";
}
$o1 = new A();
foreach($o1 as $cle => $valeur) {
    echo "$cle = $valeur <br />\n";
}
Ce code affiche
v1 = salut
v2 = les
v3 = amis !
Et les attributs qui ne sont pas visibles ne sont pas affichés.
Il   existe   des   interfaces   prédéfinies   permettant   de   créer   sa   propre   classe   d'itération.  La   classe
« Iterator » implémente les cinq méthodes suivantes :
• current
• next
• key
• valid
• rewind
On peut  donc créer une classe  implémentant  cette  interface pour,  par exemple,  naviguer dans  le
résultat d'une requête de base de données, ou dans un tableau.
16.1.7 Type hinting
PHP 5 permet de contrôler le type de valeur passé en paramètre à une fonction.  Prenons le code
suivant qui retourne les infos d'un utilisateur de classe « utilisateur » :
function detail($user) {
return $user->infos();
}
La fonction attend un objet particulier de classe utilisateur. Tout fonctionnera à merveille si votre
code est blindé. Cependant si on lui passe un entier, ça ne marchera pas, mais c'est seulement lors
du   « return $user->infos() »  que  PHP   générera   une   erreur.  Le   « type hinting »
indique à PHP ce qu'attend exactement la fonction.
function detail(utilisateur $user) {
return $user->infos();
}
Cette fois PHP 5 retournera une erreur dès l'appel  à la fonction si elle ne reçoit pas un objet  de
classe utilisateur.
S. ROHAUT Cours Programmation PHP Page 87/9316.2 Les exceptions
16.2.1 try ... catch
PHP 5 inclut enfin le support  des exceptions avec le bloc « try ... catch ». Ainsi on peut
placer du code « à risque » ou un code « exceptionnel » qui peut produire une erreur dans un bloc
« try », et gérer l'erreur, selon son type, dans des blocs « catch ». On put utiliser plusieurs
blocs « catch » suivant   le  type d'erreur  généré.  Attention,  quand c'est  possible on gérera  les
erreurs avec du code normal.
try {
 ... // Code à risque d'erreur
}
catch (Exception $e) {
... // Code réglant la situation exceptionnelle
}
Au sein du bloc « try », l'exécution d'une instruction erronée va déclencher l'émission d'un signal
: une exception. Ce signal interrompt l'exécution du reste de tout le bloc. En fonction du signal, PHP
exécutera le bloc « catch » approprié.
On remarque que dans le bloc « catch », PHP gère les exceptions à l'aide d'une classe spéciale
appelée « Exception ». Une exception est en fait définie par un objet de cette classe ou d'une
classe dérivée.  On peut donc créer ses propres gestionnaires d'exceptions.  Comme on peut écrire
plusieurs blocs « catch » pour gérer les exceptions suivant le type d'objet.
16.2.2 Déclenchement avec throw
On peut déclencher manuellement une exception à l'aide de l'instruction « throw ». Voici un code
qui provoque toujours une exception :
try {
    $erreur="Message d'erreur";
    throw new Exception($erreur);
    echo 'Jamais exécuté';
} catch (Exception $e) {
   echo 'Exception: '.$e->getMessage().' à la ligne '.$e->getLine()."\n";
}
A l'aide de l'instruction « throw » nous avons provoqué l'émission d'une exception qui sera gérée
par la classe « Exception ». Dans ce cas, PHP va rechercher le bloc « catch » correspondant au
type d'objet créé pour gérer l'exception, ici «catch(Exception $e) ».
16.2.3 classe Exception et classes personnalisées
La classe « exception » est imposée par PHP comme classe de base et parente de toute classe
utilisable avec « catch ». La classe de base dispose des méthodes suivantes:
• __construct($erreur,$code)  :   le constructeur  avec  le message d'erreur  et   le
code
• getMessage() : retourne le message d'erreur généré
S. ROHAUT Cours Programmation PHP Page 88/93• getCode() : Code erreur de l'exception
• getLine() : numéro de la ligne du script ayant provoqué l'exception
• getFile() : nom du script PHP ayant provoqué l'exception
• getTrace() et  getTraceAstring()  : gestion de la pile d'appels, un peu comme
Java.
• __toString() : chaîne formatée à afficher.
Les méthodes « getXXXX() » sont finales. On ne peut donc pas les étendre. Mais le constructeur
et   la  méthode  « __toString » peuvent   être   étendus.  On peut  donc   créer   sa  propre   classe
dérivée.
class MonException extends Exception {
   public function __construct($message="Erreur par défaut", $code = 0) {
       parent::__construct($message, $code);
   }
}
$a=1;
try {
    switch($a) {
        case 1: throw new MonException("Ouille !",$a);
            break;
        case 2: throw new Exception("Aie !",$a);
            break;
    }
}
catch(MonException $e) {
    echo $e->getMessage();
}
catch (Exception $e) {
   echo 'Exception: '.$e->getMessage().' ligne '.$e->getLine()."\n";
}
Si $a vaut 1, « MonException » sera envoyé, si $a vaut 2, ce sera « Exception ».
16.2.4 PHP : Erreur ou Exception ?
Il se peut  que dans certains cas,  PHP déclenche naturellement  une exception suivant   l'exécution
d'une fonction. Dans ce cas, ce sera indiqué dans la documentation PHP (voir site PHP) en ligne.
Mais dans la plupart des cas, c'est l'ancien système de gestion des erreurs qui est utilisé. Ainsi le
code suivant
try {
$a=fopen('toto','r');
}
catch(Exception $e) {
   echo 'Exception: '.$e->getMessage();
}
ne donnera pas du tout le résultat escompté. L'exécution de « fopen » ne provoquera pas l'émission
d'une exception mais une erreur PHP de type WARNING :
Warning: fopen(toto) [function.fopen]: failed to open stream: No such file or
S. ROHAUT Cours Programmation PHP Page 89/93directory in C:\apachefriends\xampp\htdocs\objet\panier.php on line 21
PHP gère plusieurs  niveau d'erreurs   :  WARNING,  NOTICE,   etc.  Par   exemple,  un problème
d'ouverture   de   fichier   émet   une   erreur   de   type  WARNING,   une   erreur   de   syntaxe   PARSE,
l'utilisation d'une variable non déclarée un NOTICE. On peut régler et modifier les niveaux d'erreurs
dans le php.ini, mais aussi dynamiquement via des fonctions.
Parmi ces fonctions, deux peuvent nous intéresser. « set_error_handler » permet de modifier
le   comportement   par   défaut   de  PHP  lorsqu'il   rencontre   une   erreur   dans   votre   script.  Au   lieu
d'exécuter son propre gestionnaire, il exécutera le votre. Attention, ce gestionnaire ne peut pas gérer
certains   types   d'erreurs   (syntaxe,   etc,   voir  http://www.php.net/manual/en/function.set-error-
handler.php), mais dans le cas d'un simple WARNING ou NOTICE  il n'y a pas de problème. On
lui passe en paramètre le nom de sa propre fonction qui doit gérer l'erreur. Les paramètres sont assez
parlants.  Dans notre  fonction,  nous allons déclencher  une exception à  la  réception de n'importe
quelle erreur.
function gest_erreur($errno, $errstr, $errfile, $errline)
{
    throw new Exception("$errstr line $errline",$errno);
}
set_error_handler("gest_erreur");
A l'exécution de notre bloc « try...catch », nous aurons cette fois
Exception: fopen(toto) [function.fopen]: failed to open stream: No such file or
directory line 21
ce que nous voulions : nous avons bien déclenché une exception.
Exception par défaut
Si  certaines instructions PHP génèrent des exceptions et que ces instructions ne sont pas au sein
d'un bloc « try...catch », PHP générera une exception par défaut avec son propre gestionnaire
d'exceptions. On peut modifier cet état avec la fonction « set_exception_handler ».
function exception_handler($exception) {
  echo "Exception imprévue : " , $exception->getMessage(), "\n";
}
set_exception_handler('exception_handler');
S. ROHAUT Cours Programmation PHP Page 90/9317 Sauvegarder ses objets
17.1 Cas d'une session
Les informations indiquées ici fonctionnent aussi bien en PHP 4 qu'en PHP 5. Il faut distinguer le
cas des sessions où il faut passer un objet d'une page à l'autre et le cas d'une sauvegarde d'un objet
sur disque.
Dans le premier cas, si les sessions sont utilisées les objets peuvent être passés directement d'une
page à une autre en respectant quelques règles :
• La session doit être ouverte sur chaque page par la fonction « session_start() » avant l'utilisation
de l'objet
• Les classes  doivent  être définies  avant   l'ouverture de  session par   session_start()  et   l'appel  à
l'objet, ce qui implique soit de répéter cette déclaration dans chaque page, soit de la placer dans
un fichier à inclure avec « require() » ou « require_once() » en début de script.
• L'objet doit être une variable de session stockée soit par la fonction « session_register() », soit à
l'aide du tableau global « $_SESSION[] ».
Voici un exemple :
objet.inc :
<?
class Panier {
      // Eléments de notre panier
      var $contenu;
      // Ajout de $qte articles de type $code au panier
      function ajout_article ($code, $qte) {
               if(isset($this->contenu[$code])) $this->contenu[$code] += $qte;
               else $this->contenu[$code] = $qte;
      }
      // Suppression de $num articles du type $artnr du panier
      function suppr_article ($code, $qte) {
               if ($this->contenu[$code] > $qte) {
                  $this->contenu[$code] -= $qte;
                  return TRUE;
               } else {
                 return FALSE;
               }
      }
      function liste_article() {
               foreach($this->contenu as $ref => $qte) echo "$ref=$qte <br />";
      }
}
class Panier_nomme extends Panier {
   var $proprietaire;
   function nom_proprietaire ($nom) {
       $this->proprietaire = $nom;
   }
}
S. ROHAUT Cours Programmation PHP Page 91/93?>
objet.php :
<?php
require_once("objet.inc");
session_start();
?>
<html>
<head>
<title>Page 1</title>
</head>
<body>
<?
$_SESSION['objet']=new Panier_nomme;
$_SESSION['objet']->nom_proprietaire("seb");
$_SESSION['objet']->ajout_article("ref01",3);
$_SESSION['objet']->suppr_article("ref01",1);
$_SESSION['objet']->ajout_article("ref02",3);
echo "{$_SESSION['objet']->proprietaire}<br />";
?>
<a href="objet2.php">Page 2</a>
</body>
</html>
objet2.php :
<?php
require_once("objet.inc");
session_start();
?>
<html>
<head>
<title>Page 2</title>
</head>
<body>
<?
echo $_SESSION['objet']->proprietaire."<br />";
$_SESSION['objet']->liste_article();
?>
</body>
</html>
17.2 Autres cas
Rien n'empêche de conserver  un objet  pour   le récupérer  plus  tard,  même après avoir   fermé une
session. Pour ça on peut le stocker dans un fichier ou en base de données. Pour récupérer un format
correct de données pour stockage, il faut utiliser les fonctions « serialize() » et « unserialize() ».
La première fonction retourne une chaîne de texte représentant la variable (pas forcément un objet)
passée en paramètre. Ce format de donnée peut ainsi être stocké dans la manière qui vous convient.
Le seconde fonction prend comme paramètre  la chaîne de  texte  issue de serialize et  retourne  la
variable du type originel, dans notre cas un objet.
classa.inc:
<?php
  class A {
   var $one = 1;
   function show_one() {
     echo $this->one;
S. ROHAUT Cours Programmation PHP Page 92/93   }
  }
?>
page1.php:
<?php
  include("classa.inc");
  $a = new A;
  $s = serialize($a);
  // enregistrez $s où la page2.php pourra le trouver.
  $fp = fopen("store", "w");
  fputs($fp, $s);
  fclose($fp);
?>
page2.php:
<?php
  // Ceci est nécessaire pour que unserialize() fonctionne correctement
  include("classa.inc");
  $s = implode("", @file("store"));
  unserialize($s);
  // maintenant, utilisez la méthode show_one de l'objet $a.
  $a->show_one();
?>

mercredi 17 avril 2013


Images
Pré-requis importants
Ceci concerne les versions de PHP avant la 4.2.3 et EasyPHP 1.6: certaines fonctions comme
gd_info() ou encore imagecreatetruetype() ne sont pas toujours disponibles car PHP fait appel à une
bibliothèque   externe   appelée  GD2.  Pour   les   version  4.2.3  et   au-delà  on  trouve  des   patches   à
l'adresse  http://www.boutell.com/gd/.  Avant  ces versions,   la version GD  linkée avec PHP est   la
.
Ceci concerne les utilisateurs de PHP 4.2.3 et + et EasyPHP 1.7 sur Windows : la configuration
par défaut de EasyPHP 1.7 n'inclut pas le support des images. Pour cela il faut modifier le fichier
PHP.INI en retirant le commentaire de :
extension=php_gd2.dll
Créer une image
Types possibles
Il faut tout d'abord choisir le type de l'image que vous souhaitez créer. Pour cela on peut tester quels
types PHP peut générer avec la fonction imagetypes() et ses constantes associées :
IMG_PNG : format PNG
IMG_JPG : format JPEG
IMG_GIF : format GIF
IMG_WBMP : format Windows Bitmap BMP
if (imagetypes() & IMG_PNG) {
   echo "Le type PNG est supporté";
Puis au début du script, on envoie un header spécifiant le type d'image :
S. ROHAUT Cours Programmation PHP Page 67/93header ("Content-type: image/png"); // ou image/gif ou image/jpeg
Création
Nouvelle image dynamique
Et enfin on créé une image avec la fonction imagecreate() (basée sur une table de couleurs indexée)
ou  imagecreatetruecolor()  (en  truecolor)   avec   comme  paramètres   la   largeur   et   la  hauteur.  La
seconde est conseillée par la documentation PHP. Les fonctions retournent une ressource identifiant
l'image. Par défaut l'image est noire.
$img=@createimage(100,100) or die("Votre PHP ne supporte pas les images");
Récupération d'une image existante
PHP peut charger une image existante au lieu de la créer de toutes pièces. Dans ce cas l'image est
chargée depuis un fichier et on peut ensuite la retravailler comme on le souhaite. On peut utiliser les
fonctions :
imagecreatefromgif() : charge une image GIF
imagecreatefromjpeg() : charge une image JPEG
imagecreatefrompng() : charge une image PNG
imagecreatefromstring() : charge une image depuis une chaîne de texte (par exemple un champ)
Publication
Enfin, on publie l'image avec les fonctions imagexxx(). Si cette fonction est utilisée sans paramètre,
l'image créée est redirigée vers la sortie standard. On peut toutefois préciser comme paramètre un
nom de fichier. Dans ce cas, l'image est sauvée sur disque au format spécifié.
imagepng() : créé une image au format PNG
imagegif() : créé une image au format GIF
imagejpeg() : créé une image au format JPEG
Une fois l'image crée, on peut la supprimer avec imagedestroy() ce qui la décharge de la mémoire.
Voici donc le code d'une page PHP image.php retournant une image :
header ("Content-type: image/png");
$img=@imagecreatetruecolor (100, 50) or die ("Impossible de crée un flux d'image
GD");
/* ICI ON PLACE LES COMMANDES DE DESSIN OU MANIPULATION */
imagepng ($img);
imagedestroy ($img);
S. ROHAUT Cours Programmation PHP Page 68/9314.2.4 Chargement via une autre page
Pour appeler cette image dynamique depuis une page HTML ou PHP il suffit de la placer dans une
balise IMG :
<img src="image.php">
Travailler sur les Images
Récupérer des informations
La fonction getimagesize() permet de récupérer des informations sur une image si on lui passe un
nom de fichier (pas de ressource image). Elle retourne un tableau indexé.
list($width,$height,$type,$attr)=getimagesize("toto.gif");
width : largeur x
height : hauteur y
type : 1 = GIF, 2 = JPG, 3 = PNG, 5 = PSD, 6 = BMP, 7 = TIFF (Ordre des octets Intel), 8 =
TIFF (Ordre des octets Motorola), 9 = JPC, 10 = JP2, 11 = JPX, 12 = JB2, 13 = SWC, 14 = IFF
attr: chaine width/height pour HTML
Si on travaille sur une image qu'on a créé nous-même :
imagesx() : largeur x de l'image
imagesy() : hauteur de l'image
Les couleurs
Il n'est pas possible de voir  toutes les fonctions cependant  une chose est à retenir  :  la notion de
palette  indexée   (createimage())  et   la notion de  truetype.  Dans   le premier  cas   les  couleurs   sont
indexées via un numéro. Dans le second cas, la couleur est une composante RVB.
La fonction imagecolorallocate() permet de définir une couleur qui sera utilisée pour une image. Le
premier paramètre est le ressource de l'image, les trois autres les niveaux de rouge, vert et bleu de la
couleur.
ATTENTION : Avec une image créée avec createimage(), la palette est indexée et le premier
index est   la couleur du  fond.  Donc  :  un premier appel  à  imagecolorallocate()  dans ce cas
modifie la couleur du fond.
$white=imagecolorallocate($img,255,255,255);
La fonction imagecolorat() retourne la valeur exacte (soit l'index de la palette, soit un entier RVB)
du point aux coordonnées x/y de l'image.
S. ROHAUT Cours Programmation PHP Page 69/93$color=imagecolorextact($img,50,50);
La fonction imagecolortransparent() permet de définir la couleur de transparence d'une image dont
la   palette   est   indexée.  Le   premier   paramètre   est   la   ressource   de   l'image
OBLIGATOIREMENT   créée   avec   imagecreate(),   le   second   une   valeur   retournée   par
imagecolorallocate().
La fonction imagecolorstotal() retourne le nombre total de couleurs utilisées pour l'image donnée.
Dessin
Remplissage
On utilise la fonction imagefill() :
$background=imagecolorallocate ($img,255,255,255);
ImageFill($img,0,0,$background);
La   fonction  imagefilltoborder()  permet   un   remplissage   d'une   zone   délimitée   par   une   couleur
donnée.  Dans ce cas  les deux derniers paramètres sont  la couleur de la bordure et  la couleur de
remplissage.
Point
On utilise imagesetpixel() :
$green=imagecolorallocate ($img,0,255,0);
Imagesetpixel($img,2,2,$green);
Ligne
On utilise imageline() :
imageline($img, 10,10,30,40,$blue);
Rectangle
On utilise  imagerectangle()  pour  un  rectangle simple,  imagefilledrectangle()  pour  un  rectangle
rempli.
$blue=ImageColorAllocate($img,0,0,255);
imagerectangle($img, 10,10,30,40,$blue);
imagefilledrectangle($img,12,12,27,37,$green);
Cercle, ellipse
On utilise imageellipse() ou imagefilledellipse(). Attention les deux premiers paramètres sont les
coordonnées du centre de l'ellipse, les deux autres la largeur et la hauteur de l'ellipse.
imageellipse ($img, 50, 50,30, 20, $red);
On peut  aussi  faire des arcs de cercles avec les fonctions  imagearc()  et  imagefilledarc()  :  Juste
S. ROHAUT Cours Programmation PHP Page 70/93avant la couleur on précise le début et la fin de l'arc en degrés (de 0 à 360).
Polygones
On utilise les fonctions imagepolygone() et imagefilledpolygone(). Les sommets du polygone sont
définis dans un tableau : Tab[0]=x0, Tab[1]=y0, Tab[1]=x1, Tab[2]=y1, ...
On doit aussi préciser le nombre de sommets.
imagepolygon($img, array (0, 0,100, 200, 300, 200),3, $blue);
Texte simple
On utilise imagestring() :
imagestring($img, 1, 5, 5,  "Une simple chaîne de texte", $text_color);
Le second paramètre est le numéro de police par défaut de la page actuelle ou du navigateur.