请告知这里发生了什么?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