要做的对象数组_action,回调是否获得单一对象?

时间:2014-04-17 作者:EdgeCaseBerg

所以我今天在一个动作中传递了一组对象,没有什么大不了的,一切都很顺利。直到我迭代回调的一个参数并开始出错。唯一的区别是将数组传递给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 在核心检查中。

1 个回复
SO网友:user3256672

我不知道你是否解决了这个问题,我只是遇到了同样的问题,

中的第二个参数do_action 特别检查它是否是仅包含一个对象的数组,在这种情况下,它们使用对数组中对象的引用,而不是使用包含对象的数组。我相信他们使用此方法通过具有可变参数的函数传递和保留引用。

我用过do_action_ref_array() 为了避免这种情况。

结束

相关推荐

Array in meta key?

我有一个称为“会议”的自定义帖子类型。我想为已注册会议的用户创建一个特定的元密钥。例如,元密钥slug将是registered_users 它存储一个包含注册用户的所有ID的数组。有可能吗?如何创建它?当新用户注册时,如何更新它?我知道如何更新基本元,但这里是一个数组…:/