Назад | Перейти на главную страницу

Создание марионеточной переменной на основе условий

Итак, я приспосабливаюсь к неизменным переменным в марионетке, теперь ищу совета или уточнения, на правильном ли я уже пути.

У меня есть каталог, который я хотел бы синхронизировать, но, возможно, несколько его подкаталогов. Итак, я хотел бы создать массив из одного или нескольких путей для перехода к рекурсивному файл ресурс. В идеале у меня было бы что-то вроде этого

$paths = ['fist/path'] # assume this is provided via class parameter
# this should work, since it's only overriding what was provided from higher scope
if($condition) {
  $paths += 'second/path'
}
# this won't fly, since $paths has already been set once locally
if($another_condition) {
  $paths += 'third/path'
}

но я не могу этого сделать, потому что переменные неизменяемы. То, что я придумал как «лучший» подход, выглядит примерно так:

$paths = ['fist/path']
if($condition) {
  $condition_1_path = ['second/path']
} else {
  $condition_1_path = []
}
if($another_condition) {
  $condition_2_path = ['third/path']
} else {
  $condition_2_path = []
}

$paths = concat($paths, $condition_1_path, $condition_2_path)

Я не уверен, если concat исключит запись из результата, если он предоставил пустой массив для одного из своих аргументов, но ожидает проверки этого, как только я выяснить, как загрузить stdlib.

В любом случае, глядя на этот код, я считаю, что он просто ужасен. Есть ли более чистый способ сделать что-то подобное?

Это некрасиво, но я сделал это вот так.

if($condition) {
  $condition_1_path = 'first/path'
} else {
  $condition_1_path = ''
}
if($another_condition) {
  $condition_2_path = 'second/path'
} else {
  $condition_2_path = ''
}

# split into array based on whitespace
$mylistofpaths = split("$condition_1_path $condition_2_path", '\s+')