请有人帮忙解决以下问题吗?
我们有以下课程:
'Element'基类具有以下属性和方法:
//Element class
private $errors = array();
public function __construct()
{
}
public function setError($error)
{
$this->errors[] = $error;
}
public function getErrors()
{
return "<li>".implode("</li>\n",$this->errors);
}
'Container'只对元素(对象)进行分组。
'Field'类调用基类的'setError'方法并传递如下值:
//Field class
$this->setError("foo");
由于某种原因,基类中的'errors'属性没有获得添加到它的值,我猜它与实例化对象的方式有关,因为显然默认情况下没有实例化抽象类。
该字段的唯一实例化是以其继承的形式:
Text extends Field{}
$field = new Text(etc, etc)
你如何解决这个问题?
答案 0 :(得分:2)
您必须在类Element中将$ errors成员变量设置为 protected 。
//Element class
protected $errors = array();
现在,当你在Text类实例上调用继承的setError()函数时,Text类实例没有自己的$ errors数组,所以PHP让你“有利”在其中创建一个Text类的实例。但是,这是与Elements基类中不同的$ errors成员变量。
将$ errors成员变量设置为'protected'允许Text类的实例与Element基类中的变量进行交互,这样PHP就不会帮助您创建新的$ error成员(只能属于Text类)。
答案 1 :(得分:2)
适合我:http://codepad.viper-7.com/Ool7zn
<?php
abstract class Element
{
protected $errors = array();
public function setError($error)
{
$this->errors[] = $error;
}
public function getErrors()
{
return "<li>".implode("</li>\n",$this->errors);
}
}
abstract class Container extends Element{}
abstract class Field extends Container{}
class Text extends Field{}
$t = new Text;
$t->setError('foobar');
echo $t->getErrors();
?>