PHP中的接口应该返回相同的类型吗?我的朋友告诉我它应该返回相同的类型.(为了良好的实践)我知道PHP是动态类型语言,这是不可能的.
例如:
interface idReturn
{
//Return INT
public function getById($id);
}
interface arrayReturn
{
//Return array
public function getByData($data);
}
Run Code Online (Sandbox Code Playgroud)
这是好的做法吗?
这不是界面的事情.为避免在使用者中进行类型检查,方法应仅返回一种类型.由于代码中执行方式的数量减少,因此更容易理解代码.
例如,这增加了不必要的复杂性:
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中指示它并确保实现或子类型遵循该返回类型.
话虽如此,如果合同定义了多种可能的退货类型,消费者必须确保它能够处理它们.但是,这又意味着不合需要的类型检查.