Динамическое заполнение статической переменной в PHP - PullRequest
5 голосов
/ 17 мая 2011

У меня есть два статических значения: "type" и "typeID". Тип удобен для чтения и является постоянным, и typeID необходимо искать в базе данных на основе значения типа. Мне нужно, чтобы поиск происходил один раз, когда определение класса впервые загружено

Для иллюстрации приведем код, который не работает, потому что вы не можете вызывать функции в пространстве объявлений.

MyClass extends BaseClass {
  protected static $type = "communities";
  protected static $typeID = MyClass::lookupTypeID(self::$type);
}

Существует ли магический метод, который вызывается ровно один раз при загрузке определения класса? Если есть что-то очевидное, я упускаю это.

Ответы [ 3 ]

11 голосов
/ 17 мая 2011

беззастенчиво извлекается из комментариев статического ключевого слова руководства php:

3 голосов
/ 12 апреля 2013

Просто и не нужно никакого волшебства, не забывайте, что вы всегда можете определить переменную как null и проверить, что она равна null (только после этого вызов db). Тогда это просто вопрос, если вы хотите, чтобы это произошло, когда класс создается или включается (include_once и т.д ...)

MyClass extends BaseClass {
    protected static $type = "communities";
    protected static $typeID = null;

    public function __construct(){
        if(is_null(self::$typeID)){
            self::lookupTypeID(self::$type);
        }
    }

    public static lookupTypeID($type){
        self::$typeID = //result of database query
    }
}

или

MyClass::lookupTypeID(); //call static function when class file is included (global space)

MyClass extends BaseClass {
    protected static $type = "communities";
    protected static $typeID = null;

    public function __construct(){

    }

    public static lookupTypeID($type=null){
        if(is_null($type)){
            $type = self::$type;
        }
        self::$typeID = //result of database query (SELECT somefield FROM sometable WHERE type=$type) etc..
    }
}

статический конструктор больше похож на фабричный метод

if(!function_exists(build_myclass)){
    function build_myclass(){
        return MyClass::build();
    }
}

MyClass extends BaseClass {
    protected static $type = "communities";
    protected static $typeID = null;

    public function __construct(){

    }

    public static function build(){
        return new self(); //goes to __construct();
    }

 }

$class = new MyClass(); //or
$class = MyClass::build(); //or
$class = build_myclass();
1 голос
/ 17 мая 2011

Такую вещь обычно называют «статическим конструктором», но в PHP таких вещей нет. Возможно, вы захотите рассмотреть один из обходных путей, предложенных в комментариях к руководству по PHP, например, http://www.php.net/manual/en/language.oop5.static.php#95217

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...