2009-12-15 54 views
0

我已經定義爲抽象類如下:PHP抽象方法解決

abstract class Abstract Parent extends Zend_Db_Table_Abstract { 
    abstract function funcA($post); 
    abstract function funcB(); 

    public function newEntry($post) { 
     $t1 = $this->funcA($post); 
     $t2 = $this->funcB(); 
    } 
} 

的子類定義了兩個抽象方法,具體如下:

require_once 'atablemodel.php'; 

class Child extends AbstractParent {  
    public function funcB() 
    { 
     return 'Some Value'; 
    } 

    public function funcA($post) 
    { 
     $data = array(
      'v1' => htmlentities($post['v1']) 
     ); 
     return $data; 
    } 
} 

然而,當我試試這個,我得到一個錯誤:

Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /var/www/.../abstractparent.php on line 27 

這是抽象父母調用其中一種抽象方法的行。我想要發生的是這條線應該調用定義的子方法。

現在,我認爲有辦法做到這一點,既然我是PHP的初學者,我正在做一些根本性錯誤的事情。有什麼建議可以解決這個問題?如果我要將兩個抽象方法定義爲具有實現,然後覆蓋所有孩子中的這些方法(即根本不處理抽象類),那麼如何確保調用其中一個方法的父級將調用適當的子程序在執行時?

編輯

大約在結合靜態和抽象問題的各種意見來看,我重新定義了類如上述,用新的錯誤,上面也顯示。

+1

一種方法既抽象又靜態是沒有意義的。 – 2009-12-15 02:22:43

+0

除外 - 該方法在實現類的上下文中是靜態的。值總是相同的,並且不依賴於類的狀態。除非從編譯器的角度來看,這是無效的...... – Elie 2009-12-15 02:27:01

+0

糟糕...忘記了導致最新錯誤的$。我之前感到很蠢,現在情況更糟!謝謝大家的幫助! – Elie 2009-12-15 02:53:19

回答

3

靜態方法不能使用$this來引用自身,因爲可以在不實例化類的情況下使用靜態函數,因此無法保證存在$this。可以使用self關鍵字來引用類樹中的方法。你想實現這樣的:

public static function newEntry($post)  { 
    $t1 = self::funcA($post); 
    $t2 = self::funcB(); 
} 

但是,要知道,有周圍的階級結構的Late Static Binding問題。對於這種範圍分辨率,PHP 5.3的工作方式可能與之前的版本不同,因此請務必閱讀它。如果父/子結構無法正常工作,則始終可以通過確切的類名引用靜態方法,即。 Child::funcA

+0

我嘗試使用self ::並得到了有關在abstractparent.php中使用此錯誤,並使用this->導致上面顯示的錯誤。 – Elie 2009-12-15 02:43:35

+0

你能引用錯誤信息嗎? – 2009-12-15 11:25:07

1

爲了解決當前對象的一個​​方法,你需要$this

$t1 = $this->funcA($post); 
    $t2 = $this->funcB(); 

調用funcA()單獨查找全局定義的函數,而不是一個方法。

如果你想在對象的外部調用該方法,使用

$objectname->methodname() 
+0

但是,然後我得到的錯誤:「致命的錯誤:使用$這個時,不在對象上下文在/var/www/.../abstractparent.php在第27行」 – Elie 2009-12-15 02:20:10

+0

aaaah,我忽略了'靜態'。然後嘗試使用classname :: methodname(),這是調用方法的靜態方法。 – 2009-12-15 02:25:42

+0

但我不能從父母那裏打電話給我,可以嗎?因爲那麼它會解析爲父級實現,這是抽象的... – Elie 2009-12-15 02:28:57

1

你聲明的函數爲靜態的,所以你不能用這個$使用它們。靜態方法可以通過self ::或通過類名引用::

您可以在非靜態方法的類的實例上使用$ this。

+0

我暫時刪除了所有靜態引用,導致上面顯示的錯誤。 – Elie 2009-12-15 02:44:24