Доступ к массиву, возвращаемому функцией в php

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

Я написал функцию для проверки чего-то, что довольно легко:

myfunction() { return '($this->data["a"]["b"] ? true : false)'; }

Проблема в том, что $this->data является частной, и я не могу получить к ней доступ везде, поэтому мне нужно использовать getData(); что вызывает мою проблему.

$this->getData()['a']['b']

не работает, и присвоение значения первым тоже не работает, потому что оно будет использоваться непосредственно в блоке if().

Есть идеи?

5 ответов

Решение

Начиная с PHP 5.4 возможно сделать именно это:

getSomeArray()[2]

Ссылка: https://secure.php.net/manual/en/language.types.array.php

В PHP 5.3 или более ранней версии вам нужно будет использовать временную переменную.

Вы не можете использовать что-то вроде этого:

$this->getData()['a']['b']

то есть синтаксис доступа к массиву невозможен непосредственно при вызове функции.

Вы должны использовать некоторую временную переменную, например:

$tmp = $this->getData();
$tmp['a']['b']    // use $tmp, now

В вашем случае это, вероятно, означает использовать что-то вроде этого:

function myfunction() {
  $tmp = $this->getData();
  return ($tmp['a']['b'] ? true : false);
}

Ты должен:

  • во-первых, позвоните getData() метод и сохранить его возвращаемое значение во временной переменной
  • затем используйте эту временную переменную для вашего теста

У тебя нет особого выбора, на самом деле...

Хорошо... видимо, действительно нет лучшего способа, поэтому я собираюсь ответить себе не очень красивым решением:

Я создал функцию:

arrayGet($array, $index) { return $array[$index]; }

И использовал это так:

myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }

Это не красиво, но работает.

Это возможно с PHP версии 5.4.

Если вам не нужна временная переменная для этого и ваша версия PHP меньше, чем 5.4, вы все равно можете использовать несколько встроенных функций для получения первого или последнего элемента:

$x     = 'first?last';
$first = array_shift(explode('?', $x));
$last  = end(explode('?', $x));
$last2 = array_pop(explode('?', $x));

Редактировать:!!! Обратите внимание, что в более поздних версиях ( 5.4+) PHP будет выдавать уведомление, поскольку end ожидает только переменные в качестве параметра.

$this->data всегда доступен, если он защищен. $object->data не доступен отовсюду, так что если вы возвращаетесь $this в вашем коде, и он оценивается как таковой, все должно быть в порядке.

Кстати, в вашем коде есть ошибка: кавычки нужно экранировать.

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }
Другие вопросы по тегам