Подтвердить что ты не робот

PHP - определение статического массива объектов

Можно ли инициализировать статический массив объектов в классе PHP? Как вы можете сделать

class myclass {
    public static $blah = array("test1", "test2", "test3");
}

но когда я делаю

class myclass {
    public static $blah2 = array(
        &new myotherclass(),
        &new myotherclass(),
        &new myotherclass()
    );
}

где myotherclass определен прямо над классом myclass. Однако это порождает ошибку; есть ли способ его достижения?

4b9b3361

Ответ 1

Неа. Из http://php.net/manual/en/language.oop5.static.php:

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

Я бы инициализировал свойство null, сделал его приватным с помощью метода доступа, и в первый раз, когда он вызывал, аксессуар выполняет "реальную" инициализацию. Вот пример:

    class myclass {

        private static $blah2 = null;

        public static function blah2() {
            if (self::$blah2 == null) {
               self::$blah2 = array( new myotherclass(),
                 new myotherclass(),
                 new myotherclass());
            }
            return self::$blah2;
        }
    }

    print_r(myclass::blah2());

Ответ 2

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

class foo {
  public $bar = "fizzbuzz";
}

class myClass {
  static public $array = array();
  static public function init() {
    while ( count( self::$array ) < 3 )
      array_push( self::$array, new foo() );
  }
}

myClass::init();
print_r( myClass::$array );

Демо: http://codepad.org/InTPdUCT

В результате получается следующий результат:

Array
(
  [0] => foo Object
    (
      [bar] => fizzbuzz
    )
  [1] => foo Object
    (
      [bar] => fizzbuzz
    )
  [2] => foo Object
    (
      [bar] => fizzbuzz
    )
)

Ответ 3

В ответ на wiseguys это то, что вам нужно сделать:

class myclass 
{
    static $blah2;

    private function initBlah2()
    {
       $this->blah2 = array(&new myotherclass(), &new myotherclass(), &new myotherclass());
    }
}

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

Я думаю, что это то, что говорит wiseguy.