Это представляется возможным при использовании функции магического сеттера , которую вы определили в foo
, но с серьезным предостережением.Магические геттеры и сеттеры срабатывают только при доступе к недоступному свойству.
При работе внутри класса все свойства, независимо от того, объявлены ли они частными, общедоступными или защищенными, обычно доступны, поэтомумагические функции получения и установки не будут срабатывать.Существует только одно исключение: свойства, которые были объявлены 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
, вам также потребуетсяопределить магическую функцию получения.