2010-09-04 13 views
9

Niektóre przeszukiwanie za pośrednictwem Google (i moje własne doświadczenia) pokazuje, że w PHP nie można pobrać elementu tablicy, gdy został on zwrócony z wywołania funkcji w tej samej linii. Na przykład, nie można zrobić:Uzyskiwanie dostępu do elementu tablicy po powrocie z funkcji

echo getArray()[0]; 

Jednak Natknąłem schludny mały trick:

echo ${!${false}=getArray()}[0]; 

to rzeczywiście działa. Problem polega na tym, że nie wiem, , dlaczego działa. Jeśli ktoś mógłby wyjaśnić, to byłoby wspaniale.

Dzięki.

+1

To na pewno nie robi ** ** uczynić kod bardziej czytelny;) –

Odpowiedz

10
echo ${!${false}=getArray()}[0]; 

Jak to działa, krok po kroku

${false}=getArray() 

przypisuje wynik getArray do zmienna z pustą nazwą ("lub null zadziała zamiast fałszywego)"

!${false}=getArray() 

neguje powyższą wartość, obracając go Boolean false

${!${false}=getArray()} 

zamienia poprzednią wartość (false) do (pusty) ciąg i wykorzystuje ten ciąg jako nazwę zmiennej. Oznacza to, że jest to zmienna z kroku 1, równa wynikowi getArray.

${!${false}=getArray()}[0]; 

pobiera indeks tej "pustej" zmiennej i zwraca element tablicy.

Jeszcze kilka odmian tej samej idei

echo ${1|${1}=getArray()}[1]; 
echo ${''.$Array=getArray()}[1]; 

function p(&$a, $b) { $a = $b; return '_'; } 
echo ${p($_, getArray())}[1]; 

dlaczego getArray()[0] nie działa, to dlatego, że zespół php nie ma pojęcia, jak zmusić go do pracy.

+0

Perfect, dzięki. – Daniel

+0

świetne przykłady, bardzo pouczające +1 – RobertPitt

3

działa, ponieważ za pomocą nawiasów klamrowych, aby zmienić wartość na varialbe, jest to przykład.

Dlaczego jest to potrzebne, to jest potrzebne obudować chcesz zamienić ciąg lub zwracanej wartości do zmiennej, przykład

${$_GET['var']} = true; 

To zła praktyka i nie powinny być używane IMO.

należy użyć obiektów, jeśli chcesz bezpośrednio uciekł funkcji, przykład

function test() 
{ 
    $object = new stdClass(); 
    $object->name = 'Robert'; 

    return $object; 
} 
echo test()->name; 
2

Należy zauważyć, że można można zrobić tak jak w PHP 5.4. Z podręcznika dotyczącego dereferencji macierzowej:

Od PHP 5.4 możliwe jest bezpośrednie wyodrębnienie wyniku wywołania funkcji lub metody. Przedtem było to możliwe tylko przy użyciu zmiennej tymczasowej.

Przykład:

function theArray() { 
    return range(1, 10); 
} 

echo theArray()[0]; 
// PHP 5.4+: 1 
// PHP -5.4: null 

Pre PHP 5.4: Próba uzyskania dostępu do klucza tablicy, która nie została zdefiniowana jest taka sama jak dostęp do dowolnej innej zmiennej niezdefiniowanej: komunikat o błędzie E_NOTICE poziomu będzie wydane, a wynik będzie NULL.

Manual:

Powiązane problemy