用于传递类名并检查类是否存在的 PHP 设计模式


PHP Design pattern to pass a class name and check it for the class existence

我有几个类处理每个外部API函数的数据验证和API请求准备。其中的一个例子:

class PostProductFunction($user_params)
{
  validate()
  {
    //...
  }
  invoke($user_params)
  {
    $this->validate();
    //doing request...
  }
}

我有一个APIAccount类来表示几个API帐户之一。它处理身份验证并且有一个方法

function invokeFunction($functionClassName, $user_params)
{
  // check if the class $functionClassName exists and creates an instance of it
  // ... $obj = new $functionClassName();
  $obj->invoke($user_params);
}

因此,函数类不知道身份验证的东西,APIAccount 类不知道用户数据结构。

问题是如何在 APIAccount 类中处理此$functionClassName。我需要将函数类的所有名称存储在某个地方吗?我需要某种枚举类吗?我不想简单地获取一个字符串,然后检查具有此名称的类是否存在,因为传递此字符串的程序员很容易输入错误,并且通常他需要文档来知道正确的函数名称。我希望他以某种方式看到所有可用的选项,例如枚举。您有什么想法如何更好地实施它吗?

我不确定您是否需要为此设计模式。以下内容应满足您的需求:

function invokeFunction($functionClassName, $user_params)
{
    if (! class_exists($functionClassName)) {
        throw new Exception("Class {$functionClassName} does not exist.");
    }
    $obj = new {$functionClassName}();
    $obj->invoke($user_params);
}

我想出了如何既保留调用方法签名,又使程序员更容易看到提示,其中包含要在 IDE 中传递的可能类名。方法本身保持原样:

function invokeFunction($functionClassName, $user_params)
{
  // check if the class $functionClassName exists and creates an instance of it
  if (! class_exists($functionClassName)) {
    throw new Exception("Class {$functionClassName} does not exist.");
  }
  $obj = new $functionClassName();
  $obj->invoke($user_params);
}

但是,在名称可以作为$functionClassName传递的类中,需要添加如下所示的静态方法:

public static function getFunctionName()
{
   $function_name = get_called_class();
  // .... some optional operations with the name depending on what part of
  // (or the full name) invokeFunction is anticipating
  return $function_name
}

然后调用 invokeFunction 非常简单:

invokeFunction (SomeCertainFunctionClass::getFunctionName(), array('some_param'=>'some_val'));

使用这种方法,您可以在键入"SomeCertainFunctionClass"时获得IDE提示,同时您可以使用类名字符串作为函数参数而不会产生任何故障。