所以我今天在一个动作中传递了一组对象,没有什么大不了的,一切都很顺利。直到我迭代回调的一个参数并开始出错。唯一的区别是将数组传递给do_action
调用中只有一个对象。
对此感到困惑的是,除非数组的计数超过1,否则我根本没有调用该操作(该操作正在缓存供参考的内容)。
在查看函数定义时,我在wp includes/plugin的第411行找到了这一点。php
if ( is_array($arg) && 1 == count($arg) && isset($arg[0]) && is_object($arg[0]) ) // array(&$this)
这就是导致我的单个对象数组变成一个对象的原因。对我来说,这真的很奇怪,如果我将一个数组传递给一个动作,那么我希望在另一边有一个数组。我正在使用WordPress 3.7.1,我想知道是否有人知道为什么\\u action会有这种行为?一张票证或wordpress存储库中某个内容的链接可以作为我的答案。
编辑:请求代码和操作:
我在代码中创建一个操作,如下所示:
add_action(\'hs_cache_merchants\', array(\'HoneyCache\', \'cacheMerchants\'), 10, 1);
在从数据库中检索数据的方法中这样调用它,其中
$merchants
是一个对象数组:
do_action(\'hs_cache_merchants\', $merchants);
然后我的回调注册了add\\u操作:
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);
}
如果我将原型修改为
public static function cacheMerchants(Array $merchants){
然后我将得到错误:
PHP Catchable fatal error: Argument 1 passed to HoneyCache::cacheMerchants() must be an array, object given
我在调用
do_action
注意到一个数组中只有一个对象,只有当数组中有一个项目时才会发生这种情况,因为这是
if
在核心检查中。