Poate cineva să clarifice variabilele statice pentru mine?

Folosind PHP aici, am decis să citesc capitolul manual pe capitol și să învăț lucruri noi. Deci, acum am descoperit variabile statice, care par a fi un concept minunat, dar modul în care înțeleg este:

Variabilele statice sunt setate o dată și numai o singură încărcare a scenariului. Acestea pot fi schimbate și incrementate, dar nu re-setate. Se utilizează de obicei în funcții pentru a seta o valoare și nu trebuie să inițializeze acea variabilă de fiecare dată când funcționează funcția.

<?php

function count2( $inputNum ) {
    static $a = $inputNum;
    echo $a++; //Echo and then increment.
}

for ( $i = 0; $i < 10; $i++ ) {
    count2(50);
}

?>

M-aș aștepta ca acest lucru să pornească staticul $ a var la 50 și incrementarea de 11 ori. De unde am o eroare?

1

3 răspunsuri

Ca orice altă variabilă statică PHP, proprietățile statice pot fi inițializate numai folosind o literală sau constantă ; expresiile nu sunt permise.   Deci, în timp ce puteți inițializa o proprietate statică la un întreg sau o matrice   (de exemplu), este posibil să nu îl inițializați la altă variabilă , la a   valoarea returnată a funcției sau la un obiect.

Cred că ți-a lipsit acea parte din docs (subliniază a mea) :)

4
adăugat
Ah da, mi-a fost dor de asta. Acest manual este greu pentru mine, tot continua sa vorbesc despre concepte pe care probabil ma asteapta sa le stiu, si apoi introduce conceptul ca 3 pagini mai tarziu ... multumesc!
adăugat autor user1159454, sursa
@ user1159454 nici o problema :)
adăugat autor Andreas Wong, sursa

Variabila statică nu poate fi inițializată cu altă variabilă, a cărei valoare nu este cunoscută până la execuție. Trebuie să îl inițializați cu o valoare cunoscută la momentul compilării.

function count2($inputNum) {
 //Initialize only once to an integer (non variable, non-expression)
  static $a = 0;
  if ($a === 0) {
   //If $a is still 0, set it to $inputNum
    $a = $inputNum;
  }
  echo $a++;
}

// First run outputs 25
count2(25);
// 25
// Subsequent runs increment
count2(25);
// 26
count2(25);
// 27

Documentație relevantă ...

1
adăugat
Mulțumesc, lasă-mă să văd dacă am dreptate. Setați valoarea statică la o valoare ingenioasă (0) doar pentru a spune că este statică, iar atunci când o schimbați la parametru, ea încă mai păstrează starea statică, astfel încât să nu se reinitializeze ea însăși?
adăugat autor user1159454, sursa
@ user1159454 da-l păstrează, data viitoare când funcția se numește linia static $ a = 0 nu va avea efect
adăugat autor Andreas Wong, sursa
@ user1159454 Da, este corect. Inițializarea static va avea loc numai o singură dată, iar funcția va păstra valoarea pentru apelurile ulterioare. Codul $ a ++ îl incrementează (după returnare și ecou).
adăugat autor Michael Berkowski, sursa

Puține probleme de pe lilieci:

  • You can only declare a static var once. Your syntax clobbers it over and over by calling count2() 10 times.
  • You can't use the ++ operator because you can't change a static var
  • Not using define and constant

Poate încercați ceva de genul:

<?php
error_reporting(E_ALL);

/* setup */

function set( $input ) {
    define( 'A', $input );
}
function tick() {
    echo constant( 'A' ) . "\n";
}

/* run */

set( 50 );
for($i=0; $i<10; $i++){
    tick();
}

?>

Aceasta va produce:

$ PHP test.php 
50
50
50
50
50
50
50
50
50
50
0
adăugat
În exemplul pe care l-am bazat pe asta din documentele pe care le-am făcut (increment). De asemenea, funcționează dacă inițializez static var cu un număr
adăugat autor user1159454, sursa
Hmmm, am testat și aceasta funcționează: $ PHP -r 'static $ a = 3; $ A ++; echo $ a; '
adăugat autor Andreas Wong, sursa
PHP România, Moldova
PHP România, Moldova
173 participanți

Vorbim despre Yii, Laravel, Symphony, MySQL, PgSQL, WP, OpenCart... Pentru confort, opriți notificările. Parteneri: https://ciupacabra.com @js_ro @node_ro @python_ro @seo_ro @Romania_Bot Offtop: @holywars_ro Joburi: @php_job @Grupuri_IT