PHP-Syntax zum Dereferenzieren des Funktionsergebnisses

Lesezeit: 8 Minuten

1646955249 991 PHP Syntax zum Dereferenzieren des Funktionsergebnisses
dreftymac

Hintergrund

In jeder anderen Programmiersprache, die ich regelmäßig verwende, ist es einfach, mit dem Rückgabewert einer Funktion zu arbeiten, ohne eine neue Variable zu deklarieren, die das Funktionsergebnis enthält.

In PHP scheint dies jedoch nicht so einfach zu sein:

example1 (Funktionsergebnis ist ein Array)

<?php 
function foobar(){
    return preg_split('/\s+/', 'zero one two three four five');
}

// can php say "zero"?

/// print( foobar()[0] ); /// <-- nope
/// print( &foobar()[0] );     /// <-- nope
/// print( &foobar()->[0] );     /// <-- nope
/// print( "${foobar()}[0]" );    /// <-- nope
?>

example2 (Funktionsergebnis ist ein Objekt)

<?php    
function zoobar(){
  // NOTE: casting (object) Array() has other problems in PHP
  // see e.g., http://stackoverflow.com/questions/1869812
  $vout   = (object) Array('0'=>'zero','fname'=>'homer','lname'=>'simpson',);
  return $vout;
}

//  can php say "zero"?       
//  print zoobar()->0;         //  <- nope (parse error)      
//  print zoobar()->{0};       //  <- nope                    
//  print zoobar()->{'0'};     //  <- nope                    
//  $vtemp = zoobar();         //  does using a variable help?
//  print $vtemp->{0};         //  <- nope     

  • Für Leser, die nicht zu den späteren Antworten scrollen, wurde PHP 5.4 (in Beta zum Zeitpunkt dieses Kommentars) eine Array-Dereferenzierung hinzugefügt …

    – Michael Berkowski

    13. Dezember 2011 um 21:59 Uhr

  • HINWEIS: Diese Frage wurde fälschlicherweise als Duplikat der Array-Dereferenzierung markiert. Diese Frage ist kein Duplikat, weil es nicht ausschließlich um Arrays geht. Eine PHP-Funktion kann jeden Werttyp zurückgeben, nicht nur Arrays (siehe Beispiel2 im Originalbeitrag, wo das Funktionsergebnis ein Objekt und kein Array ist).

    – dreftymac

    14. April 2015 um 15:33 Uhr


  • Für diejenigen, die sich nicht die Mühe machen können, alle Antworten durchzulesen, ist die “schönste” Lösung call_user_func(function($a, $b){return $a[$b];}, $arr, $offset). Der Preis für den zweiten Platz geht an current(array_slice($arr, $offset, 1)).

    – Schrittmacher

    20. Juli 2015 um 19:48 Uhr


  • @Pacerier nach welcher Metrik erklärst du einen für “schöner” als den anderen? Ist einer effizienter? Ehrlich gesagt ist die zweite Wahl schneller und einfacher zu schreiben.

    – Kyle Farris

    21. Juli 2015 um 20:31 Uhr

PHP kann nicht auf Array-Ergebnisse einer Funktion zugreifen. Einige Leute nennen dies ein Problem, andere akzeptieren dies einfach als das Design der Sprache. PHP lässt Sie also unwesentliche Variablen erstellen, nur um die benötigten Daten zu extrahieren.

Sie müssen also tun.

$var = foobar();
print($var[0]);

  • Mir ist klar, dass mir das noch unglaublich neu ist, aber warum ist das ein Problem? Es … macht für mich Sinn, dass Sie eine Variable erstellen müssen, um einen Wert / ein Ergebnis zu speichern. obwohl zugegeben: sehr neu

    – David Thomas

    13. April 2009 um 1:16 Uhr

  • Manche Leute nennen das ein Problem, aber die Sprache ist einfach so konzipiert. Andere Sprachen sind so konzipiert, dass dies möglich ist, und Menschen, die aus diesen Sprachen kommen, haben das Gefühl, dass dies ein Problem ist.

    – Ólafur Waage

    13. April 2009 um 1:17 Uhr

  • Es ist ein Problem, weil es sehr leicht wird, den Überblick zu verlieren, wo Sie sich befinden, wenn Sie eine Funktion haben, die eine strukturierte Variable oder ein strukturiertes Objekt zurückgibt. Was ist zum Beispiel, wenn Sie $data[‘tvshow’][‘episodes’][1][‘description’] als gültige Adresse in Ihrer Variablen?

    – dreftymac

    13. April 2009 um 1:26 Uhr

  • Wirklich, die Sprache scheint konsistent zu sein, um eine fließende Verwendung von Ergebnissen zu ermöglichen, also warum nicht mit Arrays? Scheint, als hätten sie sich geeinigt.

    Benutzer1086498

    3. Dezember 2012 um 17:33 Uhr

  • @ÓlafurWaage, nein, PHP ist es nicht gestaltet Hier entlang. Dies ist ein Versehen und nicht “nur, wie die Sprache gestaltet ist”. Gerade weil dies ein Thema ist, ist es das Fest in PHP 5.4.

    – Schrittmacher

    20. Juli 2015 um 18:14 Uhr

