Я использую шаблонизатор, который вставляет код на мой сайт там, где я хочу.
Я написал функцию для проверки чего-то довольно простого:
myfunction() { return '($this->data["a"]["b"] ? true : false)'; }
Проблема в том, что $ this-> данные являются частными, и я не могу получить к ним доступ везде, поэтому мне приходится использовать getData (); что вызывает мою проблему.
$this->getData()['a']['b']
не работает, и присвоение значения первым тоже не работает, потому что оно будет использоваться непосредственно в блоке if ().
Любые идеи?
myfunction()
обрабатывается дальше? Эта часть отсутствует в вашем вопросе.Ответы:
Начиная с PHP 5.4 это возможно:
getSomeArray()[2]
Ссылка: https://secure.php.net/manual/en/language.types.array.php#example-62
В PHP 5.3 или более ранних вам потребуется временная переменная.
источник
PHP 5.4.11-1~precise+1
но эта функция не работает! Получил сообщение в ответParse error: syntax error, unexpected '['
Нельзя использовать что-то вроде этого:
$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)' }
Это некрасиво, но работает.
источник
$this
->data
это всегда доступен, если он защищен. недоступен отовсюду, поэтому, если вы возвращаете свой код, и он оценивается как таковой, все должно быть в порядке.$object
->data
$this
Кстати, в вашем коде есть ошибка: кавычки нужно экранировать.
myfunction() { return '($this->data[\'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 ожидает только переменные в качестве параметра.
источник