2011-12-11 61 views
2

我在與PHP類的繼承和範圍問題作鬥爭。基本上我有一個基類,其中有許多有用的方法(創建,保存,加載),其中devs當前將table_name傳遞給。我想創建一堆模型類,它們是空的,但擴展了&繼承基類,並且可以具有調用相同名稱的方法而不是基類版本。從子類擴展一個類並訪問常量

im下面的代碼努力從模型類的靜態方法中獲取table_name,任何建議?

class Model_Baseclass { 
    private $table_name; 
    public static function create($fields) { 
     $table_name = //self::table_name - parent::table_name - const $table_name 
     if ($table_name == NULL) { 
      throw new exception('You must specify a table.'); 
     } 
    } 
} 

class Model_Content_Gallery extends Model_Baseclass { 
    public $table_name = 'Content_Gallery'; 
} 

$old = Model_Baseclass::create(array('table_name' => 'Content_Gallery')); 
$new = Model_Content_Gallery::create(array()); 
+1

當你用'self ::'引用一個類屬性時,你試圖調用一個靜態屬性。你的'private $ table_name;'不是一個靜態屬性,它是一個實例屬性。 '私人靜態$ table_name;'至少會解決這個問題,儘管我不認爲這就是你所犯的錯誤。 –

回答

1

看看一些PHP OOP教程。

沒有辦法讓事情成爲現實。接下來是一個。例如,在Java中,通常爲每個屬性創建一個get/set方法。通過這種方式,您可以從任何子類訪問它,而無需使用受保護的關鍵字並獲得清晰度。

  • 在父類上創建一個getTableName()方法。
  • 在子類的實例上,您可以調用$ this-> getTableName()方法,因爲它是從基類繼承的。

如果你有一個的MyMethod()在父類和要實現它的子類,但以不同的方式,簡單地創建一個子類中的MyMethod()和使用getTableName時()可以得到表名稱屬性。

如果你的subclass.MyMethod()實現需要調用parent.MyMethod(),那麼使用parent :: MyMehtod()(http://www.php.net/manual/en/keyword.parent.php )

+0

說出學習PHP OOP然後立即開始引用另一種語言(即使你只是談論常見的做法)可能不是一個好主意。畢竟,PHP確實有'__get()'和'__set()'。 –

+0

我知道PHP的操作方式。令人遺憾的是,這個類與其在整個項目中所使用的類似,並且更好的解決方案是調用設置表名稱的實例並且不使用靜態方法。唉,我認爲這裏的某個人可能有一個想法,如何解決,而不是主意。 – azz0r

0

您需要使您的create方法非靜態,或者您的table_name變量是靜態的。

如果您需要某些靜態方法,那麼從php 5.3開始,您可以使用late static binding在靜態繼承的上下文中引用一個被調用的類。