【问题标题】:Php - Interface method with unknown number of parametersPhp - 参数数量未知的接口方法
【发布时间】:2017-09-30 08:16:09
【问题描述】:

假设我有几个类和一个方法

public function foo (int $a, int $b, ..) {..}

其中参数的数量取决于特定的类(但对于特定的类是固定的)。

有没有办法将这样的方法放入接口中,以便我的所有类都可以实现该接口?

我认为可变参数在这里没有帮助,因为我需要将我所有的 foo 实现定义为

public function foo(int ...$ints) {..}

丢失了有关特定类需要多少参数的信息。

有什么可以使用的诡计吗?

附:我真的很想避免异常,所以我不能只检查参数的数量是否以编程方式匹配

【问题讨论】:

  • 传递参数数组而不是单个参数。
  • @BSB 这就是您使用可变参数所拥有的。有点丢失了每个类需要多少参数的信息
  • 无法完全理解。但是如果你想要传递的参数数量,你可以计算参数数组索引。
  • 我可以这样做,但如果数字错误怎么办?我想强制我班级的客户传递正确数量的参数

标签: php oop interface


【解决方案1】:

如果不使用 func_num_argscount($ints) 之类的东西并在失败时抛出异常,就无法实现这一目标。

这似乎也是一个潜在的设计缺陷。

如果您确实需要一个接口并且您的参数是一组值,我真的建议您接收一个数组并检查该数组中项目的数量和类型。

【讨论】:

  • 我猜一个接口对于我的目的来说太严格了。尽管如此,我认为目前还没有一种方法可以传达我的类有一个接收一定数量整数的方法
【解决方案2】:

如果参数不同,而方法名相同,则不是同一个接口。就这么简单。

您正试图将圆钉插入方孔中。

【讨论】:

  • 是的,这里的界面太多了。我能做的是有一个空的界面,只是为了命名。或者许多接口,每个参数一个。不过,这些都不是很好的解决方案
  • 您可以传入一个实例,而不是将每个参数分开。
  • 不知道为什么在这里投反对票,这是完全正确的。接口是与一些特定的方法及其参数和返回类型签订合同。如果参数不同,那么您正在创建具有不同值的对象,这使它们成为不同的对象。如果UserClassA 可以将属性“name”作为字符串或null,并且UserClassB 属性“name”不能为null,则它们不是接口对象。
猜你喜欢
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
相关资源
最近更新 更多