【发布时间】:2020-02-20 17:07:17
【问题描述】:
我正在努力将一个庞大的整体类分解为几个子类,但是一次完成所有工作太多了,所以我希望在时间允许的情况下将它们一个一个地拆分为多个版本。它是一个授权某些通道的身份验证类,所以目前它看起来像这样:
$auth = new Auth($user, $data);
$output = $auth->authChannel($channelName);
在Auth里面,基本上是这样的:
public function __construct($user, $data)
{
$this->user = $user;
$this->data = $data;
}
public function authChannel($channel)
{
$this->setUserData();
if (isset(self::CHANNEL_AUTH_FUNCTIONS[$channel])) {
$authFunction = self::CHANNEL_AUTH_FUNCTIONS[$channel];
return $this->$authFunction();
} else {
// invalid channel
}
}
所以self::CHANNEL_AUTH_FUNCTIONS基本上就是['channelA' => 'authChannelA', 'channelB' => 'authChannelB']等,所有这些功能都在这一类中。
现在我想做的,一次一个,是if $legacyChannel => callLegacyFunction() / else $newChannel => instantiate its own class and call auth()。
所以我将Auth.php 放入它自己的命名空间中,并在同一个命名空间中拥有新的Channel.php 类。和Channel extends Auth。
目前我有这个:
public function authChannel($channel)
{
$this->setUserData();
if (isset(self::CHANNEL_AUTH_LEGACY_FUNCTIONS[$channel])) {
$authFunction = self::CHANNEL_AUTH_LEGACY_FUNCTIONS[$channel];
if ($authFunction) {
return $this->$authFunction();
} else {
$authClassName = __NAMESPACE__ . '\\' . ucwords($channel);
$authClass = new $authClassName($user, $data);
return $authClass->auth();
}
} else {
// invalid channel
}
}
有没有更好的方法来做到这一点?目前这似乎有点浪费,因为创建了两个不同的对象,并且我相信例如需要再次调用 setUserData() 函数。我也想知道除了__NAMESPACE__ . / . $className之外是否有更好的方法来获取动态类名。
【问题讨论】:
标签: php oop design-patterns