试图在对象实例的抽象层次结构中调用接口函数

时间:2010-08-22 21:29:49

标签: php reflection interface abstract hierarchy

我最近一直在为我自己开发的网站生成器平台实施模板系统。我目前正在尝试实现的是在整个模板类层次结构中使用一个接口,就像这样(这只是一个例子):

interface IStyleSheet
{
    public function StyleSheetFragment();
}

abstract class TemplateBase
{
    public abstract function DoRender();
}

abstract class TemplateRoot extends TemplateBase implements IStyleSheet
{
    public function DoRender()
    {
        ?>
        <div id='content1'>
            <?php 
                $this->Content1();
            ?>
        </div>
        <div id='content2'>
            <?php 
                $this->Content2();
            ?>
        </div>
        <?php 
    }

    public abstract function Content1();
    public abstract function Content2();

    public function StyleSheetFragment()
    {
        ?>
            <style>
                #content1{
                    text-align: center;
                }

                #content2{
                    text-align: right;
                }
            </style>
        <?php 
    }
}

class PageView_Home extends TemplateRoot implements IStyleSheet
{
    public function Content1()
    {
        ?>
            <div id='foo'>
                <?php 
                    // some ui stuff here
                ?>
            </div>
        <?php 
    }

    public function Content2()
    {
        ?>
            <div id='bar'>
                <?php 
                    // some more ui stuff here
                ?>
            </div>
        <?php 
    }

    public function StyleSheetFragment()
    {
        ?>
        <style>
            #foo{
            /*
                styling stuff
            */
            }

            #bar{
            /*
                more styling stuff 
*/
            }
        </style>
        <?php 
    }
}

现在,使用反射调用层次结尾的视图类,我想要做的是循环遍历基类列表1并在每个中调用接口函数StyleSheetFragment()没有它自动解析到视图类中的一个重写版本。

我正在考虑的另一个选项是使用静态函数,但不能用接口强制执行,我可以在非常基类中定义它但是在那个实例中没有任何东西可以特别地将该类表示为自我(可以这么说)。

它确实需要按类型强制执行,因此我选择在其上使用接口模式。

我们非常感谢任何意见或建议。

1 个答案:

答案 0 :(得分:0)

事实证明静态函数实际上可以进入php接口,所以我已经将其用作解决方案。