За последние 24 часа нас посетили 22353 программиста и 1026 роботов. Сейчас ищут 729 программистов ...

__set() и __get()

Тема в разделе "PHP для новичков", создана пользователем AlexandrS, 26 фев 2019.

  1. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Есть 3 класса:

    PHP:
    1. class A{
    2.  
    3. private $var;
    4.  
    5.     public function __get($name){ }
    6.  
    7.     public function __set($name, $value){ }
    8.  
    9. }
    10.  
    11. class B extends A {
    12.  
    13. }
    14.  
    15. class C extends B {
    16.  
    17. // нужно через __set() присвоить $var значение
    18.  
    19. }
    И что-то я не пойму как присвоить $var значение.
    Понятное дело можно создать отдельный метод в классе A, к примеру так:

    PHP:
    1. protected function setVar($val){
    2.  
    3. $this->var = $val;
    4. }
    и в классе С просто сделать
    Код (Text):
    1. $this->setVar('test');
    либо просто сделать в классе A свойство $var , public или protected
    и уже в классе C объявить public $var = 'test' или в том же классе C в каком-то методе $this->var = 'test'

    Но интересно, как это можно сделать через __set()
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Магические методы - это такие же методы, как все остальные. Просто вызываются при определённых условиях. __set вызывается при попытке присвоения полю класса, которое в нём вообще не объявлено (ни как protected, ни как private, ни как public). Поэтому делается как-то так:
    PHP:
    1. class A{
    2.  
    3. private $_var;
    4.  
    5.     public function __get($name){
    6.        return $name === "var" ? $this->_var : null;
    7.     }
    8.  
    9.     public function __set($name, $value) {
    10.        if ($name === "var") {
    11.            $this->_var = $value;
    12.        }
    13.     }
    14.  
    15. }
    Но, вообще, обычно в классах, использующих __get и __set содержится ассоциативный массив, в который и записываются значения. Но магией лучше не злоупотреблять
     
    AlexandrS нравится это.
  3. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    С этим понял, но как тогда к ним обращаться в цепочке наследований из того же класса C ?

    $this->__set($name, $value);
    ???
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Можно просто:
    $this->var = $value;
     
    AlexandrS нравится это.
  5. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Т.е. следуя из описания документации, при обращении к закрытому свойству, происходит перехват этого обращения.
    Всё верно?
     
  6. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    В данном случае - не к "закрытому свойству". Ведь '_var' не то-же самое, что 'var'
     
    AlexandrS нравится это.
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ха, проверил, оказывается был не прав. При обращении к приватным свойствам тоже вызовется __set, если он объявлен. Но всё равно, делают подчёркивание для таких свойств, чтоб лучше читалось. Но оказывается можно и не делать
     
  8. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    Код (Text):
    1. class A
    2. {
    3.     private $var;
    4.  
    5.     public function __set($name, $value)
    6.     {
    7.         echo 'Установили ' . $name .  ' значение' . $value;
    8.         $this -> var = $value;
    9.     }
    10.  
    11.     public function __get($name)
    12.     {
    13.         return $this -> var;
    14.     }
    15.  
    16. }
    17. $obj = new A;
    18. $obj -> var = ' set метода';
    19. echo '<br>';
    20. echo $obj -> var;
     
    #8 Павел Голубцов, 4 мар 2019
    Последнее редактирование: 4 мар 2019
  9. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    Что то это совсем не то.