Задать вопрос
Dier_Sergio_Great
@Dier_Sergio_Great
Увлеченный человек

Как реализовать аналог статического конструктора в классе PHP?

Как реализовать аналог статического конструктора в классе PHP.
Чтобы статические методы могли обращаться к статическим свойствам?
  • Вопрос задан
  • 2922 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
27cm
@27cm
TODO: Написать статус
Вот в C# есть кроме обычного конструктора статический конструктор. суть его в том что при любом ПЕРВОМ обращении к статическим свойствам класса перед этим обращением выполняется статический конструктор. В котором определяются свойства для класса.


Похоже, что никак. Чтобы перед обращением к статическому свойству отработал какой-либо метод (статический конструктор), нужен аналог "магического" метода __get() для статических свойств, а такой в PHP отсутствует. Более того, даже если бы такой метод был, он бы не срабатывал если статическое свойство уже определено в классе, пришлось бы принудильно делать unset() для всех статических свойств, что приведёт к ошибке.

Поэтому вижу только один выход: обращайтесь к статическим свойствам через статические get-методы, в которых уже и вызывайте "статический конструктор".

<?php

class Test
{
    static public $foo = 1;
    static public $bar = 1;

    static public function getFoo()
    {
        return static::__getStatic('foo');
    }
    
    static public function getBar()
    {
        return static::__getStatic('bar');
    }
    
    /**
     * Вызывает __constructorStatic() при первом обращении
     * и возвращает значение статического свойства $name.
     *
     * @param string $name Имя статического свойства класса.
     */ 
    static protected function __getStatic($name)
    {
        static $called = false;
        if (!$called) {
            $called = true;
            self::__constructorStatic();
        }
        return static::${$name};
    }

    /**
     * "Статический конструктор" класса.
     */
    static private function __constructorStatic()
    {
        static::$bar++;
        static::$foo++;
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Нет проблемы, чтобы из обычного метода обращаться к статическим свойства. Есть проблема, чтобы из статического метода обращаться к обычным свойствам.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы