За последние 24 часа нас посетили 52386 программистов и 1756 роботов. Сейчас ищут 916 программистов ...

Поиск неизвестного свойства функцией __set()

Тема в разделе "PHP для новичков", создана пользователем romantik2011, 3 авг 2011.

  1. romantik2011

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

    С нами с:
    23 июл 2011
    Сообщения:
    26
    Симпатии:
    0
    PHP:
    1.  
    2. class A{
    3.     public $user;
    4.    
    5.     function __set($n,$v){
    6.         $this->user[$n] = $v;
    7.     }
    8.     function __get($n){
    9.     return $this->user[$n];
    10.     }
    11. }
    12.  
    13. $o = new A();
    14. $o->name = "John";
    15. echo $o->name;
    16.  
    Когда интепретатор PHP увидел в коде что мы обращаемся к неизвестному свойству, он обратился в класс, с надеждой найти функцию __set()
    Эта функция имеет 2 параметра: 01)Название свойства; 02)Значение свойства.

    В этом месте кода, как переменная $user, которая была объявлена как приватное свойство в классе, как она могла превратится в массив если она была объявлена как обычное закрытое свойство?
    PHP:
    1.  
    2. function __set($n,$v){
    3.         $this->user[$n] = $v;
    4.     }
    5.  
    В этом месте кода, если функция __get() вызывается только в том случаи когда была вызвана функция __set() и в функцию __get()
    передаётся значение свойства, то значение, которое попало в __set(). Как снова туда может лететь массив ,если функция ГЭТ принимает только свойство класса?
    PHP:
    1.  
    2. function __get($n){
    3.     return $this->user[$n];
    4.     }
    5.  
     
  2. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    В примере она объявлена публичной.

    Вообще для php вполне нормально создавать/превращать переменные в массив при присвоении типа:
    PHP:
    1. <?php
    2. $user[$n] = $v;
    После вызова __set переменная $this->user уже массив.
     
  3. romantik2011

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

    С нами с:
    23 июл 2011
    Сообщения:
    26
    Симпатии:
    0
    То есть получается переопределили переменную с неизвестного типа public $user; переопределили в массив внутри функции __set()?
     
  4. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Есть подозрение что тип у переменной вполне известный.

    Попробуйте:
    PHP:
    1. <?php
    2. class A{
    3.      public $user;
    4.    
    5.      function __set($n,$v){
    6.          echo 'До присвоения<br>';
    7.          var_dump($this->user);
    8.          $this->user[$n] = $v;
    9.          echo 'После присвоения<br>';
    10.          var_dump($this->user);
    11.      }
    12.      function __get($n){
    13.      return $this->user[$n];
    14.      }
    15.  }
    16.  
    17.  $o = new A();
    18.  $o->name = "John";
    19.  echo $o->name;
     
  5. romantik2011

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

    С нами с:
    23 июл 2011
    Сообщения:
    26
    Симпатии:
    0
    Попробовал сделать вот так, такое не сработало, тоже переопределить захотел.
    PHP:
    1.  
    2. $u = 5;
    3. $m = "Салат";
    4. echo $m[$u];
    5.  
     
  6. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Конечно не сработало.
    В первом случае происходит присвоение переменной, во втором обращение к переменной, т.е. переменная $this->user[$n] создается, а переменную $m[$u] интерпретатор найти не может.
     
  7. romantik2011

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

    С нами с:
    23 июл 2011
    Сообщения:
    26
    Симпатии:
    0
    Сработало только вот так:
    PHP:
    1.  
    2. $u = 5;
    3. $m = "Салат";
    4. $m[$u] = $u;
    5. echo $m[$u];
    6.  
    Почему? Разве так правильно писать $m[$u] = $u;?
     
  8. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    А что в этом неправильного?
    В элемент массива с ключом 5 кладется значение 5.