PHP强制数组键存在于返回类型中

时间:2014-11-20 11:39:49

标签: php arrays oop

我正在使用遗留应用程序,其中方法返回一些大的关联数组。

添加功能时,很难阅读/理解,因为在开发过程中,很难不费力地建立给定类中每个方法是否返回正确的数组键。

我知道通过编程到接口,您正在执行合同 - 很好,但不能解决强制返回类型的问题。

此外,如果返回类型是关联数组,如果返回的数组不包含正确的数组键,我需要一种以编程方式抛出异常的方法。

除了创建一个验证类作为中间层之外,还有一种合理的方法可以强制执行关联数组中返回的内容吗?

1 个答案:

答案 0 :(得分:1)

假设您有一个遗留方法返回带有键foobar的数组:

function some()
    {
    return array('foo' => 'x', 'bar' => 2);
    }

您需要确保此阵列还需要barqux个密钥,因为遗留代码不可扩展且您需要它。处理方法的响应,如下面的列表所示:

function ensure(array $arr)
    {
    $keys = array('foo', 'bar', 'baz', 'qux');

    return array_merge(array_fill_keys($keys, null), $arr);
    }

$expected = ensure(some());

这样,$arr中设置的所有值都将替换数组中的默认null,您将不会遇到“key not exists”错误。您可以使用array_merge()独立调用,使用一些装饰器包装遗留方法,但解决方案无论哪种方式都可以。

如果您想在遗留方法没有返回内容时抛出异常,您可以类似地使用array_diff_key()

function check(array $arr)
    {
    $keys = array('foo', 'bar', 'baz', 'qux');

    if(array_diff_key(array_fill_keys($keys, null), $arr)
        {
        throw new \RuntimeException('Invalid data returned!');
        }
    }

$expected = ensure(some());