【问题标题】:Array being mysteriously converted to object immediately before usort() sees it数组在 usort() 看到它之前被神秘地转换为对象
【发布时间】:2018-04-25 20:09:36
【问题描述】:

我从这种情况中得到了很好的笑声。它在一个巨大的应用程序中,所以我不能只上传所有内容,但这里是我的代码的本地相关部分:

```

public function reallyCustomSort($thing, $options='')
{
    die('dying. gettype results for our param: '.gettype($thing));
    //Gives us "array." So why does usort complain about "object given?"
    die('dying. get_class results for our param: '.get_class($thing)); // Gives us "get_class() expects parameter 1 to be object, array given.
    usort($thing, 'AppBundle\Twig\CustomSort::customCompare'); // Gives us "Warning: usort() expects parameter 1 to be array, object given"
    die('We are done here.');
    return($thing);
}

public function someRandomFunction($thing){
    die('dying in someRandomFunction. gettype results for our param: '.gettype($thing)); //Gives us "array."
}

```

换句话说,分析我的变量的两个函数调用都同意它是一个数组,然后在一行之后,我的 usort() 函数认为该变量包含一个对象。

以前有没有人遇到过这种行为?如果是这样,您是如何解决的?

我已经尝试过的一些事情:

  • 插入 sleep() 调用以查看是否涉及竞争条件。 (看 要点如下。)不走运。

  • $thing 变量传递给不同的函数只是为了查看是否 出于某种奇怪的原因,仅仅将$thing 传递给了 函数导致转换。运气不好。

  • 清除我的应用程序中的各种缓存。没有运气。

带有更多(注释掉)代码的要点,展示了我尝试过的事情:

https://gist.github.com/patrickmaynard/7c3c7f0695e223e6903fd729172b4c21

【问题讨论】:

  • 很难说发生了什么,没有发生什么,因为很多代码都被注释掉了。你能提供一个例子,只显示真正重要的行吗?
  • 另见:php.net/manual/en/language.references.pass.php ~ 确保您正在使用的数据没有被“通过引用”操纵,这可能会导致这样的混乱。
  • usort() 确实“通过引用”工作,但它不会将数组转换为对象,所以我认为这不是问题的根源。在您致电 usort() 之前,它已经发生在某处。
  • 好点。我将尝试定义一个通过引用接收变量的测试函数。也许只是通过引用传递的行为在这里发挥了作用。 (更新:不,这不是问题。正如您所怀疑的,它在其他地方。)感谢您之前的回答,顺便说一句——我继续按照您的建议清理了 sn-p。好电话。

标签: php arrays object type-conversion usort


【解决方案1】:

我只是通过编写一个自定义函数来解决这个问题,该函数主要基于其他地方的 SO 答案。这是要点:

https://gist.github.com/patrickmaynard/922cf7cfa7533c655ec1c5eb4303345a

(我正在排序的数组是一个对象数组,每个对象都有一个 getName() 方法。因此,这个要点中的逻辑对我的用例来说效果相对较好。它可能需要对其他人进行一些调整。)

====

编辑:我尊敬的某个人也注意到我的方法被多次调用,这意味着独立的 die() 函数不是调试它的最佳方法。它第一次接收一个数组,然后第二次或第三次接收一个对象。因此,尽管上述解决方法“有效”,但我们能够通过观察在随后的方法调用期间传递的对象类型,然后使用该对象的 toArray() 方法来找到更优雅的解决方案。

【讨论】:

    猜你喜欢
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多