2
votes

initialisation de la variable statique php à l'aide du mot-clé $ this

J'ai une méthode à l'intérieur d'une classe, dans laquelle je veux initialiser une variable statique.

1 / quand j'initialise la variable, puis l'affecter à une autre valeur en utilisant le $ this code> mot-clé, ça marche. Ex:

class Test {
       // ...
       function test($input_variable)
       {
          static $my_static_variable = $this->someFunction($input_variable); // *** syntax error, unexpected '$this' (T_VARIABLE)
          // ... some further processing 
       }
}

2 / Cependant, lorsque j'essaye d'initialiser / construire directement la variable avec le mot-clé $ this , il y a une erreur de syntaxe: '$ this' inattendu (T_VARIABLE) :

class Test {
   // ...
   function test($input_variable)
   {
      static $my_static_variable = null;
      if (!isset($my_static_variable))
        $my_static_variable = $this->someFunction($input_variable);
      // ... some further processing 
   }
}

1 / est-il un bon moyen d'initialiser une variable statique? Pourquoi 2 / n'est-il pas autorisé, car il est censé faire exactement la même chose que dans 1 /?

J'utilise PHP 5.5.21 (cli) (build: 22 juillet 2016 08:31: 09).

Merci


4 commentaires

Pourquoi auriez-vous besoin d'utiliser une variable statique dans une méthode de classe? Utilisez plutôt une propriété de classe: protected $ my_static_variable; puis utilisez $ this-> my_static_variable = $ this-> someFunction (); .


@MagnusEriksson Je souhaite utiliser une variable statique, donc sa valeur est conservée entre chaque appel.


La valeur sera également conservée dans une propriété de classe. L'avantage de l'utilisation d'une propriété de classe est que vous pouvez également accéder à la variable à partir d'autres méthodes, ou est-ce que vous ne voulez pas?


@MagnusEriksson oui, vous avez raison. J'ai écrit une explication ci-dessous. Merci.


3 Réponses :


0
votes

Vous ne pouvez pas utiliser $ this sur une variable statique. Vous pouvez utiliser self avec l'opérateur de résolution de portée (: :) à la place.

Voici l'exemple:

class Foo {
  public static $my_stat;

  static function init() {
    self::$my_stat= 'My val';
  }
}


1 commentaires

Avoir static $ variable; dans une fonction / méthode n'est pas la même chose que les propriétés de classe statique.



0
votes

Les variables et fonctions statiques sont accessibles sans instanciation de la classe. Vous ne pouvez pas utiliser $ this pour accéder à la variable ou à la fonction déclarée statique. Vous devez utiliser l'opérateur de résolution de portée :: pour accéder à la variable et aux fonctions déclarées comme statiques.

Pour les variables: -

A::aStaticMethod();

Utilisez ce qui suit pour accéder à la variable: -

class A {
    public static function aStaticMethod() {
        // ...
    }
}

Pour les fonctions: -

print A::$my_static

Vous pouvez appeler la fonction comme suit: -

class A
{
    static $my_static = 'foo';

    public function staticValue() {
        return self::$my_static;// Try to use $this here insted of self:: you will get error
    }
}

class B extends A
{
    public function fooStatic() {
        return parent::$my_static;
    }
}


1 commentaires

Avoir static $ variable; dans une fonction / méthode n'est pas la même chose que des membres de classe statiques.



0
votes

Je pense avoir la réponse. Dans la documentation php , il est indiqué ce qui suit:

Les variables statiques peuvent être déclarées comme indiqué dans les exemples ci-dessus. De PHP 5.6 vous pouvez attribuer des valeurs à ces variables qui sont le résultat d'expressions, mais vous ne pouvez utiliser aucune fonction ici, ce qui provoquera un erreur d'analyse .

Je suppose que cela vaut également pour PHP 5.5.

Comme @MagnusEriksson l'a souligné, j'aurais pu également utiliser une propriété de classe. Cependant, je ne veux pas que ma variable soit accessible ailleurs que par la méthode test () .

BTW, d'une manière ou d'une autre, la même chose est indiquée pour les propriétés statiques dans la doc < / a>:

Les propriétés statiques ne sont pas accessibles via l'objet à l'aide de opérateur de flèche ->.

Comme toute autre variable statique PHP, les propriétés statiques ne peuvent être initialisé en utilisant un littéral ou une constante avant PHP 5.6; expressions ne sont pas autorisés . Dans PHP 5.6 et versions ultérieures, les mêmes règles s'appliquent que const expressions: certaines expressions limitées sont possibles, à condition qu'elles puissent être évalué au moment de la compilation.


0 commentaires