<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.variables.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'language.variables.scope.php',
    1 => 'Port&eacute;e des variables',
    2 => 'Port&eacute;e des variables',
  ),
  'up' => 
  array (
    0 => 'language.variables.php',
    1 => 'Les variables',
  ),
  'prev' => 
  array (
    0 => 'language.variables.predefined.php',
    1 => 'Variables pr&eacute;d&eacute;finies',
  ),
  'next' => 
  array (
    0 => 'language.variables.variable.php',
    1 => 'Les variables dynamiques',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'language/variables.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.variables.scope" class="sect1">
  <h2 class="title">Portée des variables</h2>
  
  <p class="simpara">
   La portée d&#039;une variable est le contexte dans lequel elle est définie.
   PHP possède une portée de fonction et une portée globale.
   Toute variable définie en dehors d&#039;une fonction est limitée à la portée globale.
   Lorsqu&#039;un fichier est inclus, le code qu&#039;il contient hérite de la portée des variables
   de la ligne où l&#039;inclusion a lieu.
  </p>
  <div class="example" id="example-1">
   <p><strong>Exemple #1 Exemple de portée de variable globale</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />include </span><span style="color: #DD0000">'b.inc'</span><span style="color: #007700">; </span><span style="color: #FF8000">// La variable $a sera disponible dans b.inc.<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <p class="simpara">
   Toute variable créée à l&#039;intérieur d&#039;une fonction nommée ou d&#039;une
   <a href="functions.anonymous.php" class="link">fonction anonyme</a>
   est limitée à la portée du corps de la fonction.
   Cependant, les <a href="functions.arrow.php" class="link">fonctions fléchées</a>
   lient les variables de la portée parente pour les rendre disponibles dans le corps.
   Si un fichier est inclus à l&#039;intérieur d&#039;une fonction dans
   le fichier appelant, les variables contenues dans le fichier appelé seront
   disponibles comme si elles avaient été définies à l&#039;intérieur de la fonction appelante.
  </p>
  
  <div class="example" id="example-2">
    <p><strong>Exemple #2 Exemple de portée de variable locale</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #FF8000">// portée globale<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">()<br />{ <br />    echo </span><span style="color: #0000BB">$a</span><span style="color: #007700">; </span><span style="color: #FF8000">// La variable $a est indéfinie car elle fait référence à une version locale de $a<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #0000BB">test</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  
  <p class="simpara">
   L&#039;exemple ci-dessus générera un <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> de variable indéfinie
   (ou un <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong> avant PHP 8.0.0).
   La raison pour cela est que
   l&#039;instruction <span class="function"><a href="function.echo.php" class="function">echo</a></span> utilise la variable locale <var class="varname">$a</var>,
   et celle-ci n&#039;a pas été assignée
   préalablement dans la fonction. Il est à noter que
   ce concept diffère un petit peu du langage C dans
   lequel une variable globale est automatiquement accessible dans
   les fonctions, à moins d&#039;être redéfinie
   localement dans la fonction. Cela peut poser des problèmes
   lors de la redéfinition de variables globales localement.
   En PHP, une variable globale doit être
   déclarée à l&#039;intérieur de chaque
   fonction afin de pouvoir être utilisée dans cette
   fonction.
  </p>
  
  <div class="sect2" id="language.variables.scope.global">
   <h3 class="title">Le mot clé <code class="literal">global</code></h3>
   <p class="simpara">
    Le mot-clé <code class="literal">global</code> est utilisé pour lier une variable
    de la portée globale dans une portée locale. Le mot-clé peut être utilisé avec
    une liste de variables ou une seule variable. Une variable locale sera créée
    faisant référence à la variable globale du même nom. Si la variable globale
    n&#039;existe pas, la variable sera créée dans la portée globale et
    assignée à <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
   </p>
   <p class="para">
    <div class="example" id="example-3">
     <p><strong>Exemple #3 Exemple avec <code class="literal">global</code></strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /><br />function </span><span style="color: #0000BB">somme</span><span style="color: #007700">()<br />{<br />    global </span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br /><br />    </span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">somme</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <div class="example-contents"><p>L&#039;exemple ci-dessus va afficher :</p></div>
      <div class="example-contents screen">
<div class="cdata"><pre>
3
</pre></div>
      </div>
    </div>
   </p>

   <p class="simpara">
    En déclarant globales les variables <var class="varname">$a</var> et
    <var class="varname">$b</var> locales
    de la fonction somme(), toutes les références à
    ces variables concerneront les variables globales. Il n&#039;y a
    aucune limite au nombre de variables globales qui peuvent
    être manipulées par une fonction.
   </p>
   
   <p class="simpara">
    Une deuxième méthode pour accéder aux
    variables globales est d&#039;utiliser le tableau associatif
    prédéfini <var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var>. Le précédent
    exemple peut être réécrit de la
    manière suivante :
   </p>
   <p class="para">
    <div class="example" id="example-4">
     <p><strong>Exemple #4 Les variables globales et <var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var></strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /><br />function </span><span style="color: #0000BB">somme</span><span style="color: #007700">()<br />{<br />    </span><span style="color: #0000BB">$GLOBALS</span><span style="color: #007700">[</span><span style="color: #DD0000">'b'</span><span style="color: #007700">] = </span><span style="color: #0000BB">$GLOBALS</span><span style="color: #007700">[</span><span style="color: #DD0000">'a'</span><span style="color: #007700">] + </span><span style="color: #0000BB">$GLOBALS</span><span style="color: #007700">[</span><span style="color: #DD0000">'b'</span><span style="color: #007700">];<br />}<br /><br /></span><span style="color: #0000BB">somme</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>

     </div>

    </div>
   </p>
   
   <p class="simpara">
    Le tableau <var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var> est un tableau associatif avec le nom
    des variables globales comme clé et les valeurs des éléments
    du tableau comme valeur des variables. Il est à noter que <var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var>
    existe dans tous les contextes, car <var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var> est un
    <a href="language.variables.superglobals.php" class="link">superglobal</a>.
    Voici un exemple illustrant la puissance des superglobaux :
   </p>
   
   <p class="para">
    <div class="example" id="example-5">
     <p><strong>Exemple #5 Exemple montrant les superglobales et la portée</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test_superglobal</span><span style="color: #007700">()<br />{<br />    echo </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'name'</span><span style="color: #007700">];<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
   <blockquote class="note"><p><strong class="note">Note</strong>: 
    <span class="simpara">
     L&#039;utilisation du mot clé <code class="literal">global</code> à l&#039;extérieur
     d&#039;une fonction n&#039;est pas une erreur. Il peut être utilisé si le fichier
     est inclus depuis l&#039;intérieur d&#039;une fonction.
    </span>
   </p></blockquote>
  </div>
  
  <div class="sect2" id="language.variables.scope.static">
   <h3 class="title">Utilisation des variables <code class="literal">static</code></h3>
   <p class="simpara">
    Une autre caractéristique importante de la portée des variables est
    la notion de variable <em>static</em>. Une variable statique a
    une portée locale uniquement, mais elle ne perd pas sa valeur lorsque le
    script appelle la fonction. Prenons l&#039;exemple suivant :
   </p>
   <p class="para">
    <div class="example" id="example-6">
     <p><strong>Exemple #6 Les variables statiques</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">()<br />{<br />    </span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />    echo </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$a</span><span style="color: #007700">++;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
   <p class="simpara">
    Cette fonction est un peu inutile car à chaque fois
    qu&#039;elle est appelée, elle initialise <var class="varname">$a</var> à <code class="literal">0</code> et
    affiche &quot;<code class="literal">0</code>&quot;. L&#039;incrémentation de la variable (<var class="varname">$a</var>++)
    ne sert pas à grand chose, car dès que la
    fonction est terminée, la variable <var class="varname">$a</var> disparaît.
    Pour faire une fonction de comptage utile, c&#039;est-à-dire qui
    ne perdra pas la trace du compteur, la variable <var class="varname">$a</var> est
    déclarée comme une variable statique :
   </p>
   <p class="para">
    <div class="example" id="example-7">
     <p><strong>Exemple #7 Les variables statiques (2)</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">()<br />{<br />    static </span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />    echo </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$a</span><span style="color: #007700">++;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
   <p class="simpara">
    Maintenant, la variable <var class="varname">$a</var> est initialisée uniquement
    lors du premier appel à la fonction et, à chaque fois que la fonction
    <code class="literal">test()</code> est appelée, elle affichera une valeur de
    <var class="varname">$a</var> incrémentée de 1.
   </p>
   
   <p class="simpara">
    Les variables statiques sont essentielles lors
    d&#039;appels récursifs à une fonction. La fonction
    suivante compte récursivement jusqu&#039;à 10, en utilisant la variable
    <var class="varname">$count</var> pour savoir quand il faut s&#039;arrêter :
   </p>
   <p class="para">
    <div class="example" id="example-8">
     <p><strong>Exemple #8 Les variables statiques et la récursivité</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">()<br />{<br />    static </span><span style="color: #0000BB">$count </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /><br />    </span><span style="color: #0000BB">$count</span><span style="color: #007700">++;<br />    echo </span><span style="color: #0000BB">$count</span><span style="color: #007700">;<br />    if (</span><span style="color: #0000BB">$count </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">10</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">test</span><span style="color: #007700">();<br />    }<br />    </span><span style="color: #0000BB">$count</span><span style="color: #007700">--;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
   
   <p class="para">
    Avant PHP 8.3.0, une variable statique ne pouvait être initialisée qu&#039;en utilisant
    une expression constante. À partir de PHP 8.3.0, les expressions dynamiques
    (par exemple, les appels de fonction) sont également autorisées :
   </p>
   <p class="para">
    <div class="example" id="example-9">
     <p><strong>Exemple #9 Déclaration de variables statiques</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(){<br />    static </span><span style="color: #0000BB">$int </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;          </span><span style="color: #FF8000">// correct<br />    </span><span style="color: #007700">static </span><span style="color: #0000BB">$int </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">+</span><span style="color: #0000BB">2</span><span style="color: #007700">;        </span><span style="color: #FF8000">// correct<br />    </span><span style="color: #007700">static </span><span style="color: #0000BB">$int </span><span style="color: #007700">= </span><span style="color: #0000BB">sqrt</span><span style="color: #007700">(</span><span style="color: #0000BB">121</span><span style="color: #007700">);  </span><span style="color: #FF8000">// correct à partir de PHP 8.3.0<br /><br />    </span><span style="color: #0000BB">$int</span><span style="color: #007700">++;<br />    echo </span><span style="color: #0000BB">$int</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
   <p class="simpara">
    Les variables statiques à l&#039;intérieur des fonctions anonymes persistent uniquement au sein de cette
    instance spécifique de la fonction. Si la fonction anonyme est recréée à chaque
    appel, la variable statique sera réinitialisée.
   </p>
   <div class="example" id="example-10">
    <p><strong>Exemple #10 Variables statiques dans les fonctions anonymes</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">exampleFunction</span><span style="color: #007700">(</span><span style="color: #0000BB">$input</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$result </span><span style="color: #007700">= (static function () use (</span><span style="color: #0000BB">$input</span><span style="color: #007700">) {<br />        static </span><span style="color: #0000BB">$counter </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$counter</span><span style="color: #007700">++;<br />        return </span><span style="color: #DD0000">"Input: </span><span style="color: #0000BB">$input</span><span style="color: #DD0000">, Counter: </span><span style="color: #0000BB">$counter</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />    });<br /><br />    return </span><span style="color: #0000BB">$result</span><span style="color: #007700">();<br />}<br /><br /></span><span style="color: #FF8000">// Les appels à exampleFunction recréent la fonction anonyme, donc la variable statique<br />// ne conserve pas sa valeur.<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">exampleFunction</span><span style="color: #007700">(</span><span style="color: #DD0000">'A'</span><span style="color: #007700">); </span><span style="color: #FF8000">// Affiche : Input: A, Counter: 1<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">exampleFunction</span><span style="color: #007700">(</span><span style="color: #DD0000">'B'</span><span style="color: #007700">); </span><span style="color: #FF8000">// Affiche : Input: B, Counter: 1<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="para">
    À partir de PHP 8.1.0, lorsqu&#039;une méthode utilisant des variables statiques
    est héritée (mais pas surchargée), la méthode héritée partage désormais les
    variables statiques avec la méthode parente.
    Cela signifie que les variables statiques dans les méthodes se comportent
    dorénavant de la même manière que les propriétés statiques.
   </p>

   <p class="simpara">
    À partir de PHP 8.3.0, les variables statiques peuvent être initialisées avec des expressions arbitraires.
    Cela signifie que des appels de méthode, par exemple, peuvent être utilisés pour initialiser des variables statiques.
   </p>

   <div class="example" id="example-11">
      <p><strong>Exemple #11 Utilisation de variables statiques dans les méthodes héritées</strong></p>
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Foo </span><span style="color: #007700">{<br />    public static function </span><span style="color: #0000BB">counter</span><span style="color: #007700">() {<br />        static </span><span style="color: #0000BB">$counter </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$counter</span><span style="color: #007700">++;<br />        return </span><span style="color: #0000BB">$counter</span><span style="color: #007700">;<br />    }<br />}<br />class </span><span style="color: #0000BB">Bar </span><span style="color: #007700">extends </span><span style="color: #0000BB">Foo </span><span style="color: #007700">{}<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">Foo</span><span style="color: #007700">::</span><span style="color: #0000BB">counter</span><span style="color: #007700">()); </span><span style="color: #FF8000">// int(1)<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">Foo</span><span style="color: #007700">::</span><span style="color: #0000BB">counter</span><span style="color: #007700">()); </span><span style="color: #FF8000">// int(2)<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">Bar</span><span style="color: #007700">::</span><span style="color: #0000BB">counter</span><span style="color: #007700">()); </span><span style="color: #FF8000">// int(3), avant PHP 8.1.0 int(1)<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">Bar</span><span style="color: #007700">::</span><span style="color: #0000BB">counter</span><span style="color: #007700">()); </span><span style="color: #FF8000">// int(4), avant PHP 8.1.0 int(2)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

   </div>
  </div>
  
  <div class="sect2" id="language.variables.scope.references">
   <h3 class="title">
    Les références avec les variables <code class="literal">global</code> et <code class="literal">static</code>
   </h3>
   <p class="simpara">
    PHP implémente les modificateurs de variables
    <a href="language.variables.scope.php#language.variables.scope.static" class="link">static</a>
    et <a href="language.variables.scope.php#language.variables.scope.global" class="link">global</a>,
    en termes de <a href="language.references.php" class="link">référence</a>.
    Par exemple, une vraie variable globale est importée dans un
    contexte de fonction avec <code class="literal">global</code>.
    Cette commande crée en fait une référence sur la variable globale. Cela
    peut mener à des comportements inattendus, par exemple :
   </p>
   
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test_global_ref</span><span style="color: #007700">() {<br />    global </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$new </span><span style="color: #007700">= new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$obj </span><span style="color: #007700">= &amp;</span><span style="color: #0000BB">$new</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">test_global_noref</span><span style="color: #007700">() {<br />    global </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$new </span><span style="color: #007700">= new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$obj </span><span style="color: #007700">= </span><span style="color: #0000BB">$new</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">test_global_ref</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">test_global_noref</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>

   <p class="para">L&#039;exemple ci-dessus va afficher :</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
NULL
object(stdClass)#1 (0) {
}
</pre></div>
   </div>
   
   <p class="simpara">
    Un comportement similaire s&#039;applique à la commande <code class="literal">static</code>.
    Les références ne sont pas stockées dynamiquement :
   </p>
   
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function &amp;</span><span style="color: #0000BB">get_instance_ref</span><span style="color: #007700">() {<br />    static </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br /><br />    echo </span><span style="color: #DD0000">'Static object: '</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">);<br />    if (!isset(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$new </span><span style="color: #007700">= new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">;<br />        </span><span style="color: #FF8000">// Assigne une référence à la variable statique<br />        </span><span style="color: #0000BB">$obj </span><span style="color: #007700">= &amp;</span><span style="color: #0000BB">$new</span><span style="color: #007700">;<br />    }<br />    if (!isset(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">property</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">property </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />    } else {<br />        </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">property</span><span style="color: #007700">++;<br />    }<br />    return </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br />}<br /><br />function &amp;</span><span style="color: #0000BB">get_instance_noref</span><span style="color: #007700">() {<br />    static </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br /><br />    echo </span><span style="color: #DD0000">'Static object: '</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">);<br />    if (!isset(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$new </span><span style="color: #007700">= new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">;<br />        </span><span style="color: #FF8000">// Assigne l'objet à la variable statique<br />        </span><span style="color: #0000BB">$obj </span><span style="color: #007700">= </span><span style="color: #0000BB">$new</span><span style="color: #007700">;<br />    }<br />    if (!isset(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">property</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">property </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />    } else {<br />        </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">property</span><span style="color: #007700">++;<br />    }<br />    return </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$obj1 </span><span style="color: #007700">= </span><span style="color: #0000BB">get_instance_ref</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$still_obj1 </span><span style="color: #007700">= </span><span style="color: #0000BB">get_instance_ref</span><span style="color: #007700">();<br />echo </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$obj2 </span><span style="color: #007700">= </span><span style="color: #0000BB">get_instance_noref</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$still_obj2 </span><span style="color: #007700">= </span><span style="color: #0000BB">get_instance_noref</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="para">L&#039;exemple ci-dessus va afficher :</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)#3 (1) {
  [&quot;property&quot;]=&gt;
  int(1)
}
</pre></div>
   </div>
   
   <p class="simpara">
    Ces exemples illustrent les problèmes rencontrés lors de l&#039;assignation
    de référence à des variables statiques, qui sont
    <em>oubliées</em> lorsque
    <code class="literal">&amp;get_instance_ref()</code> est appelé une seconde fois.
   </p>
  </div>
 </div><?php manual_footer($setup); ?>