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';
}
}
?>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();
?>Hello world!
Przejdźmy teraz do cięższej rzeczy, a mianowicie
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_null( self::$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
?>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
?>Hello world!
Dodaj nową odpowiedź