рефлексия константы в параметрах php
обнаружил потонциальный баг
метод ReflectionParameter::getDefaultValue возвращает только значение
но может быть такое что конструктору класса в параметрах будит передана константа, своего или чужого класса и в значении мы получим значение константы
Код:
class Test {
const MY_VAR = 100500;
public function __construct($param = self::MY_VAR) {
}
}
const MY_VAR = 100500;
public function __construct($param = self::MY_VAR) {
}
}
вызов ReflectionParameter::getDefaultValue для параметра $param вернет 100500
получается если мы на основе таких данных сформируем фабричный метод, а потом изменим значение константы то значения устанавливаемые по умолчанию будут отличатся
единственный метод решения проблемы который я вижу это разбирать параметры через регулярку
>значения устанавливаемые по умолчанию будут отличатся
Ну и в чем проблема-то? Сформируй фабричный метод еще раз.
P.S. А с патернами лучше этого того... завязывать. А то можно заработать паттерн головного мозга.
Цитата: alekciy
Ну и в чем проблема-то? Сформируй фабричный метод еще раз.
дело в том что необходимость пересоздать фабричный метод не очевидна
если речь идет о константе в классе, то это решение, но это может быть внешняя константа. пример:
Код:
class Plugin_Test {
public function __construct($key = Model_Users::PRIMARY) {
$this->user_primary_key = $key;
}
}
public function __construct($key = Model_Users::PRIMARY) {
$this->user_primary_key = $key;
}
}
предположим у нас есть плагин связанный с моделью Users и для работы ему необходимо название поля по которому он потом будет делать выборку(это как пример) и по умолчанию он берет название первичного ключа объявленный в константе модели
на лицо зависимость плагина от модели
и если мы изменим имя первичного ключа в модели то плагин никак не изменится и будит работать по прежнему, а вот экземпляр плагина созданный фабричным методом будит сломан
и обнаружение подобной ошибки потребует не мало времени
с какой-то стороны это проблема разработчика плагина, что он написал такую зависимость
но это не значит что мы должны игнорировать эту проблему