Задать вопрос
kazarin0v
@kazarin0v
Разработчик сайтов WordPress

Почему не нужно заранее объявлять массив?

Почему тут $result не объявлен заранее и функция не выдает ошибку?

Значит то что пишут $result = [] Это я удобства?

function tower_builder($n)
{
  for ($i=1; $i <= $n; $i++)
  {
    $result[] = str_repeat(' ', $n - $i) . str_repeat('*', $i * 2 - 1) . str_repeat(' ', $n - $i);
  }

  return $result;
}

echo '<pre class="print-1">' . print_r( tower_builder(9), 1 ) . '</pre>';
  • Вопрос задан
  • 127 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
REZ1DENT3
@REZ1DENT3
web-developer
php слишком многое прощает.

Если в вашу функцию передать $n <=0, то будет Notice/Warning (от версии php зависит).
https://onlinephp.io/c/7167c

Но если задать значение по умолчанию для $result, то ошибки уже не будет.

Советую присмотреться к статическим анализаторам кода:
https://psalm.dev/r/296a277b14
https://phpstan.org/r/13fea7ab-0cb4-492c-8241-7b26...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Почему не нужно заранее объявлять массив?


Как правильно заметили в комментарии выше, "это РНР, тут так можно".
Раньше вообще можно было инициализировать переменную как строку, и потом обращаться к ней, как к массиву.
Начиная с 7 версии начался отход от таких вольностей, но он всё ещё в процессе.

Значит то что пишут $result = [] Это я удобства?


Не для "удобства", а для того, чтобы волосы на голове сохранились подольше.
В данном случае нужды в явном присвоении нет.
Но любой код со временем изменяется. И функция tower_builder() может разрастись. Там появится ещё один цикл, который работает с массивом $result. Который получит какое-то значение до начала нашего цикла, и в итоге конечный результат будет неправильным. Поэтому $result = [] перед началом работы с массивом - это не каприз или удобство, а необходимость
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы