Наследование PHP: если A, то необходимо установить B - PullRequest
2 голосов
/ 15 сентября 2010

Итак, я попытался Google это, но не знаю, как называется такая ситуация ...

Я работаю над своим первым использованием наследования классов, когда родительский класс определяет набор методов, а затем несколько других классов расширяют этот родительский класс.

Что мне было интересно, можно ли сделать что-то вроде этого:

class foo {
  private bar = false;
  private baz = NULL;
}

Теперь допустим, у меня есть:

class foobar extends foo { }

Я хотел бы иметь возможность иметь условие в "foo", которое говорит, что если какой-либо класс расширяет "foo" и устанавливает "bar = true", то должен быть установлен "baz" (т. Е. Не нуль), иначе бросить исключение.

Возможна ли такая вещь?

Ответы [ 2 ]

3 голосов
/ 15 сентября 2010

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

0 голосов
/ 15 сентября 2010

Просто запустите функцию конструкции во втором классе.

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
  }
}

Множество разных способов сделать это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...