【问题标题】:PHP: Restrict class type in function parameterPHP:限制函数参数中的类类型
【发布时间】:2023-01-20 14:54:26
【问题描述】:

我继承了一些这样的代码

    public static function instanciateRepository( $repositoryClass, ... ) {
...
        new $repositoryClass( ... );
    }

其中$repositoryClass是需要实例化的类类型。

我想添加语法检查以将错误的类参数传递给此函数,特别是将 $repositoryClass 限制为 CommonRepository 的子类。 是否有语法结构可以在 PHP 中实现,例如instanciateRepository( CommonRepository::class $repositoryClass, ..

【问题讨论】:

  • 您使用的是哪个版本?您可以像这样简单地限制参数类型:import CommonRepository // import from specific location. 和下一个public static function instanciateRepository( CommonRepository $repositoryClass, ... )
  • 这意味着参数是一个类的实例,而我需要在这里传递一个类类型。 @OliwerLisek PHP 版本是 7.4
  • 为什么你需要从字面上注入一个类,而不是类的实例?你想做什么?
  • @OliwerLisek 遗留代码使用它来实例化该类的新实例。
  • 如果您更清楚 $repositoryClass 参数是什么以及您试图用它做什么,将会有所帮助。但是您可以使用instanceof 来检查您的实例化类是否符合特定类型。 stackoverflow.com/a/1965730/11061164

标签: php static-typing function-parameter


【解决方案1】:

从定义通用方法的 interface 开始

interface CommonRepositoryInterface {}

你的CommonRepository类应该是一个实现接口和常用方法的abstract

abstract class CommonRepository implements CommonRepositoryInterface {}

现在你的存储库类可以扩展 CommonRepository 但仍然实现接口

final class RepositoryClass extends CommonRepository {}

最后,您的函数可以将接口作为参数,以便传入的任何类实例化都必须是该类型

public static function instanciateRepository(CommonRepositoryInterface $repositoryClass, ... ) {}

【讨论】:

  • 那意味着参数是一个类的实例,而我需要在这里传递一个类类型
猜你喜欢
  • 2021-06-27
  • 2023-02-22
  • 1970-01-01
  • 2020-10-11
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
相关资源
最近更新 更多