Доступ к массиву, возвращаемому функцией в 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)'; }