【问题标题】:PHP OO: Overriding properties of abstract classPHP OO:覆盖抽象类的属性
【发布时间】:2011-08-14 19:56:18
【问题描述】:

有人可以建议吗?

我们有一个带有一些属性和一些方法的抽象基类。

方法(带参数)是从继承的类中调用的,其共同目的是将传递的参数设置为基类的属性,但它们似乎没有覆盖默认值。

如果我在抽象(基)类的构造函数中设置一个值(用于测试目的),它可以正常工作,并且传递给构造函数的任何其他内容都可以,但我们想要做的是让 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);
}

我不确定这是否与抽象基类有关,即因为它没有被实例化。请有人解释为什么这不起作用? 提前感谢您的关注。

编辑 我们不会试图从基类继承私有财产

我们要做的是用 set 方法覆盖该属性,然后使用公共 get 方法返回该属性。

【问题讨论】:

标签: php oop


【解决方案1】:

您将 errors 字段声明为私有,因此只有声明它的类(抽象超类)才能访问它。

您可以将其设为protected,以便子类可以访问它,或者在超类中实现setErrors 方法。

【讨论】:

  • 打败我:P(无论如何都是超类部分)
  • 如下所述,我们不会尝试通过继承的类访问私有属性。
  • @Steve "用 set 方法覆盖属性,然后使用公共 get 方法返回属性。"这没有任何意义。什么是用方法覆盖属性?只有当超类公开一个方法来操作它(或通过反射)时,您才能触摸子类中的属性
  • 基类有属性'errors'和一些设置和获取属性的方法,但是set方法不是'设置'属性的数据。当我们调用 get 方法时,我们得到一个 null。
  • @Steve 然后向我们展示那个不起作用的 get 方法的实现。
【解决方案2】:

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

更新:

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

尝试像这样修改你的 setErrors:

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

【讨论】:

  • 对不起史蒂夫,但不清楚你对你的代码有什么期望。您能否用一个完整的示例、预期结果和实际结果来更新您的问题?
  • Francesco,我已经更新了代码。基本上我们有一个属性“错误”和设置/获取方法。如果您忽略构造函数,我们将尝试使用 set 方法向属性添加值,但它不这样做。如果您像在代码中一样在构造函数中设置属性“error”的值,您将获得所需的结果,但显然我们不想这样做,我们希望 setter 方法这样做。
  • [您的代码有效][1] :-) 我刚刚在 var_dump($this->errors) [1] 中添加了一个“s”:codepad.org/GXQYkcUY
  • 感谢 Francesco,这一定是其他原因造成的,因为它不起作用,但我构建的框架比我们讨论的代码更广泛。尽管从技术上讲,您已经回答了这个问题,但您已经帮助解决了这个问题,干杯,特别是对于测试。你应该为此喝一杯啤酒:-)
【解决方案3】:

private 成员在继承的类中不可见。为此,您必须将可见性更改为 protected

【讨论】:

  • 我们不会尝试通过继承类访问基类的任何成员。我们从子类调用基类方法并传递参数。然后,我们使用传递的参数设置属性并调用 get 方法来返回属性的值,但问题是......该属性没有被覆盖。
  • 请添加一些示例代码以及实际的和预期的结果。这对我来说没有意义 - 但也许我只是没有正确理解这个问题。
  • 该属性应该通过同一类中的“setErrors()”方法设置,但不是,所有代码都在那里。然后,我们将使用公共 get 方法返回可以从子类调用的属性。
  • 对不起,这没有意义。 $this-&gt;errors[] = $error 甚至没有覆盖该属性,而是将$error 添加到$this-&gt;errors 数组中。
  • 谢谢 Stefan,你知道这样做的正确方法吗,因为基本上我们希望 $error 中传递的值存储在基类属性 'error' 中?
【解决方案4】:

我找到了一些可以帮助你的东西。我没有声称是答案:-(

http://www.triconsole.com/php/oop.php

http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-4.php

【讨论】:

    【解决方案5】:

    基本上发生的事情是 php 会将新错误添加到当前错误数组中。 例如。

    $this->error[0]="this fie..." //default value
    $this->error[1]=`$error       //the actual set error
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2023-03-04
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多