Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OO:在抽象类上调用方法?_Php_Oop - Fatal编程技术网

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

PHP OO:在抽象类上调用方法?,php,oop,Php,Oop,请有人帮我做以下事情吗 我们有以下课程: 抽象类元素{} 抽象类容器扩展 元素{} 抽象类字段扩展 容器{} “Element”基类具有以下属性和方法: //Element class private $errors = array(); public function __construct() { } public function setError($error) { $this->errors[] = $error; } public function getErrors

请有人帮我做以下事情吗

我们有以下课程:

  • 抽象类元素{}
  • 抽象类容器扩展 元素{}
  • 抽象类字段扩展 容器{}
“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);
}
由于某些原因,基类中的“errors”属性没有得到添加到它的值,我猜这与对象的实例化方式有关,因为显然抽象类在默认情况下没有实例化

字段的唯一实例化是其继承形式,即:

Text extends Field{}
$field = new Text(etc, etc)

如何解决此问题?

您必须将$errors成员变量设置为protectedin class元素

//Element class
protected $errors = array();
现在,当您在文本类实例上调用继承的setError()函数时,文本类实例没有自己的$errors数组,因此PHP会帮助您在文本类实例中动态创建一个数组。但是,这是一个不同于Elements基类中的$errors成员变量


将$errors成员变量设置为“protected”允许文本类的实例与元素基类中的变量交互,这样PHP就不会“有利于”您创建新的$error成员(仅属于文本类)正在运行。

您必须将$errors成员变量设置为protectedin class元素

//Element class
protected $errors = array();
现在,当您在文本类实例上调用继承的setError()函数时,文本类实例没有自己的$errors数组,因此PHP会帮助您在文本类实例中动态创建一个数组。但是,这是一个不同于Elements基类中的$errors成员变量

将$errors成员变量设置为“protected”可以使文本类的实例与元素基类中的变量交互,这样PHP就不会“有利于”您动态创建新的$error成员(仅属于文本类)。

对我来说很有用:


对我有用:




你能展示元素和字段类的完整代码吗?这个问题对下一个投票反对的人来说不清楚吗?“支持对象组合而不是类继承。”(c)你能展示元素和字段类的完整代码吗?这个问题对下一个投票反对的人来说不清楚吗?“支持对象组合而不是类继承。”(c)GoFThanks DWight,回答得很好,但不起作用。是不是因为'Field'类中调用了'setError'方法,但它实际上是实例化的'Text'类。我知道'Text'继承了'Field',但我想问一下?您没有在任何继承类中声明$errors?另外,Field类中的哪个方法包含对$thi的调用s->setError(“foo”)?是否在文本类上调用相同的(继承的)方法?即$Text->theMethod()(theMethod从字段继承).FYI,最好有所有涉及的类的代码。不要在任何地方重新声明$errors。在“field”类中有一个名为“validate”的方法,这是一个用于几乎所有继承类的抽象方法。“Text”类只有一个“getfield”方法。抱歉。谢谢DWight,回答很好,但不起作用。是因为“setError”吗thod在'Field'类中被调用,但它实际上是被实例化的'Text'类。我知道'Text'继承了'Field',但我想问一下?你没有在任何继承类中声明$errors?另外,Field类中的哪个方法包含对$this->setError(“foo”)的调用?你在调用相同的(继承的)方法吗文本类上的方法?即$Text->theMethod()(方法从字段继承).FYI,最好有所有涉及的类的代码。不要在任何地方重新声明$errors。在“field”类中有一个名为“validate”的方法,这是一个用于几乎所有继承类的抽象方法。“Text”类只有一个“getfield”方法。抱歉。谢谢Teresko,但“setError”方法不是这样调用的。注意你没有展示它是如何被调用的+它真的不在乎它是如何被调用的。我展示了它是如何被调用的。它是在“field”类中被调用的,当然它也在乎它是如何被调用的。你不能凭空调用它,但无论如何还是要感谢。显然还有其他一些事情在进行,但是Tereskos的例子很好,因为它显示了这应该是可行的,所以转到p这就是答案。你能不能把你的代码粘贴到你的答案中,这样我们就不会丢失解决方案。谢谢Teresko,但是“setError”方法不是那样调用的。请注意,你没有显示它是如何调用的+它真的不在乎它是如何调用的。我已经显示了它是如何调用的。它是在“field”类中调用的,当然它也在乎我如何调用它ts呼叫。你不能无中生有地呼叫它,但无论如何还是要感谢。显然还有其他事情在进行,但Tereskos示例很好,因为它表明这应该有效,所以将此作为答案。请将代码粘贴到答案中,以便我们不会丢失解决方案。
<?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();

?>