#php
#php
Вопрос:
Итак, у меня есть следующий оператор switch внутри метода внутри моего класса:
public function getSASURL(string $blobName, string $size = '') : string
{
if ($this->containerName === 'userpictures-resized') {
switch ($size) {
case 'small':
return '_SThumb';
break;
case 'medium':
return '_MThumb';
break;
case 'large':
return '_LThumb';
break;
case 'original':
return '_Original';
break;
case 'big':
return '_Big';
break;
}
return $this->generateSASURL($blobName . $size . '.jpg');
}
return $this->generateSASURL($blobName);
}
Вот что он делает:
Когда я вызываю:
$sasURL = $azure->getSASURL('AHahn_com');
Я возвращаю следующую вещь — это работает так, как ожидалось.
https://storageaccount.blob.core.windows.net/userpictures-resized/AHahn_com.jpg?sv=2017-11-09amp;sr=bamp;st=2020-10-08T13:04:47Z
Теперь, когда я вызываю:
$sasURL = $azure->getSASURL('AHahn_com', 'small');
Я получаю следующее обратно:
'_SThumb'
Вместо этого это результат, который я хочу получить обратно ( _SThumb
после имени файла, перед расширением):
https://storageaccount.blob.core.windows.net/userpictures-resized/AHahn_com_SThumb.jpg?sv=2017-11-09amp;sr=bamp;st=2020-10-08T13:04:47Z
Кто-нибудь знает, что я могу делать неправильно?
Комментарии:
1. Мы не можем помочь вам, не зная, как
$this->containerName
определяется / используется.2. Вы
return
из функции в своем операторе switch, тогда как вы должны изменить$blobName
.3. Вы
return
в своемswitch
заявлении, так что в этом нет ничего неожиданного. Вместо этого вы должны изменить свою$size
переменную, например$size = '_SThumb';
, вместоreturn '_SThumb';
4. Каждый
case
простоreturn
представляет собой короткую строку. Это не проходит через$this->generateSASURL(...)
…5. Спасибо за помощь @Qirel, это сработало!
Ответ №1:
Ваша проблема в том, что вы return
из switch
инструкции, а не используете значение для каждого случая. Вы можете либо перезаписать $size
внутри каждого случая, например $size = '_SThumb';
, вместо return '_SThumb';
, либо создать другую переменную, которую вы заменяете $size
своим generateSASURL()
методом.
Однако другим подходом может быть создание карты размеров и их соответствующего значения. Затем просто получите доступ к массиву с $size
помощью ключа. Чтобы сделать это без учета регистра, вы можете сделать $map[strtolower($size)]
. Значение по умолчанию (когда совпадение не найдено) — это значение после оператора объединения с нулем ??
, которое может быть любым — вот оно $size
, но это может быть пустая строка, если это более применимо.
public function getSASURL(string $blobName, string $size = '') : string
{
if ($this->containerName === 'userpictures-resized') {
$map = [
'size' => '_SThumb',
'medium' => '_SThumb',
'large' => '_MThumb',
'original' => '_Original',
'big' => '_Big',
];
return $this->generateSASURL($blobName . ($map[$size] ?? $size) . '.jpg');
}
return $this->generateSASURL($blobName);
}