Как вы можете видеть здесь - const переменная не может быть изменена или удерживать logi c. Обратите внимание, что интерфейс также не может содержать logi c - поэтому вы не можете сделать это в своем интерфейсе.
Я думаю, что лучшим решением для вашей проблемы является использование абстрактного класса . Я буду таким же, как ваш интерфейс (вы можете увидеть обсуждение различных здесь , но я думаю, что это будет то же самое для ваших нужд).
Я бы порекомендовал создать абстрактный класс как это:
abstract class AbstractMapper{
// here add all the method from your interface as abstract
public abstract function getMapping(): array;
public abstract function map(array $segments): OrderUpdateInterface;
// the const here will behave the same as in the interface
const CARRIER_CODES_MAPPING = ['FED' => 'fedex'];
// set your default mapping - notice those are private to disable access from outside
private const MAPPING = ['LIN' => [
'LIN02' => 'NV',
'LIN01' => 'processSku'],
'PRF' => [
'PRF01' => 'processIncrementId']];
private $mapToProcess = [];
// when initiate this class modify your $mapping member according your logic
function __construct() {
$this->mapToProcess = self::MAPPING; // init as
if ($this->mapToProcess['LIN']['LIN02'] == 'NV')
$this->mapToProcess['LIN']['LIN03'] = 'processSku';
else if ($this->mapToProcess['LIN']['LIN04'] == 'NV')
$this->mapToProcess['LIN']['LIN05'] = 'processSku';
}
// use method to get your process and don't use directly the map
public function getProcess($segemntId, $elemntId) {
return $this->mapToProcess[$segemntId][$elemntId];
}
}
Теперь вы можете объявить объект, который унаследован как:
class Obj extends AbstractMapper {
// notice that as interface it need to implement all the abstract methods
public function getMapping() : array {
return [];
}
}
Пример использования:
$obj = New Obj();
print_r($obj->getProcess('LIN', 'LIN01'));
Обратите внимание, что кажется, что ваш logi c не меняется, поэтому я добавил новую переменную и установил ее во время построения. Если вы хотите, вы можете сбросить его и просто изменить возвращаемое значение функции getProcess
- поместите туда все логи c.
Другой вариант - сделать $mapToProcess
publi c и получить доступ это напрямую, но я думаю, что лучшее программирование - использовать метод getter.
Надеюсь, это поможет!