2009-09-22 16 views
82

Używam silnika szablonów, który wstawia kod w mojej witrynie, gdzie chcę.Tablica dostępu zwrócona przez funkcję w php

napisałem funkcję do testowania coś, co jest dość proste:

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

Problem polega na tym, $ this-> Dane te są prywatne i nie mogą uzyskać do niego dostęp wszędzie, więc muszę używać otrzymać dane(); co powoduje mój problem.

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

nie działa, a przypisanie wartości jako pierwszej nie powoduje, że zostanie użyte bezpośrednio w bloku if().

Wszelkie pomysły?

+0

Przypisanie wartości zwracanej zdecydowanie działa i jest to jedyny sposób. Czy możesz pokazać nam swój niedziałający kod? –

+0

Cóż, to nie działa, ponieważ kod zostanie wstawiony w if (/ * tutaj kod * /). Więc nie mogę po prostu przypisać danych wcześniej. – enyo

+1

Co u licha budujesz? :) coś z eval? –

Odpowiedz

123

Od PHP 5.4 to możliwe, aby dokładnie to zrobić:

getSomeArray()[2] 

referencyjny: https://secure.php.net/manual/en/language.types.array.php#example-62

W PHP 5.3 lub starszej, musisz użyć zmiennej tymczasowej.

+4

Mam 'PHP 5.4.11-1 ~ precise + 1' i ta funkcja nie działa! Otrzymałem wiadomość w odpowiedzi 'Błąd analizy składni: błąd składniowy, nieoczekiwany '[' – Eugene

+1

+ Eugene, czy to działa? Może inni doświadczają tego samego problemu. – enyo

+0

To jest niesamowite .. Po prostu uwielbiałem tę wskazówkę .. dzięki – floCoder

16

Nie można używać coś takiego:

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

czyli składnia tablica dostępu nie jest możliwe bezpośrednio na funkcji wywołanie.

youy trzeba użyć trochę tymczasową zmienną, tak:

$tmp = $this->getData(); 
$tmp['a']['b'] // use $tmp, now 

W twoim przypadku, prawdopodobnie oznacza to, używając coś takiego:

function myfunction() { 
    $tmp = $this->getData(); 
    return ($tmp['a']['b'] ? true : false); 
} 

należy:

  • Najpierw wywołaj metodę getData() i zapisz jej zwrócić wartość w tymczasowym varibale
  • następnie użyj że tymczasowa zmienna dla testu

Nie masz wielkiego wyboru o tym, rzeczywiście ...

+0

Cóż, jak już powiedziałem, moim problemem jest to, że ten kod zostanie wstawiony bezpośrednio, jeśli (/ * tutaj jest kod * /), więc zdefiniowanie funkcji nie jest naprawdę możliwe ... – enyo

+0

Nie można przypisać wyniku metody wywołanie zmiennej przed instrukcją if i użycie tej zmiennej w instrukcji if, zamiast bezpośredniego wywoływania metody z instrukcji if? –

+1

Niestety nie ... To jest szablonowy silnik i nie mam nad nim kontroli. – enyo

1

$this->data jest zawsze dostępne, jeśli jest chronione. $object->data nie jest dostępny zewsząd, więc jeśli wracasz do kodu $this i jest on oceniany jako taki, powinien być w porządku.

Btw, w Twoim kodzie występuje błąd: należy cytować cytaty.

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

Tak, przepraszam ... Poprawiłem swój post: $ this-> dane są oczywiście prywatne. Poprawiłem również moją literówkę podczas tworzenia błędu. – enyo

12

Ok ... widocznie tam naprawdę nie jest lepszy sposób, więc mam zamiar odebrać sobie z nie tak piękne roztworem:

stworzyłem funkcję:

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

i wykorzystał je tak:

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

to nie jest ładne, ale działa.

1

Jest to możliwe z wersji PHP 5.4.

Jeśli nie chcesz tymczasową zmienną dla tego i twoja wersja PHP jest mniej, niż 5,4, niż nadal można używać kilka 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)); 

Edytuj: !!! Zwróć uwagę, że w późniejszych wersjach (5.4+) PHP wyświetli powiadomienie, ponieważ end oczekuje tylko zmiennych jako parametru.

Powiązane problemy