1646955249 451 PHP Syntax zum Dereferenzieren des Funktionsergebnisses
smassey

Dies ist speziell die Dereferenzierung von Arrays, die derzeit in php5.3 nicht unterstützt wird, aber in der nächsten Version, 5.4, möglich sein sollte. Objekt-Dereferenzierung ist hingegen in aktuellen PHP-Releases möglich. Auf diese Funktion freue ich mich auch!

  • HINWEIS: Diese Frage wurde fälschlicherweise als Duplikat der Array-Dereferenzierung markiert. Diese Frage ist kein Duplikat, da es nicht ausschließlich um Arrays geht. Eine PHP-Funktion kann jeden Werttyp zurückgeben, nicht nur Arrays (siehe Beispiel2 im Originalbeitrag, wo das Funktionsergebnis ein Objekt und kein Array ist).

    – dreftymac

    13. Mai 2015 um 16:40 Uhr

  • @dreftymac In PHP 7 wurde dies endlich aufgeräumt und Sie können jetzt einen Funktionsaufruf in jedem Ausdruck verwenden.

    – Andreas

    27. Januar 2016 um 20:34 Uhr

1646955250 763 PHP Syntax zum Dereferenzieren des Funktionsergebnisses
Gordon

Array-Dereferenzierung ist ab PHP 5.4 möglich:

Beispiel (Quelle):

function foo() {
    return array(1, 2, 3);
}
echo foo()[2]; // prints 3

mit PHP5.3 du würdest bekommen

Error: Syntax Error, unerwartet '[', expecting ',' or ';' 

Original Answer:

This has been been asked already before. The answer is no. It is not possible.

To quote Andi Gutmans on this topic:

This is a well known feature request
but won’t be supported in PHP 5.0. I
can’t tell you if it’ll ever be
supported. It requires some research
and a lot of thought.

You can also find this request a number of times in the PHP Bugtracker. For technical details, I suggest you check the official RFC and/or ask on PHP Internals.

  • Wow, nice work finding all those other versions of this question. I did look first, which, per the stackoverflow creators, means it’s worth having another version of the question, to make it more googlable.

    – dreeves

    Nov 24, 2009 at 5:43

  • NOTE: This question was incorrectly marked as “already asked” array dereferencing. This question has not already been asked, because it is not exclusively about arrays. A PHP function can return any value type, not just arrays (see example2 in the original post, where the function result is an object, and not an array).

    – dreftymac

    Apr 14, 2015 at 15:34


1646955250 281 PHP Syntax zum Dereferenzieren des Funktionsergebnisses
Calvin

Well, you could use any of the following solutions, depending on the situation:

function foo() {
    return array("foo","bar","foobar","barfoo","tofu");
}
echo(array_shift(foo())); // prints "foo"
echo(array_pop(foo())); // prints "tofu"

Or you can grab specific values from the returned array using list():

list($foo, $bar) = foo();
echo($foo); // prints "foo"
echo($bar); // print "bar"

Edit: the example code for each() I gave earlier was incorrect. each() returns a key-value pair. So it might be easier to use foreach():

foreach(foo() as $key=>$val) {
    echo($val);
}

1646955251 933 PHP Syntax zum Dereferenzieren des Funktionsergebnisses
Tyler Carter

There isn’t a way to do that unfortunately, although it is in most other programming languages.

If you really wanted to do a one liner, you could make a function called a() and do something like

$test = a(func(), 1); // second parameter is the key.

