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

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

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

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

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

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

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

Любые идеи?

Ответ 2

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

$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
  • тогда используйте эту временную переменную для своего теста

У вас нет большого выбора, фактически...

Ответ 3

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

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

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

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

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

Это не очень, но работает.

Ответ 4

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

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

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

Ответ 5

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

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

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

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