PHP:通过childs方法扩展身份验证类

时间:2016-11-30 07:47:01

标签: php class authentication parent-child

我想声明一个由多个子类扩展的类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解决此问题。这可以解决更好的方法吗?

1 个答案:

答案 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;
    }
}

这不是解决问题的唯一方法,只是一个例子。