2012-03-19 52 views
2

好的,我需要一點幫助。我有兩個PHP類爲這兩個PHP類製作接口?

class menu 
{ 
    public static function GetItems() 
    { 
     $res=array(); 
     $r=mysql_query("select * from menuitems"); 
     while($rw=mysql_fetch_row($r)) 
     $res[]=new MenuItem($rw[0],$rw[1],$rw[2],$rw[3]); 
     return $res; 
    } 
} 

其次

class Articles 
{ 
    public static function Get() 
    { 
     $res=array(); 
     $r=mysql_query("select * from articles"); 
     while($rw=mysql_fetch_row($r)) 
      $res[]=new Articles($rw[0],$rw[1],$rw[2],$rw[3]); 
     return $res; 
    } 
} 

我需要的是能寫所有這裏面,只是改變的菜單項和文章一個簡單的PHP接口類。基本上,我需要這樣的事情作爲一個接口

interface Base 
{ 
    $res=array(); 
    $r=mysql_query("select * from $base"); 
    while($rw=mysql_fetch_row($r)) 
     $res[]=new $base($rw[0],$rw[1],$rw[2],$rw[3]); 
    return $res; 
} 
} 

而在其他類我需要的東西,我可以calllike這個

class menu 
{ 
    public static function GetItems() 
    { 
     $baza="Articles"; 
    } 
} 

你知道我的意思,我的課Menu需要實現baza類,並且有$baza,只需要用這個字符串替換?

好吧,很多說不能做到這一點在接口,我同意,但我需要解決方案,爲我的問題?

+1

您的代碼沒有任何意義可言。沒有。一個接口只是一個函數原型的集合。你不能把任何編程邏輯放在那裏。你的menu :: GetItems()在最後什麼也不做。 – 2012-03-19 12:37:21

+0

你可以用普通的基類和靜態成員變量來做到這一點(以及一些技巧,如果你有一箇舊的PHP) – 2012-03-19 12:42:04

+0

你的意思是「我怎麼能叫$ avariable :: get()?」 ?或者你對繼承感到困惑? – AD7six 2012-03-19 12:42:19

回答

1

您正在尋找繼承,而不是「界面」。一個接口說實現它的對象會有某些方法,但必須爲它們提供主體。在你的情況中,你可能會用抽象類最好,它有一個具體的方法,我們會說,Get(),然後是抽象方法GetTable()

abstract class DatabaseObject { 

    abstract protected function GetTable(); 

    public function Get() { 
     $res=array(); 
     $r=mysql_query("select * from " . $this->GetTable()); 
     while($rw=mysql_fetch_row($r)) 
      $res[]=new $base($rw[0],$rw[1],$rw[2],$rw[3]); 
     return $res; 
    } 
} 

然後你可以extend與您的類。例如:

class menu extends DatabaseObject 
{ 
    protected function GetTable() 
    { 
     return 'menuitems'; 
    } 
} 

現在你可以使用Get()該對象來獲取項目從表中。

這樣做的缺點是你將無法使用靜態方法 - 你必須創建一個類的實例。

+0

Txanks,我這是我需要的,因爲現在我有充足的動力,我會有很多類,將從基地不同的表中收集。這就是爲什麼我問這個接口,也許它可以做的接口,將與基地做? – 2012-03-19 12:52:34

+1

你不是指'class menu EXTENDS DatabaseObject'嗎? – 2012-03-19 12:54:59

+0

是的,類似的東西 – 2012-03-19 12:58:43

2

你可以用一個共同的基類做到這一點:

class Base { 
    static $table=null; 

    public static function GetItems() 
    { 
     $table = static::$table; 
     //... 
    } 
} 

class Menu extends Base { 
    static $table="menu"; 
    //... 
} 
+0

這也不錯 – 2012-03-19 12:59:54

相關問題