Масив доступу, повернутий функцією у php


88

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

Я написав функцію тестування на щось, що є досить простим:

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

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

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

не працює, і присвоєння значення спочатку теж не робить, оскільки воно буде використовуватися безпосередньо в блоці if ().

Будь-які ідеї?


Призначення поверненого значення, безумовно, працює, і це єдиний спосіб. Чи можете ви показати нам свій неробочий код?
Anti Veeranna

Ну, це не працює, тому що код буде вставлений у if (/ * код тут * /). Тому я не можу просто призначити дані раніше.
enyo

1
Що ви взагалі будуєте? :) щось з eval?
Anti Veeranna

Що ви намагаєтесь перевірити? Чи намагаєтесь ви побачити, чи існує елемент масиву та має не порожнє значення? Для цього ви можете використовувати функцію "порожній". Це питання потребує більшої ясності!
txwikinger

Як (було) те значення рядка, яке ви повертаєте, myfunction()обробляється далі? Ця частина відсутня у вашому запитанні.
hakre

Відповіді:


134

З PHP 5.4 можна зробити саме це:

getSomeArray()[2]

Посилання: https://secure.php.net/manual/en/language.types.array.php#example-62

На PHP 5.3 або раніше, вам потрібно буде використовувати тимчасову змінну.


4
У мене є, PHP 5.4.11-1~precise+1і ця функція не працює! Отримано повідомлення у відповідьParse error: syntax error, unexpected '['
Євген

1
+ Євгеній, ти змусив це працювати? Можливо, інші люди стикаються з такою ж проблемою.
enyo

2
Потрібно було до php 5.4 підтримувати нотацію масиву, повернуту з функцій ?! Яка неприємна помилка.
Василь Муса

А потім ви намагаєтесь отримати перший елемент масиву, сформований array_filter, і починаєте плакати
Лупакс,

17

Ви не можете використовувати щось подібне:

$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()методу та збережіть його повернене значення у тимчасовій варіабельній версії
  • тоді використовуйте цю тимчасову змінну для тесту

Насправді у вас немає великого вибору ...


Ну, як я вже сказав, моя проблема полягає в тому, що цей код вставляється безпосередньо в if (/ * код йде сюди * /), тому визначення функції насправді неможливе ...
enyo

Чи не можете ви призначити результат виклику методу змінній перед оператором if і використовувати цю змінну в операторі if, замість того, щоб безпосередньо намагатися викликати метод із оператора if?
Паскаль МАРТІН

1
На жаль, ні ... Це механізм створення шаблонів, і я не маю над ним контролю.
enyo

12

Гаразд ... мабуть, насправді немає кращого способу, тому я збираюся відповісти собі не дуже гарним рішенням:

Я створив функцію:

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

І використовував це так:

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

Це не красиво, але працює.


1

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

До речі, у вашому коді є помилка: котирування потрібно уникати.

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

Так, вибачте ... Я виправив свою публікацію: $ this-> дані приватні, звичайно. Також виправив мою помилку при створенні помилки.
enyo

1

Це можливо з 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 очікує лише змінні як параметр.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.