Methoden von Objekten im Array mit array_map aufrufen?

Lesezeit: 4 Minuten

Benutzer-Avatar
Morpheln

Angenommen, ich habe eine einfache Klasse wie:

class MyClass {
  private $_prop;
  public function getProp() {return $this->_prop;}
  [....]
}

Nun, was ich irgendwo tun möchte, liegt nicht im Bereich MyClass ist, ein Array von $_prop aus einem Array von Objekten zu erhalten MyClass($objs). Das geht natürlich mit folgendem Code:

$props = array();
foreach ($objs as $obj) {
    $props[] = $obj->getProp();
}

Dies erfordert jedoch einige Zeilen, insbesondere wenn es auf diese Weise formatiert ist (und ich muss eine solche Formatierung verwenden). Die Frage ist also: Ist dies mit array_map möglich? Eine Möglichkeit wäre, die create-Funktion zu verwenden, aber ich mag das in PHP nicht wirklich (Lambdas in PHP sind zumindest umständlich und wenn ich das richtig verstehe, ist ihre Leistung wie die von bewertetem Code, aber die Leistung ist hier nebensächlich). Ich habe es satt, ziemlich viel zu suchen und keine eindeutige Antwort zu finden. Aber ich habe irgendwie das Gefühl, dass es nicht möglich ist. Ich habe Dinge ausprobiert wie array_map(array('MyClass', 'getProp'), $objs)aber das funktioniert nicht, da die Methode nicht statisch ist.

Bearbeiten: Ich verwende PHP 5.3.

  • Was ist falsch an der Foreach-Schleife? Es sind nur vier Zeilen Code. Welche PHP-Version verwendest du?

    – Felix Klinge

    27. Juli 2011 um 6:59 Uhr


  • Es ist nur so, dass array_map das Potenzial hat, viel sauberer zu sein, und ich mag funktionale Techniken. Aber natürlich ist PHP keine funktionale Sprache, also … Trotzdem wäre es cool, wenn dies möglich wäre. Da es in Wirklichkeit wie eine triviale Funktionalität für Sprache erscheint, irgendwie.

    – Morpheln

    27. Juli 2011 um 7:03 Uhr

  • Was genau könnte sauberer sein? Sie übergeben den Inhalt des Arrays einzeln an den Callback. Das ist so ziemlich dasselbe wie in Ruby, Python und JavaScript.

    – Gordon

    27. Juli 2011 um 7:39 Uhr


  • Pseudo-Code array_map(array('MyClass', 'getProp'), $objs) Wo nicht statische Methode aufgerufen wird, wäre sauberer. Eine kompakte Linie. Es ist nicht erforderlich, ein leeres Array zu erstellen. Es ist nicht erforderlich, Objekte manuell zu loopen und auf das Array zu schieben. Geben Sie einfach ein Array an und nehmen Sie ein anderes. Natürlich funktioniert diese Idee nicht gut mit oop und esp mit dynamischer Lose-Typisierung, die PHP verwendet … Aber es könnte trotzdem gemacht werden 🙂

    – Morpheln

    27. Juli 2011 um 7:46 Uhr


  • Aber das ist nicht was array_map tut. Es tut callback($element) für jedes $element im Array. Was du beschreibst wäre $element->callback() stattdessen.

    – Gordon

    27. Juli 2011 um 7:49 Uhr


Benutzer-Avatar
Felix Klinge

In PHP 5.3 können Sie Folgendes tun:

$props = array_map(function($obj){ return $obj->getProp(); }, $objs);

(sehen Anonyme Funktionen)

Natürlich ist dies immer noch langsamer als die Verwendung von a for Schleife, da Sie einen Funktionsaufruf pro Element haben, aber ich denke, das kommt dem, was Sie wollen, am nächsten.

Alternativ, was auch vor PHP 5.3 funktioniert und möglicherweise besser zu Ihren Stilrichtlinien passt:

function map($obj) {
    return $obj->getProp();
}

$props = array_map('map', $objs);

Oder (wieder zurück zu PHP 5.3) Sie könnten eine Wrapper-Funktion wie diese erstellen (aber das wird meiner Meinung nach die langsamste Möglichkeit sein):

function callMethod($method) {
    return function($obj) use ($method) {
        return $obj->{$method}();
    };
}

$props = array_map(callMethod('getProp'), $objs);

  • Sie könnten sogar das Abschlussargument hint eingeben, um einen schwerwiegenden Fehler auszulösen, wenn das Objekt keine Instanz von wäre MyClassz.B function(MyClass $obj){...

    – Phil

    27. Juli 2011 um 7:07 Uhr

  • Der Abschluss würde nur einmal bei der Übergabe erstellt array_map(). Vermutlich würde ich sagen, dass dies in Bezug auf die Leistung fast identisch mit der Schleife wäre

    – Phil

    27. Juli 2011 um 7:14 Uhr


  • Ich sagte, ich möchte keine Lambda-/anonymen Funktionen. Außerdem denke ich, dass ich dies höchstwahrscheinlich nicht gemäß den Richtlinien für den Codierungsstil schreiben könnte.

    – Morpheln

    27. Juli 2011 um 7:14 Uhr

  • @morphles: Nun, in deinem Kommentar sagst du, dass du funktionale Ansätze magst, aber jetzt sagst du, dass du keine anonymen Funktionen fütterst. Aber sie gehen Hand in Hand. Wie ich in meinem Kommentar sagte, würde ich einfach mit dem gehen for Schleife dann.

    – Felix Klinge

    27. Juli 2011 um 7:16 Uhr


  • @morphles: PHP stellt uns viele kleine Funktionen zur Verfügung, die zu neuen, leistungsfähigeren zusammengestellt werden können. Ist einfach so. Es ist nicht Python.

    – Felix Klinge

    27. Juli 2011 um 7:25 Uhr


1234990cookie-checkMethoden von Objekten im Array mit array_map aufrufen?

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

Privacy policy