为什么在PHP中有一个没有返回类型的接口?

时间:2010-06-15 19:00:38

标签: php oop

为什么可以在不指定返回类型的情况下创建接口?为什么不能使这个界面无法使用?

这使得它更清晰:

Interface run
{
    public function getInteger();
}

class MyString implements run
{    
    public function myNumber()
    {

    }

    public function getInteger()
    {  
        return "Not a number";
    }    
}

在Java中,每个接口都有一个返回类型,如IntegerStringVoid

我知道PHP很遗憾是一种松散类型的语言,但是没有解决这个问题的方法吗?

是否可以定义一个返回类型为Integer的接口?

4 个答案:

答案 0 :(得分:19)

仅在PHP7.0或更高版本支持函数/方法参数或返回值的类型提示

查看详细信息: http://php.net/manual/en/migration70.new-features.php

如果您使用的是PHP5,那么当前接受的做法是使用phpdoc条评论来表明“合同”存在。

/** 
 * Does something.
 * @return int
 **/
public function getInteger() { return 1; }

如果代码违反了“合同”,我建议找到原始编码器并让他们修复它和/或提交错误和/或自己修复它,如果它在你自己的代码库中。

答案 1 :(得分:5)

不,没有。你自己说的原因是:PHP是松散的类型 你可以在PHPDoc中有提示,或者检查你使用接口函数的函数中的类型,如果你得到的是除整数之外的其他东西,则抛出一个InvalidArgumentException。

答案 2 :(得分:5)

应该注意的是,现在可以使用PHP7(在撰写本文时只发布了Beta1)

可以使用以下语法:

interface Run
{
    public function getInteger(): int;
}

class MyString implements Run
{    
    public function myNumber()
    {

    }

    public function getInteger()
    {  
        return "Not a number";
        // Throws a fatal "Catchable fatal error: Return value of getInteger() must be of the type integer, string returned in %s on line %d"
    }    
}

答案 3 :(得分:0)

本身你想要的东西是不可能的......

简而言之:如果您确实需要在代码协定中强制执行返回类型,请使用静态类型语言。

但是由于__get__set__call和朋友的魔力,你可以定义一个强制类型安全的基类(我不建议除了研究/游戏时间)但这仍然无法帮助您定义类型安全接口。

相关问题