我想声明一个由多个子类扩展的类auth。
// Parent class that should be called
abstract class auth
{
// Force child classes to implement this method
abstract public function authUser($uid, $pw);
}
class configAuth1 extends auth
{
public function authUser($uid, $pw)
{
// Do some authentication stuff
return false;
}
}
class configAuth2 extends auth
{
public function authUser($uid, $pw)
{
// Do some authentication stuff
return true;
}
}
现在我想调用父类并尝试所有子类方法authUser()
,直到返回true。
所以我想说手动实例化所有孩子是没有意义的。 我怎么处理这个?
更新
目前,我使用get_declared_classes()
和ReflectionClass
解决此问题。这可以解决更好的方法吗?
答案 0 :(得分:3)
家长班不应该了解自己的孩子。 Reflection API和相关函数不是实现高级逻辑的好选择。 在您的情况下,您可以使用类似Strategy模式的内容。
首先,我们声明身份验证方法的通用接口:
/**
* Common authentication interface.
*/
interface AuthStrategyInterface
{
public function authUser($uid, $pw);
}
接下来,我们添加一些此接口的自定义实现:
/**
* Firsts implementation.
*/
class FooAuthStrategy implements AuthStrategyInterface
{
public function authUser($uid, $pw)
{
return true;
}
}
/**
* Second implementation.
*/
class BarAuthStrategy implements AuthStrategyInterface
{
public function authUser($uid, $pw)
{
return false;
}
}
然后我们创建另一个包含特定策略集合的实现。
它的authUser()
方法依次将认证参数传递给每个内部策略,直到一个返回true。
/**
* Collection of nested strategies.
*/
class CompositeAuthStrategy implements AuthStrategyInterface
{
private $authStrategies;
public function addStrategy(AuthStrategyInterface $strategy)
{
$this->authStrategies[] = $strategy;
}
public function authUser($uid, $pw)
{
foreach ($this->authStrategies as $strategy) {
if ($strategy->authUser($uid, $pw)) {
return true;
}
}
return false;
}
}
这不是解决问题的唯一方法,只是一个例子。