But other than that, func()[1] wird in PHP nicht unterstützt.

  • Oh wow, das wusste ich nicht. Wisst ihr warum das nicht geht? Sollte func() nicht im Wesentlichen ein Array-Typ mit dem Rückgabewert sein, also [1] wirkt auf ein Array? Oder analysiert PHP es schlecht?

    – thedz

    25. Juli 2009 um 16:43 Uhr

  • PHP parst es nicht wie andere Sprachen, also müssen Sie es zuerst als Variable definieren.

    – Tyler Carter

    25. Juli 2009 um 16:46 Uhr

  • @Kouroki Kaze: array_slice gibt immer noch ein Array zurück, auch wenn der Slice zu einem einzelnen Wert führen würde. Sie könnten es mit Strom kombinieren, aber das wird für eine einzelne Zeile etwas lang. 😉

    – James

    19. August 2010 um 15:32 Uhr


  • @James, es ist lang, aber darum geht es nicht. Es ist immer noch eine Zeile und es funktioniert.

    – Schrittmacher

    20. Juli 2015 um 18:58 Uhr

Wie andere bereits erwähnt haben, ist dies nicht möglich. Die Syntax von PHP lässt dies nicht zu. Ich habe jedoch einen Vorschlag, der das Problem aus der anderen Richtung angreift.

Wenn Sie die Kontrolle haben getBarArray -Methode verwenden und Zugriff auf die PHP-Standardbibliothek haben (auf vielen PHP 5.2.X-Hosts installiert und standardmäßig mit PHP 5.3 installiert), sollten Sie erwägen, eine zurückzugeben ArrayObject anstelle eines nativen PHP-Arrays/einer nativen PHP-Sammlung. ArrayObjects einen haben offetGet -Methode, die verwendet werden kann, um jeden Index abzurufen, sodass Ihr Code in etwa so aussehen könnte

<?php
class Example {
    function getBarArray() {
        $array = new ArrayObject();
        $array[] = 'uno';
        $array->append('dos');
        $array->append('tres');
        return $array;
    }
}

$foo = new Example();
$value = $foo->getBarArray()->offsetGet(2);

Und wenn Sie jemals ein natives Array/eine native Sammlung benötigen, können Sie die Ergebnisse jederzeit umwandeln.

//if you need 
$array = (array) $foo->getBarArray();

  • Oh wow, das wusste ich nicht. Wisst ihr warum das nicht geht? Sollte func() nicht im Wesentlichen ein Array-Typ mit dem Rückgabewert sein, also [1] wirkt auf ein Array? Oder analysiert PHP es schlecht?

    – thedz

    25. Juli 2009 um 16:43 Uhr

  • PHP parst es nicht wie andere Sprachen, also müssen Sie es zuerst als Variable definieren.

    – Tyler Carter

    25. Juli 2009 um 16:46 Uhr

  • @Kouroki Kaze: array_slice gibt immer noch ein Array zurück, auch wenn der Slice zu einem einzelnen Wert führen würde. Sie könnten es mit Strom kombinieren, aber das wird für eine einzelne Zeile etwas lang. 😉

    – James

    19. August 2010 um 15:32 Uhr


  • @James, es ist lang, aber darum geht es nicht. Es ist immer noch eine Zeile und es funktioniert.

    – Schrittmacher

    20. Juli 2015 um 18:58 Uhr

1646955251 296 PHP Syntax zum Dereferenzieren des Funktionsergebnisses
Jason Planke

Schreiben Sie eine Wrapper-Funktion, die dasselbe erreicht. Aufgrund der einfachen Typumwandlung von PHP kann dies ziemlich offen sein:

function array_value ($array, $key) {
return $array[$key];
}

  • Die effizienteste Funktion würde hier eine Array-Referenz verwenden. Beispiel: function array_value(&$a,$k) { $b = &$a; return $b[$k]; }

    – Kyle Farris

    16. Februar 2011 um 21:53 Uhr


  • Ich denke, Sie können das gleiche Ergebnis erzielen, indem Sie der Funktion einfach sagen, dass sie als Referenz zurückkehren soll, dh function &array_value (…

    – Nolte

    24. Juli 2011 um 20:19 Uhr

  • @KyleFarris, ich bezweifle stark, dass das jetzt und auch in Zukunft effizienter ist. (Hier gibt es auch Testergebnisse.) Dies liegt daran, dass 1) die Verwendung von Array-Referenzen, wenn keine benötigt werden, von Sprachpräskriptivisten abgeraten wurde und 2) aktuelle und zukünftige Sprachimplementierer versuchen, allgemeine Anwendungsfälle zu optimieren, von denen die meisten abgeleitet sind solche Rezepte.

    – Schrittmacher

    20. Juli 2015 um 19:28 Uhr


989280cookie-checkPHP-Syntax zum Dereferenzieren des Funktionsergebnisses

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy