PHP接口.不同的退货类型

ajt*_*tek 1 php interface

PHP中的接口应该返回相同的类型吗?我的朋友告诉我它应该返回相同的类型.(为了良好的实践)我知道PHP是动态类型语言,这是不可能的.

例如:

    interface idReturn
{
   //Return INT
   public function getById($id);
}

interface arrayReturn
{
    //Return array
    public function getByData($data);
}
Run Code Online (Sandbox Code Playgroud)

这是好的做法吗?

Gor*_*don 5

这不是界面的事情.为避免在使用者中进行类型检查,方法应仅返回一种类型.由于代码中执行方式的数量减少,因此更容易理解代码.

例如,这增加了不必要的复杂性:

function get_users()
{
    // some code returning array when users have been found
    // or null when no users have been found
}

$users = get_users();
if (!is_null($users)) {
    foreach ($users as $user) {
        // do something with $user
    }
}
Run Code Online (Sandbox Code Playgroud)

如果get_users()在没有找到用户时只返回一个空数组,则可以简化消耗代码以便只读取

foreach (get_users() as $user) {
    // do something with $user
}
Run Code Online (Sandbox Code Playgroud)

此外,凭借Liskov的替换原则,任何超类型子类的类都需要在使用超类型的消费者中互换使用.如果消费者需要一个整数,您可能不会返回一个字符串,因为这可能会破坏消费者.对于实现该接口的接口和消费者的类,例如,也是如此

interface Contract
{
    /** @return array */
    public function fn();
}
Run Code Online (Sandbox Code Playgroud)

现在假设A implements Contract并返回数组,而B implements Contract返回数组或null.当B返回null时,我的消费者期望一个数组现在会中断:

function fn(Contract $instance)
{
    // will break when B returns null
    foreach ($instance->fn() as $foo) {
        // do something with $foo
    }
}
Run Code Online (Sandbox Code Playgroud)

由于PHP当前不能强制执行返回类型,因此由开发人员在DocBlock中指示它并确保实现或子类型遵循该返回类型.

话虽如此,如果合同定义了多种可能的退货类型,消费者必须确保它能够处理它们.但是,这又意味着不合需要的类型检查.