W C# istnieje możliwość utworzenia statycznego konstruktora, który jest uruchamiany przy pierwszym odwołaniu do danej klasy. Wygląda to mniej więcej tak:
public class Foo
{
static Foo()
{
System.Diagnostics.Trace.Write(“Klasa Foo zostala zaladowana”);
}
}
Zdarza się, że podobna funkcjonalność przydałaby się w PHP, który jednak tej konstrukcji nie obsługuje. Można to jednak w prosty sposób “zasymulować” poprzez odpowiednie zmodyfikowanie “magicznej” funkcji __autoload() oraz dodanie statycznej metody do klasy, która będzie udawać konstruktora (w moim przykładzie użyłem nazwy staticConstruct).
class Foo
{
public function __construct()
{
// ‘normalny’ konstruktor
}
public static function staticConstruct()
{
echo ‘Klasa Foo zostala zaladowana’;
}
}
function __autoload($className)
{
// obsluga zaladowania klasy
// …
// …
if(is_callable(array($className, ’staticConstruct’)))
{
call_user_func(array($className, ’staticConstruct’));
}
}
Jak widać sposób implementacji jest wręcz trywialny. Niemniej pojawia się dwie kwestii, które trzeba wyjaśnić:
- statyczny konstruktor jest publiczny przez co można wywoływać go w kodzie – można ten problem rozwiązać poprzez wprowadzenie odpowiedniego statycznego pola typu boolean, które będzie sprawdzane przez owy konstruktor – nie jest to do końca “eleganckie” rozwiązanie, niemniej innego sposobu nie dostrzegłem
- statyczny konstruktor w klasie dziedziczącej nie musi (i nie jest to nawet wskazane) wcale wywoływać konstruktora z klasy nadrzędnej, bowiem zostanie on samodzielnie wywołany przez __autoload() w czasie ładowania klasy


0 Responses to “Statyczny konstruktor w PHP”
Leave a Reply