請告知這裏發生了什麼?PHP OOP:屬性/方法的範圍
我們有以下類一起工作:
- 一個抽象基類的形式元素「
- 一個抽象的「容器」類 延伸形式元素類和 基團形成元件
- 「字段」類擴展了 容器
在「字段」類中,我們稱之爲「我」從名爲'setErrors($ vars)'的'表單元素'類中設置一個名爲'hasErrors'的屬性。 $ vars攜帶一個布爾值。
在'表單元素'類中有另一個名爲'hasErrors()'的方法,我們嘗試在'field'類中調用以測試先前設置的布爾值的結果,但它返回false。
最初聲明爲false的hasErrors屬性未被覆蓋?
表單元素class(基)
private $hasErrors = false;
public function setErrors($flag)
{
...
$this->hasErrors = $flag;
...
}
public function hasErrors()
{
return $this->hasErrors;
}
Field類
public function validate($value)
{
...
$this->setErrors($foundErrors);//$foundErrors only local to this method
...
}
public function getField()
{
...
if($this->hasErrors())
{
//do something...
}
...
}
爲什麼財產 'hasErrors' 沒有被覆蓋?這對於不同類之間的繼承範圍有什麼關係?
不知道這是如何工作,但在此先感謝。
我覺得這也許迷惑人通過相同的名字。 'field'類中的$ hasErrors變量僅對'validate'方法是本地的。它只是作爲'setErrors'方法中的一個參數傳遞。也許我應該編輯代碼以顯示$ isErrors? – 2011-04-27 13:13:22
這應該起作用。在'validate'中,你使用public setter方法'setErrors'設置值。這是完全合法的。但是if($ this-> hasErrors())位於哪裏呢?如果我把它放在'validate'方法中(你有它在某個地方),它會正常工作,因爲它應該。哎呀,沒關係。我忽略了你也有一個容器類('class field extends container extends formelement')。 – 2011-04-27 13:18:56
對不起,我編輯了代碼以顯示'hasErrors()'方法是如何被調用的,並且在'validate()'方法中更改了局部變量名稱,因爲這很混亂。 $ foundErrors(已重命名)布爾變量被傳遞給'setErrors()'方法。這與基類中的$ hasErrors屬性不同。 – 2011-04-27 13:36:39