是否可以在PHP函数/方法中使用接口参数


Is it possible to use interface parameters in PHP functions / methods

我想知道是否可以在PHP函数/方法中使用接口参数。

我习惯于在.Net中编码并使用.Net,这是可能的,例如具有以下接口:

interface IVehicleDataProvider
{
    public void Create(IVehicle Vehicle);
}

然后我可以在一个类中实现这一点:

class CarDataProvider : IVehicleDataProvider
{
    public void Create(Car Car)
    {
        //do something
    }
}

class TruckDataProvider : IVehicleDataProvider
{
    public void Create(Truck Truck)
    {
        //do something
    }
}

只要Car或Truck实现IVehicle接口。

同样的事情可以在PHP中完成吗?

不,不能在接口中定义一种类型,在实现器中定义另一种类型(即使它是子类),实现器必须完全遵循接口。

但即使你定义

function create(IVehicle $vehicle);

您仍然可以传入Car s和Truck s。

不,因为类中的声明必须与接口声明完全兼容,所以必须使用IVehicle作为参数类型。

是的,您可以在PHP5中使用接口,尽管它们还相对不成熟。对于上面的例子,您可以使用如下内容:

interface IVehicleDataProvider
{
    public function create(IVehicle $vehicle);
}
class CarDataProvider implements IVehicleDataProvider
{
    public function create(IVehicle $car) {
        //do something
    }
}

PHP不支持返回类型声明,因此不能声明函数void(尽管您应该在函数文档中注意返回类型)。

您也不能扩展接口,因此,如果您声明IVehicleDataProvider接口中的create函数接受IVehicle的实例,那么CarDataProvider::create函数必须接受IVehicle接口的实例。