Metody statyczne i niestatyczne - w te i we w te

Tematem tego artykułu będzie "przepis" jak używać metod i właściwości statycznych w elementach klasy wymagających utworzenia jej instancji. Rozpatrzymy również przypadek odwrotny.

Przyjrzyjmy się najpierw klasie:

<?php
class NaszaKlasa
{
   public static function 
world()
   {
      return 
'world';
   }

   public function 
hello()
   {
      return 
'Hello';
   }
}
?>

Odwoływanie się do metod/właściwości statycznych w elemtach wymagających utworzenia obiektu klasy

Aby wykonać taką operacje wystarczy użyć słowa kluczowego self z podwójnym dwukropkiem oraz wywołać nazwę elementu klasy. Dopiszmy więc taką metode do naszej przykładowej klasy:

<?php
class NaszaKlasa
{
   public static function 
world()
   {
      return 
'world';
   }

   public function 
hello()
   {
      return 
'Hello';
   }

   public function 
helloworld()
   {
      return 
$this->hello().' '.self::world().'!';
   }
}

$c=new NaszaKlasa;
echo 
$c->helloworld();
?>

W wyniku działania kodu otrzymamy:

Hello world!

Przejdźmy teraz do cięższej rzeczy, a mianowicie

Używanie metod oraz właściwości klasy wymagających utworzenia ich obiektu w statycznych metodach klasy

To zadanie możemy wykonać na dwa sposoby. W obydwóch musimy jednakże pamiętać aby niestatyczne elementy klasy, które będziemy używać muszą mieć widoczność publiczną. Kolejną rzeczą będzie słowo kluczowe __CLASS__, które zwraca nazwę klasy, wktórej zostało użyte.

W pierwszym, możemy utworzyć sobie statyczną metodę, którą będziemy zastepować każdą operacje utworzenia obiektu klasy, a w której utworzymy sobie sobie obiekt jej i przypiszemy go do statycznej właściwości i w przypadku kiedy będziemy musieli wykorzystać ten niestatyczny element odwołamy się do tej zmiennej statycznej. Jak to wygląda w praktyce:

<?php
class NaszaKlasa
{
   
/**
    * Zmienna w której będziemy przechowywać obiekt/instancje naszej klasy
    */
   
protected static $instance=null;

   public static function 
world()
   {
      return 
'world';
   }

   public function 
hello()
   {
      return 
'Hello';
   }

   public function 
helloworld()
   {
      return 
$this->hello().' '.self::world().'!';
   }

   
/**
    * Metoda, która będzie nam zastępować tworzenie obiektu klasy. W wyniku
    * jej działania otrzymamy obiekt klasy
    */
   
public static function getInstance()
   {
      
//warunek wykonywany kiedy nie posiadamy instancji klasy, tworzy ją
      
if (is_nullself::$instance ))
      {
         
$nazwaklasy=__CLASS__//pobranie nazwy klasy
         
self::$instance=new $nazwaklasy//utworzenie obiektu klasy
      
}
      return 
self::$instance//zwrócenie obiektu klasy
   
}

   public static function 
helloworldstatic()
   {
      return 
self::$instance->hello().' '.self::world().'!';
   }

}

$c=NaszaKlasa::getInstance();
echo 
'Niestatyczna metoda: '.$c->helloworld(); //wywołanie niestatyczniej metody
echo '<br />';
echo 
'Statyczna metoda: '.NaszaKlasa::helloworldstatic(); //wywołanie statycznej metody
?>

W wyniku działania kodu otrzymamy:

Niestatyczna metoda: Hello world!
Statyczna metoda: Hello world!

Spójrzmy w kod jeszcze bliżej, utworzenie obiektu zastąpiliśmy metodą statyczną getInstance(), która zabezpiecza przy okazji przed utworzeniem nam wielu instancji klasy oraz zwraca nam "samą siebie". Rozwiązanie bardzo przydatne wprzypadku kiedy tworzymy klasę, której nie musimy tworzyć wielu obiektów, a wystarczy nam jeden, ponieważ jezeli dalej w kodzie zapomnimy, że już ja tworzyliśmy to nie dostaniemy nowej, tylko zostanie zwrócona nam ta utworzona na początku. Przykład taki zauważymy w następnym artykule, gdzie spróbujemy połączyć poznane informacje na temat programowania obiektowego w PHP 5, a mianowicie stworzymy klasę, która połączy nam pracę na bazie danych wraz z cachowaniem zwracanych wyników.

Drugą metodą rozwiązania naszego problemu będzie utworzenie "chwilowej" instancji klasy w metodzie statycznej, w ten sposób uzyskamy, również bezpośredni dostęp do do elementów niestatycznych klasy.

<?php
class NaszaKlasa
{
   public static function 
world()
   {
      return 
'world';
   }

   public function 
hello()
   {
      return 
'Hello';
   }

   public static function 
helloworldstatic()
   {
      
$nazwaklasy=__CLASS__//pobranie nazwy klasy
      
$c=new $nazwaklasy//utworzenie obiektu klasy
      
$zmienna=$c->hello(); //wykonanie metody niestatycznej
      
unset($c); //usunięcie obiektu z pamięci
      
return $zmienna.' '.self::world().'!'
   
}

}

echo 
NaszaKlasa::helloworldstatic(); //wywołanie statycznej metody
?>

W wyniku działania kodu otrzymamy:

Hello world!

Your rating: Brak Ocena: 5 (2 votes)

Dodaj nową odpowiedź

Zawartość pola nie będzie udostępniana publicznie.
  • Adresy internetowe są automatycznie zamieniane w odnośniki, które można kliknąć.
  • Dozwolone znaczniki HTML: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Znaki końca linii i akapitu dodawane są automatycznie.
  • You can use the <go> tags just like the <a> for nicer urls.

Więcej informacji na temat formatowania