Значения по умолчанию для статических переменных

Можно ли использовать Traits для предоставления значений по умолчанию для статических переменных? Рассмотрим следующий пример.

  trait Properties {
public static $properties = [];
}

class Base {
use Properties;
}
Base::$properties[0] = 'val1';
Base::$properties[1] = 'val2';
Base::$properties[2] = 'val3';

class Derived extends Base {
use Properties;
}
Derived::$properties[1] = 'changed value';
Derived::$properties[3] = 'new value';

var_dump(Base::$properties);
var_dump(Derived::$properties);

Я бы хотел, чтобы на выходе было что-то вроде

  array (size=3)
0 => string 'val1' (length=4)
1 => string 'val2' (length=4)
2 => string 'val3' (length=4)
array (size=4)
0 => string 'val1' (length=4)
1 => string 'changed value' (length=13)
2 => string 'val3' (length=4)
3 => string 'new value' (length=9)

Пример не работает, т.к. Base and Properties define the same property ($properties) in the composition of Derived, Если я удалю use Properties от Derived, $properties переменная одинакова для обоих Base а также Derivedи любые изменения относятся к обоим классам. Я надеялся обойти это, в том числе Properties в обоих классах. Есть ли хорошие способы добиться того, чего я хочу? Я не должен использовать TraitsЯ просто подумал, что это может помочь.

2

Решение

Я предлагаю довольно простой объектно-ориентированный стиль.
Это идет без черт, но с методами-аксессорами вместо атрибутов-аксессоров:

class Base {
private static $properties;

public static function getProperties() {
if (!isset(self::$properties)) {
self::$properties = ['val1', 'val2', 'val3']; // use `array('val1', 'val2', 'val3')` with PHP<5.4
}
return self::$properties;
}
}

class Derived extends Base {
private static $properties; // has nothing to do with parent::$properties!

public static function getProperties() {
if (!isset(self::$properties)) {
self::$properties = parent::getProperties();
self::$properties[1] = 'changed value';
self::$properties[] = 'new value';
}
return self::$properties;
}
}

var_dump(Base::getProperties());
var_dump(Derived::getProperties());

Обратите внимание, что нет никакого риска изменения внутренних массивов извне с помощью методов доступа, и что есть практически нет влияния на производительность использования методов с памяткой.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]