【问题标题】:PHP's SPL: Do its interfaces involving arrays cover all array properties?PHP 的 SPL:其涉及数组的接口是否涵盖所有数组属性?
【发布时间】:2010-09-13 19:23:45
【问题描述】:

是否可以通过实现所有必要的 SPL 接口来编写一个与实际 PHP 数组几乎无法区分的类?他们是否遗漏了任何重要的东西?

我想构建一个更高级的 Array 对象,但我想确保如果我用自定义 Array 类替换它们,我不会破坏一个到处使用数组的现有应用程序。

【问题讨论】:

    标签: php arrays spl


    【解决方案1】:

    我能想到的唯一问题是 gettype() 和 is_array() 函数。 检查您的代码

    gettype($FakeArray) == 'array' 
    is_array($FakeArray)
    

    因为虽然您可以像使用数组一样使用对象,但它仍然会被识别为对象。

    【讨论】:

    • 即便如此,看起来我可以使用 override_function() 函数来覆盖这些函数以解决其他情况。
    【解决方案2】:

    除了上述几点之外,您将无法使用户空间数组类型提示与您的类的实例一起使用。例如:

    <?php
    function f(array $a) { /*...*/ }
    
    $ao = new ArrayObject();
    f($ao); //error
    ?>
    

    输出:

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

    【讨论】:

      【解决方案3】:

      其他区别包括数组的“+”运算符(合并)和整个array_*函数的失败,包括常用的array_mergearray_shift

      【讨论】:

        猜你喜欢
        • 2012-11-04
        • 1970-01-01
        • 2021-05-22
        • 1970-01-01
        • 2016-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-15
        相关资源
        最近更新 更多