Почему не удается получить доступ к смещению типа string в строке?

Добрый день! Уже не первый день ломаю голову и не могу решить ошибку. Код переписывается под php 8.2
Ошибка:
[2023-04-29 00:53:02] EngineGP.ERROR: TypeError: Cannot access offset of type string on string in file /var/enginegp/system/library/cron/threads.php on line 30
Stack trace:
  1. TypeError->() /var/enginegp/system/library/cron/threads.php:30
  2. threads->__construct() /var/enginegp/system/library/cron.php:79
  3. include() /var/enginegp/cron.php:47
 [] []

Файл в котором возникает ошибка:
https://github.com/EngineGPDev/EngineGP/blob/main/...
Благодарю за помощь! Испробовал уже многие варианты решения данной проблемы.
  • Вопрос задан
  • 3586 просмотров
Решения вопроса 2
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Потому что у строки не может быть строкового смещения.

В ответе выше написана чушь.
Обращаться к строке по индексу можно. И в РНР7, и в РНР 8. Без всяких предупреждений.
К отдельным байтам (но не символам) в строке можно обращаться, указывая смещение в квадратных скобках:
echo 'hello'[0];
Но в сообщении об ошибке говорится конкретно про строковые ключи. А это уже действительно бессмыслица, никаких строковых смещений в строке быть не может. Что и написано черным по белому в ошибке.

И проблема действительно находится выше, в совершенно дурацком присвоении пустой строки массиву.
Если мы хотим использовать массив, то и присваивать начальное значение надо в виде пустого массива, а не строки.

При этом отдельно проверять наличие $aUnit[$server['unit']] и $aUnit[$server['unit']][$server['game']] не нужно. Достаточно проверить на существование сразу конечный элемент.
В 8.2 это можно красиво написать одной строчкой
$aUnit[$server['unit']][$server['game']] ??= '';
Но если почитать код дальше, то станет видно, что и здесь нам строка тоже не нужна. А снова нужен массив.
Потому что в коде ниже эта строка разбивается через explode(???).
То есть, надо написать
$aUnit[$server['unit']][$server['game']] ??= [];
$aUnit[$server['unit']][$server['game']][] = $server['id'];
А ниже выкинуть всё от explode() до unset()
spoiler
Вообще, складывается ощущение, что исходный код писал либо ребенок, либо шизофреник - две разные личности, которые не видят код друг друга. Вот как с этим массивом например.
Или вот этот кусок кода еще мне очень понравился
$sql->query('SELECT `id` FROM `servers` LIMIT 1');
if(!$sql->num())
    return NULL;
$sql->query('SELECT `id`, `unit`, `game` FROM `servers` ORDER BY `unit` DESC');
$all = $sql->num();

Напоминает анекдот про ирландца, который перед тем как поспорить, выпьет ли он 10 кружек пива, сначала сбегал в соседний паб. Проверить, выпьет ли он 10 кружек пива.
Ответ написан
Комментировать
neuotq
@neuotq
Прокрастинация
Сама ошибка вполне однозначная, вы обращаетесь к строке по индексу.
У вас в коде в строке 30:
$aUnit[$server['unit']][$server['game']]
Но выше мы видим что
$aUnit[$unit['id']] = '';
Ну так делать нельзя. В PHP 7* на этот счёт были предупреждения, видимо вы их игнорировали.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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