обходной путь инициализации статического массива php - PullRequest
1 голос
/ 29 июля 2011

Я не уверен, что мне нужно искать, чтобы выяснить эту проблему, поэтому я покажу код и опишу проблему:

PHP код:

<?php
class Foo
{
  private static
    $defaultSettings = array(
      'bar' => new Baz() //error here
    );

  private
    $settings;

  public function __construct( $options = null )
  {
    $this->settings = isset( $options ) ? array_merge( self::$defaultSettings, $options ) : self::$defaultSettings;
  }
}

class Baz
{
  ...code...
}

Ошибка:

Parse error: syntax error, unexpected T_NEW in [filename] on line [number]

Я хотел бы, чтобы Foo::$defaultSettings содержал экземпляр объекта, но я не могу инициализировать объект при создании массива.

Есть ли более простой способ обойти эту проблему, чем статический инициализатор?

Статический код инициализатора для Foo:

//self::init() would be called on the first line of __construct
private static function init()
{
  static $initialized;

  if ( !$initialized )
  {
    $initialized = true;
    self::$defaultSettings['bar'] = new Baz();
  }
}

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


Изменить, чтобы добавить:

Я также мог бы сделать функцию инициализатора public и вызывать ее сразу после определения класса как Foo::init();, что уменьшило бы служебную нагрузку функции __construct; тем не менее, я не вижу, чтобы один вызов метода был значительным сбережением.

1 Ответ

3 голосов
/ 29 июля 2011

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

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