Array von Objekten to do_action, Callback erhält singuläres Objekt?

So passierte ich heute eine Reihe von Objekten durch eine Aktion, keine große Sache, und die Dinge liefen gut. Bis ich über eines der Argumente zu einem Callback iterierte und Fehler bekam. Der einzige Unterschied bestand darin, dass das übergebene Array für den Aufruf do_action nur ein einzelnes Objekt do_action .

Verwirrt davon, habe ich einfach die Aktion nicht aufgerufen, außer das Array hatte eine Anzahl von über 1 (die Aktion speichert etwas FYI).

Ein Blick in die functionsdefinition fand ich in Zeile 411 von wp-includes / plugin.php

 if ( is_array($arg) && 1 == count($arg) && isset($arg[0]) && is_object($arg[0]) ) // array(&$this) 

was dazu führte, dass mein Array aus einem einzelnen Objekt nur ein Objekt wurde. Für mich ist das wirklich seltsam, wenn ich ein Array an eine Aktion übergebe, dann erwarte ich ein Array auf der anderen Seite. Ich benutze WordPress 3.7.1 und frage mich, ob jemand weiß, warum do_action dieses Verhalten hat? Ein Ticket oder eine Verknüpfung zu etwas im WordPress-Repository würde als eine Antwort für mich arbeiten.

EDIT: Anfrage für Code und Aktionen:

Ich erstelle eine Aktion in meinem Code wie folgt:

 add_action('hs_cache_merchants', array('HoneyCache', 'cacheMerchants'), 10, 1); 

Es wird so innerhalb einer Methode aufgerufen, die Daten aus der database abruft, wobei $merchants ein Array von Objekten ist .:

 do_action('hs_cache_merchants', $merchants); 

Und dann wurde mein callback mit der function add_Action registriert:

 public static function cacheMerchants($merchants){ if(!is_array($merchants)){ /* WordPress will convert an array of a single object to just the object. */ $merchants = array($merchants); } set_transient(HoneyMerchant::CACHE_CURRENT_MERCHANTS_KEY, $merchants, HoneyMerchant::CACHE_CURRENT_TIME); } 

Wenn ich meinen Prototyp modifiziere

 public static function cacheMerchants(Array $merchants){ 

dann bekomme ich den Fehler:

  PHP Catchable fatal error: Argument 1 passed to HoneyCache::cacheMerchants() must be an array, object given 

Ich habe print_r in der function verwendet, die do_action und notierte ein Array mit einem einzelnen Objekt, dies geschieht nur, wenn das Array 1 Element enthält, da dies Teil dessen ist, was im Core überprüft wird.

Solutions Collecting From Web of "Array von Objekten to do_action, Callback erhält singuläres Objekt?"

Ich weiß nicht, ob du das getriggers hast, ich hatte nur das gleiche Problem,

Das zweite Argument in do_action überprüft speziell, ob es sich um ein Array mit nur einem Objekt handelt. In diesem Fall verwenden sie den Verweis auf das Objekt im Array anstelle des Arrays mit dem Objekt. Ich glaube, sie verwenden diese Methode, um Referenz durch function mit variablen Argumenten zu übergeben und zu erhalten.

Ich habe do_action_ref_array() , um dies zu vermeiden.