2010-08-22 40 views
0

我最近一直在爲我自己開發的網站生成器平臺實現模板系統。什麼我目前正試圖實現在整個模板類層次結構,像這樣使用的接口(這只是一個例子):試圖在對象實例的抽象層次結構中調用接口函數

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(),而不必自動解析視圖類中的一個被覆蓋的版本。

我正在考慮的另一個選擇是使用靜態函數,但不能用接口強制執行,我可以在非常基類中定義它,但是在那種情況下,沒有什麼東西會專門將類指定爲自稱(可以這麼說)。

它確實需要按類型強制執行,因此我選擇使用它的接口模式。

任何意見或建議將不勝感激。

回答

0

原來,靜態函數實際上可以在php接口中使用,所以我使用它作爲解決方案。