我目前正试图通过“通知”模块扩展我自己的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.' );
答案 0 :(得分:2)
$type
类中的EaseNotification
属性与$type
类中的EaseConfirmation
属性不同。您已将它们声明为私有,因此两者都具有仅声明它们的类的范围/可见性。
假设您只想要一个$type
变量,有几种方法可以解决这个问题。
例如:
protected
而不是私有属性,并且不要在扩展类中声明属性。而是在子类的构造函数中设置值。父类的protected
属性在子类中可见。EaseNotification
类中添加(public或protected ...)getter和setter方法,以便您可以从扩展类访问该属性。您还应该从子类中删除属性声明,因为您不再使用该属性。