所以,我尝试谷歌这个,但不知道这种情况叫什么......
我正在努力第一次使用类继承,其中父类定义了一组方法,然后其他几个类扩展了该父类。
我想知道的是,有可能做到这样的事情:
class foo {
private bar = false;
private baz = NULL;
}
现在让我说我有:
class foobar extends foo { }
我希望能够在“foo”中有一个条件,即如果任何类扩展“foo”并设置“bar = true”则必须设置“baz”(即非空),否则抛出异常。
这样的事情可能吗?
答案 0 :(得分:3)
使用您在foo
中定义的magic setter function似乎可以做到这一点,但有一个严重的警告。只有当您访问无法访问的属性时,才会触发魔术吸气剂和定位器。
在类中操作时,所有属性(无论是声明为私有,公共还是受保护)通常都是可访问的,因此魔术getter和setter函数不会触发。只有一个例外:在祖先类中声明为private
的属性。那些将被隐藏(不可访问)到后代类,并且魔术函数将被激活。
这意味着您需要在bar
中声明baz
和foo
。如果您在foobar
中声明它们,它将无法工作,因为它们将变得可访问。
考虑到这一点,以下内容将按您的要求运行:
class foo {
private $bar = false;
private $baz = NULL;
public function __set($name, $value)
{
if ($name == "bar")
{ if ($value == true)
{
if ($this->baz == null)
throw new Exception();
}
}
}
}
class foobar extends foo {
function test()
{
$this->bar = "TEST";
}
}
$foobar = new foobar();
$foobar->test(); // Will throw an exception
如果您想从bar
内阅读baz
和foobar
,您还需要定义魔术吸气功能。
答案 1 :(得分:0)
只需在第二个类中运行构造函数。
class foo {
private bar = false;
private baz = NULL;
public function __construct() {
if ($this->bar && is_null($this->baz)) // throw exception
}
}
class foobar extends foo {
public function __construct($baz) {
$this->baz = $baz;
$this->bar = true;
parent::__construct(); // Now run the parent's constructor
}
}
许多不同的方法......