douyan8070 2014-08-12 16:06
浏览 35
已采纳

从抽象子项中删除重复的代码

I'm creating templating engine for a software we are building. I have an abstract class,Template, with 3 extended classes Header, Body, Footer. Each of the 3 children contain the same constructor code which is bothering me just looking at as far as duplication in code, the constuctors all have this:

public function __construct($file, array $kvp)
    {
        $this->templates[] = array(
            'context' => $this->getClass($this),
            'file' => $file,
            'kvp' => $kvp
        );
    }

Is there a way to move this code into the parent class or cut down on duplication? Below is the full code:

<?php

Interface iTemplate
{   
    protected function add(Template $template);
    protected function remove(Template $template);
}

abstract class Template implements iTemplate
{
    protected $html = array();
    protected $templates = array();

    public function add($template)
    {
        array_push($this->templates, $template);
    }

    public function remove($template)
    {
        if(in_array($template, $this->templates))  {
            $key = array_search($template, $this->templates);
            $this->templates[$key] = null;
            $this->templates = array_filter($this->templates);
        }
    }

    protected function getClass($context)
    {
        return get_class($context);
    }

    public function render()
    {
        foreach($this->templates as $template)
        {
            $output = file_get_contents($template->file);

            foreach ($this->template->kvp as $key => $value) {
                $tagToReplace = "[@$key]";
                $output = str_replace($tagToReplace, $value, $output);
            }

            $html[] = $output;
        }

        return implode("
", $html);
    }
}

class Header extends Template
{   
    public function __construct($file, array $kvp)
    {
        $this->templates[] = array(
            'context' => $this->getClass($this),
            'file' => $file,
            'kvp' => $kvp
        );
    }
}

class Body extends Template
{   
    public function __construct($file, array $kvp)
    {
        $this->templates[] = array(
            'context' => $this->getClass($this),
            'file' => $file,
            'kvp' => $kvp
        );
    }
}

class Footer extends Template
{   
    public function __construct($file, array $kvp)
    {
        $this->templates[] = array(
            'context' => $this->getClass($this),
            'file' => $file,
            'kvp' => $kvp
        );
    }
}


/* Example */

$Template = new Template();
$Template->add(new Header($header_file, $header_kvp));
$Template->add(new Body($body_file, $body_kvp));
$Template->add(new Footer($footer_file, $footer_kvp));
echo $Template->render();
  • 写回答

1条回答 默认 最新

  • dongyou4411 2014-08-12 16:30
    关注

    Simple solution is using trait:

    
    interface iTemplate
    {   
        public function add(Template $template);
        public function remove(Template $template);
    }
    
    class Template implements iTemplate
    {
        protected $html = array();
        protected $templates = array();
    
        public function add(Template $template)
        {
            //...
        }
    
        public function remove(Template $template)
        {
            //...
        }
    
        protected function getClass()
        {
            return get_class($this);
        }
    
        public function render()
        {
            //...
        }
    }
    
    class Header extends Template
    {   use ConstructTrait;
    }
    
    class Body extends Template
    {   use ConstructTrait;
    }
    
    class Footer extends Template
    {   use ConstructTrait;
    }
    
    trait ConstructTrait
    {
      public function __construct($file, $kvp)
      {
        $this->templates[] = array(
          'context' => $this->getClass(),
          'file' => $file,
          'kvp' => $kvp
          );
      }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?