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

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

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

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

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

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

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

Есть идеи?

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

С 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 только ожидает переменные как параметр.