为什么可以在不指定返回类型的情况下创建接口?为什么不能使这个界面无法使用?
这使得它更清晰:
Interface run
{
public function getInteger();
}
class MyString implements run
{
public function myNumber()
{
}
public function getInteger()
{
return "Not a number";
}
}
在Java中,每个接口都有一个返回类型,如Integer
,String
或Void
我知道PHP很遗憾是一种松散类型的语言,但是没有解决这个问题的方法吗?
是否可以定义一个返回类型为Integer
的接口?
答案 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
和朋友的魔力,你可以定义一个强制类型安全的基类(我不建议除了研究/游戏时间)但这仍然无法帮助您定义类型安全接口。