抽象类的方法不使用由派生类声明的属性

时间:2015-09-19 11:00:32

标签: php wordpress wordpress-theming

我目前正试图通过“通知”模块扩展我自己的WordPress主题小框架。这不应该取代异常 - 即使概念可能类似。由于我正在尝试编写面向对象的框架,并且我仍然是这个概念的新手,我遇到了一个我无法弄清楚如何解决的问题。

以下代码声明了一个抽象通知类,其中包含一个请求notification-title和-message的构造函数。然后,构造函数将成员方法show()添加到wordpress操作堆栈。由于用户和框架代码的其余部分不应将通知类型作为参数传递,因此我为每种通知类型创建了四个类,从而扩展了通知类。这些子类不需要覆盖显示通知的整个方法,它们只需要更改它们所扩展的类的type属性。基本功能有效,因此通知会显示在我的页面上。

问题是: type属性为空,当WordPress'show()在页脚上调用do_action( 'ease_notifications' );时。我发现,在调用构造函数之前没有设置属性(这在某种程度上是有道理的......)。无论如何,使用type属性的方法是show(),并且在构造类之后很久就会调用此方法。所以从理论上讲,属性应该是在那时设定的。你能解释一下为什么不是吗?

abstract class EaseNotification
{
    private $type;
    private $title;
    private $message;

    public function __construct( $title, $message )
    {
        $this->title = $title;
        $this->message = $message;
        add_action( 'ease_notifications', array(&$this, 'show') );
    }

    public function show()
    {
        echo '<div class="ease-notification type-' . $this->type . '">'
           . '<span class="ease-notification-title">' . $this->title . '</span>'
           . '<p class="ease-notification-body">' . $this->message . '</p>'
           . '</div>';
    }
}

class EaseError extends EaseNotification { private $type = "error"; }
class EaseWarning extends EaseNotification { private $type = "warning"; }
class EaseInformation extends EaseNotification { private $type = "information"; }
class EaseConfirmation extends EaseNotification { private $type = "confirmation"; }

通知类的用法:

require_once( 'class.easenotification.php' );

new EaseConfirmation( 'Hurray', 'It works, so you can be very happy.' );

1 个答案:

答案 0 :(得分:2)

$type类中的EaseNotification属性与$type类中的EaseConfirmation属性不同。您已将它们声明为私有,因此两者都具有仅声明它们的类的范围/可见性。

假设您只想要一个$type变量,有几种方法可以解决这个问题。

例如:

  • 声明属性protected而不是私有属性,并且不要在扩展类中声明属性。而是在子类的构造函数中设置值。父类的protected属性在子类中可见。
  • EaseNotification类中添加(public或protected ...)getter和setter方法,以便您可以从扩展类访问该属性。您还应该从子类中删除属性声明,因为您不再使用该属性。