Инициализировать статический член с пользовательским классом в php - PullRequest
1 голос
/ 09 апреля 2011

так как в PHP нет перечислений, я попытался сделать что-то вроде этого:

class CacheMode{    

    public static $NO_CACHE = new CacheMode(1, "No cache");

    private $id, $title;

    public function getId(){
        return $this->id;
    }

    public function getTitle(){
        return $this->title;
    }

    private function __construct($id, $title){
        $this->id = $id;
        $this->title = $title;
    }
}

Проблема в том, что я получаю ошибку разбора, если я запускаю скрипт:

Parse error: syntax error, unexpected T_NEW 

Я «сработал» с этим:

class CacheMode{     
    public static function NO_CACHE(){
        return new CacheMode(1, __("No cache",'footballStandings'));
    }

    public static function FILE_CACHE(){
        return new CacheMode(2, __("Filecache",'footballStandings'));
    }

    public static function VALUES(){
        return array(self::NO_CACHE(), self::FILE_CACHE());
    }

    private $id, $title;

    public function getId(){
        return $this->id;
    }

    public function getTitle(){
        return $this->title;
    }

    private function __construct($id, $title){
        $this->id = $id;
        $this->title = $title;
    }
}

Это работает, но я не очень доволен этим.Может кто-нибудь объяснить, почему я не могу сделать статические $ xyz = new XYZ ();Кстати или есть лучшее решение для этой проблемы?

Ответы [ 3 ]

3 голосов
/ 09 апреля 2011

Это раздражает, я знаю.Я решаю это как

class Foo {
  public static $var;
}
Foo::$var = new BarClass;

Это немного похоже на javas "статические блоки кода" (или как они там называются ^^)

В любом случае файл можно включить только один раз («Класс уже определен» (), поэтому вы можете быть уверены, что код ниже класса выполняется один раз.

1 голос
/ 09 апреля 2011

В качестве оптимизации вы можете сохранить экземпляр объекта как статическое поле, чтобы не создавать новый объект каждый раз, когда вызывается статический метод:

private static $noCache;
public static function NO_CACHE(){
  if (self::$noCache == null){
    self::$noCache = new CacheMode(1, __("No cache",'footballStandings'));
  }
  return self::$noCache;
}

Но да, досадно, что вы не можете назначить новый экземпляр объекта полю поля при первом определении поля. (

1 голос
/ 09 апреля 2011

Цитирование справочной страницы: static:

Как и любая другая статическая переменная PHP, статические свойства могут быть только инициализируется с использованием литерала или постоянная; выражения не допускаются. Так что пока вы можете инициализировать статический свойство к целому числу или массиву (для экземпляр), вы не можете инициализировать его в другую переменную, в функцию возвращаемое значение или объекту.

Вот почему вы не можете сделать

public static $NO_CACHE = new CacheMode(1, "No cache");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...