【问题标题】:Is it possible to use interface parameters in PHP functions / methods是否可以在 PHP 函数/方法中使用接口参数
【发布时间】:2012-08-28 20:46:11
【问题描述】:

我想知道是否可以在 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 中可以做同样的事情吗?

【问题讨论】:

    标签: php interface


    【解决方案1】:

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

    但即使你定义

    function create(IVehicle $vehicle);
    

    您仍然可以传入Cars 和Trucks。

    【讨论】:

    • 所以我会在类中定义function create(IVehicle $vehicle);,然后在调用此函数时我可以传入不同的类型,例如VehicleDataProvider->Create(Car $car);?
    • 没错。当然,这只有在 Car 扩展 IVehicle 时才有效。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      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 接口的实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-07
        • 2020-06-04
        • 2016-02-26
        • 2014-03-01
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多