我有几个类处理每个外部API函数的数据验证和API请求准备。这方面的一个例子:
class PostProductFunction($user_params)
{
validate()
{
//...
}
invoke($user_params)
{
$this->validate();
//doing request...
}
}
我有一个APIAccount类来代表几个API帐户之一。它处理auth并且它有一个方法
function invokeFunction($functionClassName, $user_params)
{
// check if the class $functionClassName exists and creates an instance of it
// ... $obj = new $functionClassName();
$obj->invoke($user_params);
}
因此,函数类不知道auth的东西,APIAccount类不知道用户数据结构。
问题是如何在APIAccount类中处理这个$ functionClassName。我是否需要在某处存储所有函数类的名称?我需要某种枚举类吗?我不想简单地接受一个字符串,然后检查具有此名称的类是否存在,因为传递此字符串的程序员很容易输入错误,并且通常他需要文档才能知道正确的函数名称。我希望他以某种方式看到所有可用的选项,如enum。您对如何更好地实施它有什么想法吗?
答案 0 :(得分:1)
我不确定你是否需要这样的设计模式。以下内容应满足您的需求:
function invokeFunction($functionClassName, $user_params)
{
if (! class_exists($functionClassName)) {
throw new Exception("Class {$functionClassName} does not exist.");
}
$obj = new {$functionClassName}();
$obj->invoke($user_params);
}
答案 1 :(得分:1)
我想出了如何保持调用方法签名并使程序员更容易看到带有可能的类名的提示在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'同时你可以使用类名字符串作为函数参数而不会有任何垮台。