My blog

posts

Static modifier

In ultimul articol am vorbit despre ce sunt aceia modificatori de acces si cand sa ii folosim. Astazi, am decis sa mai aduc inca un concept destul de important la urechile voastre si anume modificatorul static. 

Modificatorul static declara o variabila/functie independenta de instanta unei clase. La ce ma refer prin asta? Practic nu va mai fi nevoie sa creezi o noua instanta de clasa A pentru a folosi o functie, daca aceasta este statica. Hai sa luam ca exemplu o clasa Math care sa aiba o functie add care aduna mai multe numere. 
class Math{
  public function add(...$nums){
   return array_sum($nums);
  }
}

$math = new Math();
echo $math->add([1,2,3]);
Dupa cum vezi, in momentul acesta pentru a folosi functia add a fost nevoie sa creez o instanta de clasa Math in variabila $math. Dar ce se intampla daca fac functia add statica? Hai sa vedem: 
class Math{
  public static function add(...$nums){
   return array_sum($nums);
  }
}
echo  Math::add([1,2,3]);

Asa cum se observa in exemplu, nu am mai fost nevoit sa am o instanta de clasa Math pentru a folosi functia add, ci am accesat-o folosind direct numele clasei si operatorul :: .
De retinut!  Aceasta varianta nu este intotdeauna cea mai buna alegere, deoarece atat functiile, cat si variabilele statice vor fi partajate de toate instantele viitoare ale clasei. 
Dar hai mai bine sa dam un exemplu care sa exemplifice acest lucru. Sa spunem ca avem o clasa Vehicle careia ii vom adauga ca variabila statica $passengers.
class Vehicle {
 public static $passengers = 1;
}
Acum hai sa ne gandim putin, am precizat mai sus ca odata declarata statica o variabila aceasta va avea aceeasi valoare indiferent de instanta care o acceseaza. Evident exemplul pe care il discutam acum este o un caz de abordate proasta a problemei, deoarece nu este posibil ca toate vehiculele sa aiba mereu un singur pasager. Desigur, putem crea o functie care sa creasca numarul de pasageri, dar cum va functiona asta?
class Vehicle {
  public static $passengers = 1;

   public function addPassenger(){
      static::passenger++;
   }
}

$joeVehicle = new Vehicle();
echo $joeVehicle->addPassenger(); // 2
Prima si prima data sunt sigur ca ai observat ca nu am accesat variabila $passengers cum o faceam normal, folosind operatorul $this, in schimb am folosit operatorul static, asta pentru ca: 
Variabilele si functiile statice ale unei clase pot fi actionate in interiorul ei numai prin operatorul static. 
Pana acum, pare ca totul sa mearga dupa cum ne dorim, insa ce-ar fi daca ar mai fi un vehicul in ecuatie? 

$joeVehicle = new Vehicle();
$joeVehicle->addPassenger(); 
$joeVehicle->addPassenger(); 
echo $joeVehicle::passengers; // 3

$janeVehicle = new Vehicle();
$janeVehicle->addPassenger(); 
echo $janeVehicle::passengers; // 4
Hopa, ceva n-a mers bine. La asta ma refeream cand spuneam ca instantele claselor impartasesc variabilele statice. De aceea, este important sa ne gandim inainte de a declara o functie/variabila ca statica daca este mai bine asa.

Dupa cum am vazut in cazul clasei Math, folosim operatorul static atunci cand instantele clasei nu depind de acea functie. Mai putem de asemenea face acest lucru atunci cand creezi functii utilitare care nu se bazeaza pe alte variabile decat cele primite ca parametrii. 

Observarii 
  1. Toate functiile statice trebuie sa fie publice
  2. Toate variabilele statice trebuie sa fie publice

Concluzie

Fii foarte atent atunci cand folosesti operatorul static, de cele mai multe ori nu vei avea nevoie de el. Dar pentru a sti cand sa il foloseste e nevoie sa capeti experienta si poate chiar sa gresesti folosindu-l in locuri nepotrivite. Lasand asta la o parte, operatorul static este o caracteristica importanta care ne ajuta sa scriem code simplu si eficient. 

Daca ti-a placut acest articol lasa-mi un comentariu si spune-mi asta, inseamna enorm de mult sa stiu ca cineva citeste prostiile pe care le scriu. Daca nu ti-a placut, lasa-mi un sfat in comentarii pentru a-mi putea imbunatati calitatea continutului de pe blog. 

0 Comments

  • Be the first one who leaves a comment!

Add a comment