PHP – define static array of objects-ThrowExceptions

Exception or error:

can you initialize a static array of objects in a class in PHP? Like you can do

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

but when I do

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

where myotherclass is defined right above myclass.
That throws an error however; is there a way to achieve it?

How to solve:

Nope. From http://php.net/manual/en/language.oop5.static.php:

Like any other PHP static variable, static properties may only be
initialized using a literal or constant; expressions are not allowed.
So while you may initialize a static property to an integer or array
(for instance), you may not initialize it to another variable, to a
function return value, or to an object.

I would initialize the property to null, make it private with an accessor method, and have the accessor do the “real” initialization the first time it’s called. Here’s an example:

    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());

Answer´╝Ü

While you cannot initialize it to have these values, you can call a static method to push them into its own internal collection, as I’ve done below. This may be as close as you’ll get.

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 );

Demo: http://codepad.org/InTPdUCT

Which results in the following output:

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

Leave a Reply

Your email address will not be published. Required fields are marked *