2011-04-28 99 views
2

請有人建議?PHP OO:抽象類的重寫屬性

我們有一個抽象基類,有幾個屬性和一些方法。

從繼承的類調用方法(帶參數),其共同意圖是將傳遞的參數設置爲基類的屬性,除非它們看起來並不重寫默認值。

如果我在抽象(基)類的構造函數中設置了一個值(用於測試目的),它可以正常工作,並且傳遞給構造函數的任何東西都可以工作,但我們想要做的是獲取setErrors方法來實際設置物業的價值。

例子:

//abstract base class 

private $errors = array();//the property we want to overide 

public function __construct() 
{ 
$this->errors[] = "This is a required field";//for testing purposes only this works 
} 

public function setErrors($error) 
{ 
var_dump($error);//this proves that $error is passing something... 
$this->errors[] = $error;//this doesnt work(override the property) 
var_dump($this->error);//the property now has the $error value... 
} 

public function getErrors() 
{ 
return "<li>".implode("</li>\n",$this->errors); 
} 

我不知道這是否是與基類是抽象的,即因爲它不實例化。請有人解釋爲什麼這不起作用? 預先感謝您對此感興趣。

編輯 我們不想繼承私有財產權從基類

我們想要做的是覆蓋與set方法的屬性,然後使用一個公共的get方法返回的財產。

+0

什麼問題是什麼?[It works fine](http://codepad.org/nCe6bMOI)。 – netcoder 2011-04-28 16:32:14

回答

0

您應該將$ errors聲明爲protected而不是private。瞭解更多關於Class and Objects visibility ;-)

更新:

好吧,也許我現在明白你的問題:P

嘗試修改您的setErrors像這樣:

public function setErrors($error) 
    { 
     var_dump($error);//this proves that $error is passing something... 
     $this->errors = (array) $error;//this works (override the property) 
    } 
+0

請參閱下面的評論... – 2011-04-28 15:41:14

+0

感謝Francesco,但沒有工作... – 2011-04-28 16:04:27

+0

對不起史蒂夫,但不清楚你對你的代碼有什麼期待。你能用一個完整的例子,預期的結果和實際的結果來更新你的問題嗎? – 2011-04-28 16:18:00

0

private成員在繼承類中不可見。爲此,您必須將可見性更改爲protected

+0

我們不試圖通過繼承類來訪問任何基類的成員。我們從一個子類調用基類方法並傳遞一個參數。然後我們使用傳入的參數設置屬性,並調用get方法返回屬性的值,但問題是......該屬性未被覆蓋。 – 2011-04-28 15:40:54

+0

請添加一些示例代碼和實際以及預期的結果。這對我來說沒有意義 - 但也許我只是不正確地理解問題。 – 2011-04-28 15:49:13

+0

該屬性應該通過setErrors()方法在同一個類中設置,但不是,所有的代碼都在那裏。然後,我們將使用一個public get方法來返回可以從一個子類中調用的屬性。 – 2011-04-28 15:55:45

5

你」重申聲明errors字段爲私有的,所以只有它聲明的類(抽象超類)纔有權訪問它。

您可以使其成爲protected,以便子類可以訪問它或在超類中實現setErrors方法。

+0

打我:P(無論如何,超類的一部分) – 2011-04-28 15:36:21

+0

如下所述,我們不是試圖通過繼承類訪問私有財產。 – 2011-04-28 15:42:54

+0

@Steve「用set方法覆蓋屬性,然後使用public get方法返回屬性。」這沒有任何意義。什麼是用一種方法覆蓋一個屬性?只有當超類公開一個方法來操作它(或通過反射)時,才能觸及子類中的屬性。 – Artefacto 2011-04-28 16:06:00

0

什麼基本情況是,PHP將新的錯誤添加到本錯誤數組。 如。

$this->error[0]="this fie..." //default value 
$this->error[1]=`$error  //the actual set error