【问题标题】:Is it possible to override print_r's behaviour on an ArrayIterator object in PHP?是否可以在 PHP 的 ArrayIterator 对象上覆盖 print_r 的行为?
【发布时间】:2011-09-06 08:17:26
【问题描述】:

我有一个扩展 ArrayIterator 的 PHP 类,并实现了所有必要的方法,使其表现得像一个数组。

这对于 foreach 循环之类的东西很有效,但是在它上面调用 print_r 仍然会打印出对象的变量,而不是像打印数组那样打印它。

是否有某种方法可以覆盖此行为,以便调用 print_r(我猜是 var_dump)将打印此对象的自定义输出?

【问题讨论】:

标签: php arrays


【解决方案1】:

不,因为它旨在提供有关变量的信息(即用于调试),而不仅仅是提供一些字符串表示形式。

您可以覆盖__toString 并使用echo

【讨论】:

    【解决方案2】:

    如果不这么认为,除非使用 PHP Runkit,但我不建议这样做,因为它会改变您的用户所期望的预期行为。

    另一种好方法是制作自己的函数(例如:my_print_r() { /* some code */ } 或使用 __toString() 神奇的方法。

    它有什么用?

    【讨论】:

    • 出于各种原因,我修改了一些现有代码以返回 ArrayIterator 而不是实际数组。我有一堆测试/调试工具,它们假设它们正在获取一个数组,所以我希望新的基于 ArrayIterator 的类可以以各种方式模拟一个数组,以保持它们按原样工作。
    • 嗯,好的。所以print_r 并没有真正打印出相同的东西这一事实并没有破坏你的代码,你只是希望你的调试显示不被改变。
    • 目前,是的。我希望有可能让一个对象在各个方面都被视为一个数组。我有一些代码总是返回一个数组,但现在(在某些情况下)需要返回一个对象,它是一个可迭代的 c 数据结构的包装器。
    • 也许你的代码中的缺陷是有不同类型返回的函数。
    • 是的,似乎解决方案是将普通数组包装在一个对象中,并始终返回它,而不是试图将另一个对象伪装成一个数组。
    【解决方案3】:

    为什么不使用getArrayCopy 方法?

    即。

    print_r($yourIterator->getArrayCopy());
    

    【讨论】:

      【解决方案4】:

      从 PHP 5.6 开始添加了魔术方法 __debuginfo,如果你实现它,你应该能够覆盖 var_dumpprint_r 行为。

      在这里: http://php.net/manual/language.oop5.magic.php#object.debuginfo

      【讨论】:

        猜你喜欢
        • 2019-08-21
        • 2015-04-20
        • 2011-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 1970-01-01
        相关资源
        最近更新 更多