web-dev-qa-db-fra.com

Variables statiques dans PHP

J'ai trouvé différentes informations concernant les variables statiques dans PHP, mais rien qui explique réellement ce que c'est et comment cela fonctionne. 

J'ai lu que lorsqu'il est utilisé dans une classe, une propriété statique ne peut pas être utilisée par un objet instancié par cette classe et qu'une méthode statique peut être utilisée par un objet instancié par la classe? 

Cependant, j'ai essayé de rechercher ce qu'une variable statique fait dans une fonction qui n'est pas dans une classe. De plus, une variable statique dans une fonction fonctionne-t-elle un peu comme une fermeture en javascript ou suis-je totalement dans cette hypothèse?

24
mike

J'ai lu que lorsqu'il est utilisé dans une classe, une propriété statique ne peut pas être utilisée par un objet instancié par cette classe 

Cela dépend de ce que vous entendez par là. par exemple:

class Foo {
    static $my_var = 'Foo';
}

$x = new Foo();

echo $x::$my_var;  // works fine
echo $x->my_var;   // doesn't work - Notice: Undefined property: Foo::$my_var

et qu'une méthode statique peut être utilisée par un objet instancié par la classe ??? 

Oui, un objet instancié appartenant à la classe peut accéder à une méthode statique.

Le mot clé static dans le contexte des classes se comporte un peu comme des variables de classe statiques dans d'autres langues. Un membre (méthode ou variable) déclaré static est associé à la classe et non à une instance de cette classe. Ainsi, vous pouvez y accéder sans une instance de la classe (par exemple: dans l'exemple ci-dessus, je pourrais utiliser Foo::$my_var)


Cependant, j'ai essayé de rechercher ce qu'une variable statique fait dans une fonction qui n'est pas dans une classe. 

En outre, une variable statique dans une fonction fonctionne-t-elle un peu comme une fermeture en javascript ou suis-je totalement dans cette hypothèse.

En dehors des classes (c'est-à-dire: dans les fonctions), une variable static est une variable qui ne perd pas sa valeur à la fermeture de la fonction. Donc, dans le sens, oui, elles fonctionnent comme des fermetures en JavaScript. 

Mais contrairement aux fermetures JS, il n'y a qu'une seule valeur pour la variable qui est maintenue lors d'appels différents de la même fonction. Dans l'exemple du manuel PHP:

function test()
{
    static $a = 0;
    echo $a;
    $a++;
}

test();  // prints 0
test();  // prints 1
test();  // prints 2

Référence: static mot-clé (en classes) , (en fonctions)

32
NullUserException

static a deux utilisations en PHP:

Premièrement, et le plus souvent, il peut être utilisé pour définir des variables/fonctions de «classe» (par opposition à des variables/fonctions d'instance), accessibles sans instancier une classe:

class A {
  public static $var = 'val'; // $var is static (in class context)
  public $other_var = 'other_val'; // non-static
}

echo A::$var; // val
echo A::$other_var // doesn't work (fatal error, undefined static variable)

$a = new A;
echo $a->var // won't work (strict standards)
echo $a->other_var // other_val

Deuxièmement, il peut être utilisé pour maintenir l'état entre les appels de fonction:

function a() {
  static $i = 0;
  $j = 0;
  return array($i++, $j++);
}
print_r(a()); // array(0, 0)
print_r(a()); // array(1, 0)
print_r(a()); // array(2, 0)
//...

Notez que la déclaration d'une variable statique dans une fonction fonctionne de la même manière, que la fonction soit définie ou non dans une classe. Tout ce qui compte est de savoir où la variable est déclarée (membre de la classe ou dans une fonction).

22
connec

Une variable statique dans une fonction est initialisée uniquement lors du premier appel de cette fonction dans son script en cours d'exécution.

6
young

Au début, je vais expliquer ce qui se passera si la variable statique n'est pas utilisée

<?php
function somename() {
    $var = 1;
    echo $var . "<br />";
    $var++;
}
somename();
somename();
somename();
?>

Si vous exécutez le code ci-dessus, le résultat obtenu sera 1 1 1. Depuis que vous avez appelé cette variable de fonction à chaque fois, elle affecte 1 et l’imprime.


Voyons maintenant si la variable statique est utilisée

<?php
function somename() {
    static $var = 1;
    echo $var . "<br />";
    $var++;
}
somename();
somename();
somename();
?>

Maintenant, si vous exécutez cet extrait de code, la sortie sera 1 2 3.

Remarque: Static conserve sa valeur et reste fidèle à chaque appel de la fonction. Il ne perdra pas sa valeur lorsque la fonction est appelée.

0
Gnanasekar S
class Student {
static $total_student = 0;
static  function add_student(){
    return Student::$total_student++;
}
}

Premièrement: pour la fonction add_student, la meilleure pratique consiste à utiliser static non public . Deuxièmement: dans la fonction add_student, nous utilisons Student :: $ total_student, et non pas $ this-> total_student. Ceci est très différent de la variable normale . Troisièmement: les variables statiques sont partagées dans l’arbre de l’héritage.

prenez le code ci-dessous pour voir quel est le résultat:

class One {
static $foo ;
}
class Two extends One{}
class Three extends One{}
One::$foo = 1;
Two::$foo = 2;
Three::$foo = 3;
echo One::$foo;
echo Two::$foo;
echo Three::$foo;`
0
li bing zhao