88 Stimmen

Zugriff auf das Array, das von einer Funktion in PHP zurückgegeben wird

Ich verwende einen Template-Engine, die Code in meine Website einfügt, wo ich es haben möchte.

Ich habe eine Funktion geschrieben, um etwas zu testen, was ziemlich einfach ist:

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

Das Problem ist, $this->data ist privat, und ich kann nicht überall darauf zugreifen, also muss ich getData(); verwenden, was mein Problem verursacht.

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

funktioniert nicht, und das Zuweisen des Werts zuerst funktioniert auch nicht, weil er direkt in einem if() block verwendet wird.

Irgendwelche Ideen?

137voto

enyo Punkte 15538

Seit PHP 5.4 ist es möglich, genau das zu tun:

getSomeArray()[2]

Referenz: https://secure.php.net/manual/de/language.types.array.php#example-62

In PHP 5.3 oder früher müssen Sie eine temporäre Variable verwenden.

19voto

Pascal MARTIN Punkte 384469

Sie können nichts wie folgt verwenden:

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

d. h., der Array-Zugriffssyntax ist direkt auf einen Funktionsaufruf nicht möglich.

Sie müssen eine temporäre Variable verwenden, wie hier gezeigt:

$tmp = $this->getData();
$tmp['a']['b']    // jetzt $tmp verwenden

In Ihrem Fall bedeutet dies wahrscheinlich, etwas wie folgt zu verwenden:

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

Sie müssen:

  • zuerst Ihre getData()-Methode aufrufen und den Rückgabewert in einer temporären Variablen speichern
  • dann diese temporäre Variable für Ihren Test verwenden

Sie haben eigentlich nicht viel Auswahlmöglichkeiten...

12voto

enyo Punkte 15538

Ok... anscheinend gibt es wirklich keinen besseren Weg, also werde ich mir selbst mit einer nicht so schönen Lösung antworten:

Ich habe die Funktion erstellt:

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

Und habe sie so verwendet:

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

Das ist nicht schön, aber es funktioniert.

1voto

soulmerge Punkte 70900

$this->data ist immer zugänglich, wenn es geschützt ist. $object->data ist nicht überall zugänglich, also wenn du $this in deinem Code zurückgibst und es als solches ausgewertet wird, sollte es in Ordnung sein.

Übrigens, es gibt einen Bug in deinem Code: Die Anführungszeichen müssen escaped werden.

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

1voto

Lajos Mészáros Punkte 3501

Es ist ab PHP-Version 5.4 möglich.

Wenn du keine temporäre Variable dafür verwenden möchtest und deine PHP-Version kleiner ist als 5.4, dann kannst du trotzdem ein paar eingebaute Funktionen verwenden, um das erste oder das letzte Element zu erhalten:

$x     = 'erstes?letztes';
$erstes = array_shift(explode('?', $x));
$letztes  = end(explode('?', $x));
$letztes2 = array_pop(explode('?', $x));

Bearbeiten: !!! Bitte beachte, dass in späteren Versionen (5.4+) PHP einen Hinweis ausgibt, da end nur Variablen als Parameter erwartet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X