28

你能在 PHP 的一个类中初始化一个静态对象数组吗?就像你可以做的那样

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

但是当我这样做时

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

其中 myotherclass 定义在 myclass 的正上方。然而,这会引发错误;有没有办法实现它?

4

2 回答 2

29

没有。来自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());
于 2012-05-27T04:01:52.667 回答
3

虽然您无法将其初始化为具有这些值,但您可以调用静态方法将它们推送到其自己的内部集合中,如下所示。这可能与您将得到的一样接近。

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

这导致以下输出:

大批
(
  [0] => foo 对象
    (
      [酒吧] => 嘶嘶声
    )
  [1] => foo 对象
    (
      [酒吧] => 嘶嘶声
    )
  [2] => foo 对象
    (
      [酒吧] => 嘶嘶声
    )
)
于 2012-05-27T04:09:48.543 回答