基于父类检查的条件的拦截方法进展

时间:2014-02-15 14:23:09

标签: php oop design-patterns class-design

这是一个非常基本的架构问题,因此非常具有假设性。

想象一下这个简单的设置:

我有一个表示Web对象的类,只有一个方法可以呈现该对象。但是,此类扩展了一个父类,它需要满足某些条件,以便实际执行该方法(以便呈现对象)。

示例

class webObject__adminBase {

    protected function shouldRender(){
        return access::isAdmin();
    }

}

class webObject__adminPanel extends webObject__adminBase {

    public function invoke(){

        if(!parent::shouldRender())
            return;

        // if still here, render the object 

    }        

}

$panel = new webObject__adminPanel();
$panel->invoke();

上面的代码同时适用于:一个例子加上解决问题的实用解释方法。

问题是:我想解决这个问题,而不必在子代的渲染方法中调用父类中的方法。

我想实现一个类设计,确保我需要做的就是扩展父类webObject__adminBase。应该根据某些条件检查对子类中任何方法的任何调用(如本示例中的systemAccess::isAdmin()),并且仅在满足这些条件时才进行渲染。

我希望我的描述清楚。


由于某人实际上要求将此问题视为“过于宽泛”,我决定通过更直接地引用问题标题来重新解释我的实际问题:

有没有办法根据子类检查的条件(不调用该父类的方法)拦截子方法的进展(甚至执行)?

1 个答案:

答案 0 :(得分:1)

这是一种做法,尽管很简单。我确信有更好的方法,但是这个方法试图保持原来的方法。

https://ideone.com/D5hA3H

渲染类

abstract class Render
{

    abstract public function main();

    public function __construct()
    {

    }

    final public function render()
    {
        if (!$this->canRender()) return '';

        return $this->main();
    }

    final public function canRender()
    {
        // Logic here
        return true;
    }
}

管理员面板类

class AdminPanel extends Render
{
    public function main()
    {
        return "Admin Panel";
    }
}

执行

$panel = new AdminPanel();

echo $panel->render();

PeeHaa对命名约定是正确的,尝试遵循流行的编码风格是最有利的,这使您自己更容易阅读代码,反之亦然。您可能需要查看有助于创建一致代码的PHP-FIG PSR onetwo标准。

PHP The Right Way也是一个很好的网站,可以帮助你最多,它提供有关依赖注入和编码实践的信息等。