PHP OO:重写抽象类的属性

PHP OO:重写抽象类的属性,php,oop,Php,Oop,有人能给我建议吗 我们有一个抽象基类,它有一些属性和一些方法 方法(带参数)是从继承的类调用的,其共同目的是将传递的参数设置为基类的属性,除非它们看起来不覆盖默认值 如果我在抽象(基类)的构造函数中设置了一个值(出于测试目的),它就可以正常工作,传递给构造函数的任何其他内容都可以正常工作,但我们要做的是让setErrors方法实际设置属性的值 示例: //abstract base class private $errors = array();//the property we want t

有人能给我建议吗

我们有一个抽象基类,它有一些属性和一些方法

方法(带参数)是从继承的类调用的,其共同目的是将传递的参数设置为基类的属性,除非它们看起来不覆盖默认值

如果我在抽象(基类)的构造函数中设置了一个值(出于测试目的),它就可以正常工作,传递给构造函数的任何其他内容都可以正常工作,但我们要做的是让setErrors方法实际设置属性的值

示例:

//abstract base class

private $errors = array();//the property we want to overide

public function __construct()
{
$this->errors[] = "This is a required field";//for testing purposes only this works
}

public function setErrors($error)
{
var_dump($error);//this proves that $error is passing something...
$this->errors[] = $error;//this doesnt work(override the property)
var_dump($this->error);//the property now has the $error value...
}

public function getErrors()
{
return "<li>".implode("</li>\n",$this->errors);
}
//抽象基类
private$errors=array()//我们要覆盖的属性
公共函数构造()
{
$this->errors[]=“这是必填字段”;//仅用于测试目的
}
公共函数setErrors($error)
{
var_dump($error);//这证明了$error正在传递某些内容。。。
$this->errors[]=$error;//这不起作用(重写属性)
var_dump($this->error);//该属性现在具有$error值。。。
}
公共函数getErrors()
{
返回“
  • ”。内爆(
  • \n“,$this->errors); }
    我不确定这是否与基类是抽象的有关,也就是说,它没有被实例化。有人能解释一下为什么这不起作用吗? 提前感谢您的关注

    编辑 我们不试图从基类继承私有属性


    我们要做的是用set方法重写属性,然后使用public get方法返回属性。

    private
    成员在继承的类中不可见。要执行此操作,必须将可见性更改为
    受保护

    您应该将$errors声明为受保护而不是私有。阅读更多关于;-)

    更新:

    好吧,也许我现在明白你的问题了:p

    尝试修改设置错误,如下所示:

        public function setErrors($error)
        {
            var_dump($error);//this proves that $error is passing something...
            $this->errors = (array) $error;//this works (override the property)
        }
    

    您将
    errors
    字段声明为private,因此只有声明它的类(抽象超类)可以访问它


    您可以将其设置为
    受保护
    ,以便子类可以访问它,也可以在超类中实现
    setErrors
    方法。

    我发现了一些可能对您有帮助的东西。我不是在回答:-(


    基本上,php会将新错误添加到当前错误数组中。 例如


    请告诉我:P(无论如何是超类部分)如下所述,我们不试图通过继承类访问私有属性。@Steve“使用set方法重写属性,然后使用public get方法返回属性。”这没有任何意义。什么是用方法重写属性?只有在超类公开一个方法来操作它(或通过反射)时,才能在子类中触及属性基类有属性“errors”和两个方法来设置和获取属性,但是set方法没有将数据“设置”到属性。当我们调用get方法时,我们得到一个null。@Steve然后向我们展示该get方法不起作用的实现。我们不试图通过继承的方法访问基类的任何成员类。我们正在从子类调用基类方法并传递参数。然后,我们使用传递的参数设置属性,并调用get方法返回属性值,但问题是…属性未被重写。请添加一些示例代码以及实际结果和预期结果。这不正确对我来说是有意义的-但可能我只是没有正确理解问题。属性应该通过同一类中的“setErrors()”方法设置,但它不是,所有代码都在那里。然后我们将使用公共get方法返回可以从子类调用的属性。抱歉,这没有意义。
    $this->errors[]=$error
    甚至不重写属性,而是将
    $error
    添加到
    $this->errors
    数组中。谢谢Stefan,您知道这样做的正确方法吗,因为基本上我们希望$error中传递的值存储在基类属性“error”中?对不起,Steve,但不清楚您希望得到什么o你的代码。你能用一个完整的例子更新你的问题吗,预期的结果和实际的结果?Francesco,我更新了代码。基本上我们有一个属性“errors”和set/get方法。如果你忽略构造函数,我们会尝试用set方法向属性添加一个值,除了它不这样做。如果你设置构造函数中的属性“error”与代码中的类似,您可以获得所需的结果,但显然我们不想这样做,我们希望setter方法可以做到这一点。[您的代码工作][1]:-)我刚刚在var_dump($this->errors)[1]中添加了一个“s”):谢谢Francesco,这一定是其他原因造成的,因为它不起作用,但我构建的框架比我们讨论的代码要广泛一些。您已经帮助解决了这个问题,尽管从技术上讲您已经回答了这个问题,干杯,尤其是对于测试。你应该为此喝杯啤酒:-)有什么问题吗。
    $this->error[0]="this fie..." //default value
    $this->error[1]=`$error       //the actual set error