Дисциплины - Объектно-ориентированное программирование

ООП в PHP - Магические методы - __get() и __set()

Эти методы срабатывают при обращении к несуществующим или недоступным полям класса или его предка. Они должны быть объявлены со спецификатором доступа public. При этом метод __get вызывается при попытке считать значение скрытого или несуществующего свойства. В качестве параметра он принимает строку, содержащею имя свойства к которому произошла попытка обратиться. Возвращаемое этим методом значение будет воспринято как значение свойства, к которому произошло обращение, при этом неважно скрыто это свойство, или оно вовсе не существует.

class Point {
  private $x;
  private $y;
 
  public function __construct($x, $y) {
    $this->x = $x;
    $this->y = $y;
  }
 
  public function __get($name) {
    echo "Произошло обращение к свойству $name
";
    return $this->$name;
  }
}
 
$p = new Point(8, 16);
echo "x: $p->x
";
echo "y: $p->y
"; 
echo "Несущесвующие поле: $p->nonexistentProperty";
Произошло обращение к свойству x
x: 8
Произошло обращение к свойству y
y: 16
Произошло обращение к свойству nonexistentProperty
Несуществующие поле:

Как видите, метод __get при такой реализации при обращении к несуществующему свойству возвращает значение null, которое в нашем примере преобразовалось к пустой строке.

Метод __set вызывается при попытке изменить значение несуществующего или скрытого свойства. В качестве параметров он принимает имя свойства и значение, которое ему пытаются присвоить. Добавим этот метод в наш класс Point.

class Point {
  private $x;
  private $y;
 
  public function __construct($x, $y) {
    $this->x = $x;
    $this->y = $y;
  }
 
  public function __get($name) {
    echo "Произошло обращение к свойству $name
"; return $this->$name; } public function __set($name, $value) { $this->$name = $value; echo "Cвойству $name присвоено значение $value "; } }

Теперь при каждой попытке изменить значение скрытого или несуществующего свойства будет выводиться соответствующее сообщение.

$p = new Point(8, 16);
$p->x = 10;
$p->y = 20;
$p->z = 30;
Cвойству x присвоено значение 10
Cвойству y присвоено значение 20
Cвойству z присвоено значение 30

Методы __get и __set полезны тем, что с их помощью можно эмулировать наличие свойства, которого нет. При этом можно сделать так, что не заглядывая внутрь класса, об этом нельзя будет никак догадаться. Например, у нас есть класс, описывающий квадрат с одним скрытым полем, которое содержит длину стороны квадрата (side).

class Squere {
  private $side;
 
  public function __construct($a) {
    $this->side = $a;
  }
}

Эмулируем наличие у этого класса свойства «площадь» (area). При этом учтём, что площадь квадрата и длина его стороны зависят друг от друга.

class Squere {
  private $side;
 
  public function __construct($a) {
    $this->side = $a;
  }
 
  public function __set($name, $value) {
    if ($name == 'area') {
      $this->setArea($value);
    } else if ($name == 'side') {
      $this->side = $value;
    }
  }
 
  public function __get($name) {
    if ($name == 'area') {
      return $this->getArea();
    } else if ($name == 'side') {
      return $this->side;
    }
  }
  private function getArea() {
    return $this->side * $this->side;
  }
 
  private function setArea($area) {
    return $this->side = sqrt($area);
  }
}

Теперь экземпляры этого класса будут вести себя так, словно свойство area присутствует в классе, а свойство side доступно извне.

$squere = new Squere(25);
echo $squere->area; // 25 * 25 = 625

При этом нам не нужно будет заботиться о том, что площадь квадрата зависит от длины его стороны.

$squere = new Squere(10);
echo $squere->side; // 10
$squere->area = 25;
echo "После изменения площади изменилась и сторона:
". "$squere->side"; // 5 = sqrt(25)

Количество комментариев: 0

Для того, чтобы оставить коментарий необходимо зарегистрироваться
814301 БГУИР
814302 БГУИР
814303 БГУИР
894351 БГУИР
90421 БГУИР


Изображения Видео

1. Абстрактная фабрика https://www.youtube.com/watch?v=1mVONOCxfLg
2. Фабричный метод https://www.youtube.com/watch?v=5UqUDR6_2cY
3. Шаблон декоратор https://www.youtube.com/watch?v=Lwb9bm8yKD0
4. Dessign patterns on PHP https://github.com/domnikl/DesignPatternsPHP
5. Приёмы объектно-ориентированного проектирования. Паттерны проектирования Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес; [пер. с англ.: А. Слинкин науч. ред.: Н. Шалаев]. — Санкт-Петербург [и др.] : Питер, 2014. — 366 с. : ил. ; 24 см.
6. Приемы объектно-ориентированного проектирования. Паттерны проектирования Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес; [пер. с англ.: А. Слинкин науч. ред.: Н. Шалаев]. — Санкт-Петербург [и др.] : Питер, 2014. — 366 с. : ил. ; 24 см.
7. Ajax http://erud.by/ajax
8. Ajax http://erud.by/ajax
9. Ajax http://erud.by/ajax
10. Документация Laravel http://laravel.com
Задание к курсовой работе
Задание к курсовой работе
Вопросы к экзамену