PHP OO:在抽象类上调用方法?

时间:2011-04-28 18:10:55

标签: php oop

请有人帮忙解决以下问题吗?

我们有以下课程:

  • abstract class Element {}
  • 抽象类容器扩展 元素{}
  • 抽象类字段扩展 容器{}

'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)

你如何解决这个问题?

2 个答案:

答案 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();

?>
相关问题