Недопустимый тип смещения в моей функции класса php

#php

#php

Вопрос:

Я получаю ошибку недопустимого смещения в одной из моих функций.

Вот этот код

 public function translate($str, $namespace = '') {
        $namespace = $this->getNamespace($namespace);

        $this->load($namespace);

        $lang = $this->getLang();
        $data = $this->data[$namespace];

        $key = md5($str);

        if (isset($data[$lang][$key])) {
            return $data[$lang][$key];
        }

        $default = $this->getDefaultLang();

        if ($lang == $default) {
            if ($this->getSaveOnMissing()) {
                $save = array(
                    'namespace' => $namespace,
                    'lang' => $lang,
                    'trans_key' => $key,
                    'trans_val' => $str
                );

                $sql = $GLOBALS['db']->strInsert('translate', $save);
                if ($GLOBALS['db']->SQL_query($sql)) {
                    $this->data[$namespace][$lang][$key] = $str;
                }
            }

            return $str;
        } elseif (isset($data[$default][$key])) {
            
            return $data[$default][$key];
        }

        return $str;
    }
 

В этой строке я получаю эту ошибку

 elseif (isset($data[$default][$key]))
 

Комментарии:

1. Пожалуйста, покажите точное сообщение об ошибке и как вы вызываете свою функцию.

2. Что var_dump($data[$default]) показывает?

3. Массивы и объекты нельзя использовать в качестве ключей. Это приведет к появлению предупреждения: недопустимый тип смещения ( php.net массивы )

4. @freeek PHP Предупреждение: недопустимый тип смещения в ………. в строке 90 это все

5. Что такое $lang и $default ? Может быть, это какой-то тип объекта?

Ответ №1:

Итак, существует 3 уровня вашего значения

  1. $data
  2. $default
  3. $ key

Сначала вы можете проверить на трех уровнях, все ли они что-то возвращают

 elseif(isset($data, $data[$default], $data[$default][$key])
 

Комментарии:

1. В этом нет реальной необходимости. Сингл isset с самым глубоким уровнем завершится ошибкой, независимо от того, какой уровень не установлен. См. Скрипку .