Używam silnika szablonów, który wstawia kod w mojej witrynie tam, gdzie chcę.
Napisałem funkcję do testowania pod kątem czegoś, co jest dość łatwe:
myfunction() { return '($this->data["a"]["b"] ? true : false)'; }
Problem polega na tym, że $ this-> dane są prywatne i nie mam do nich dostępu wszędzie, więc muszę użyć getData (); co powoduje mój problem.
$this->getData()['a']['b']
nie działa, a przypisanie wartości jako pierwszej również nie działa, ponieważ będzie ona używana bezpośrednio w bloku if ().
Jakieś pomysły?
myfunction()
dalej przetwarzana? W twoim pytaniu brakuje tej części.Odpowiedzi:
Od PHP 5.4 można to zrobić dokładnie:
getSomeArray()[2]
Źródła: https://secure.php.net/manual/en/language.types.array.php#example-62
W PHP 5.3 lub wcześniejszym musisz użyć zmiennej tymczasowej.
źródło
PHP 5.4.11-1~precise+1
i ta funkcja nie działa! Otrzymałem wiadomość w odpowiedziParse error: syntax error, unexpected '['
Nie możesz użyć czegoś takiego:
$this->getData()['a']['b']
tj. składnia dostępu do tablicy nie jest możliwa bezpośrednio w wywołaniu funkcji.
Musisz użyć tymczasowej zmiennej , takiej jak ta:
$tmp = $this->getData(); $tmp['a']['b'] // use $tmp, now
W twoim przypadku prawdopodobnie oznacza to użycie czegoś takiego:
function myfunction() { $tmp = $this->getData(); return ($tmp['a']['b'] ? true : false); }
Musisz :
getData()
metodę i zapisz jej wartość zwracaną w tymczasowej zmiennejWłaściwie nie masz wielkiego wyboru ...
źródło
Ok ... najwyraźniej nie ma lepszego sposobu, więc odpowiem sobie niezbyt pięknym rozwiązaniem:
Stworzyłem funkcję:
arrayGet($array, $index) { return $array[$index]; }
I użyłem tego w ten sposób:
myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }
To nie jest ładne, ale działa.
źródło
$this
->data
jest zawsze dostępny, jeśli jest chroniony. nie jest dostępne z każdego miejsca, więc jeśli zwracasz swój kod i jest on oceniany jako taki, powinno być w porządku.$object
->data
$this
Przy okazji, w twoim kodzie jest błąd: cudzysłowy muszą zostać zmienione.
myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }
źródło
Jest to możliwe od wersji PHP 5.4.
Jeśli nie chcesz do tego tymczasowej zmiennej , a twoja wersja PHP jest mniejsza niż 5.4 , nadal możesz użyć kilku wbudowanych funkcji, aby uzyskać pierwszy lub ostatni element:
$x = 'first?last'; $first = array_shift(explode('?', $x)); $last = end(explode('?', $x)); $last2 = array_pop(explode('?', $x));
Edycja: !!! Proszę zauważyć, że w późniejszych wersjach (5.4+) PHP wyśle powiadomienie, ponieważ end oczekuje jedynie zmiennych jako parametrów.
źródło