Можно ли использовать 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
Я просто подумал, что это может помочь.
Я предлагаю довольно простой объектно-ориентированный стиль.
Это идет без черт, но с методами-аксессорами вместо атрибутов-аксессоров:
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());
Обратите внимание, что нет никакого риска изменения внутренних массивов извне с помощью методов доступа, и что есть практически нет влияния на производительность использования методов с памяткой.
Других решений пока нет …