Я использую механизм шаблонов, который вставляет код на моем сайте, где я хочу.
Я написал функцию для проверки чего-то, что довольно просто:
myfunction() { return '($this->data["a"]["b"] ? true : false)'; }
Проблема в том, что данные $ this-> являются частными, и я не могу получить к нему доступ всюду, поэтому мне нужно использовать getData (); что вызывает мою проблему.
$this->getData()['a']['b']
не работает, и присвоение значения сначала не происходит либо потому, что оно будет использоваться непосредственно в блоке if ().
Есть идеи?
С PHP 5.4 можно сделать именно это:
getSomeArray()[2]
Ссылка: https://secure.php.net/manual/en/language.types.array.php#example-62
На 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()
и сохраните его возвращаемое значение во временной varibale У вас нет большого выбора, на самом деле …
Хорошо … видимо, там действительно не лучший способ, поэтому я собираюсь ответить себе не так красивым решением:
Я создал функцию:
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 только ожидает переменные как параметр.