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

    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 комментарий
  • Как можно узнать свой уровень в конкретном ЯП?

    @mik222
    Что то полезное сделать можете?
    А так чтобы в этом можно было потом разобраться через пол года?
    А чтобы была возможность расширяемости?
    И минимальный набор багов?
    А если это что-то новое(алгоритм хитрый из academic paper)?
    Разобраться за вменяемое время в незнакомой области сможете?
    ===================
    Если на все ответы ответ да, то вы знаете достаточно для коммерческой разработки.
    Confidence: 86%
    Ответ написан
    5 комментариев