@dev400

Что делают __set и __get?

К примеру код
class SomeClass {
     private $member; 
		
     function __set($name,$val) {

	     $this->member[$name] = $val;

     }

     function __get($name) {
	
		  return $this->member;

     }
}


Опытные программисты, прокомментируйте пожалуйста что делает этот код, и зачем?

Документация:
a1b7866c484e4a9fac31402a37c7fea9.png
Каких данных? В какие свойства?
  • Вопрос задан
  • 2904 просмотра
Решения вопроса 2
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Если в классе не доступно какое-либо свойство напрямую(например с помощью модификатора доступа private) можно определить "обходной путь" - "магическую" функцию __set(), в которую автоматически будет попадать любая попытка доступа к приватной переменной. Что делать с этими данными программист решает сам(реализует в теле метода).
Ответ написан
@Silm
Небольшая экскурсия в ооп
class SomeClass { // это класс SomeClass
     private $member;  // это закрытое свойство $member;
     public $foo;  // это публичное свойство $foo;

     function __set($name, $val) { // это метод __set()

       $this->member[$name] = $val;   // это сохранение значения в свойство $member;

     }

     function __get($name) { // это метод __get()
  
      return $this->member;  // это получение свойства $member;

     }
}

$SomeObj = new SomeClass(); // это мы создали объект
$SomeObj->foo = 'bar'; //  это мы записали в свойство $foo строку
$SomeObj->baz = 'ups'; // это мы хотели записать строку в свойство $baz, но стоп, у нас ведь нет такого свойства!

Но зато есть метод __set(). Именно в него попадет имя неопределенного в классе свойства, в которое мы попытались что то записать и записываемое значение заодно. Таким образом мы могли бы трактовать этот код так:
$SomeObj->member['baz'] = 'ups';
Ну, не учитывая, что свойство member у нас приватное и так обратиться к нему невозможно...

То есть, другими словами, этот код занимается следующим: складывает в $member имя и значение неизвестного свойства, в которое мы пытаемся что то записать. А при попытке получения неизвестного свойства нам возвращается весь массив $member. Что, кстати, не логично. __get() должен был бы выглядеть так:
function __get($name) { 
  
      return $this->member[$name];  

     }

теперь мы получаем не все содержимое $member, а только содержимое того ключа, в который ранее (по идеи) что то записали.

Читайте доку, кстати.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
DmitryVoronkov
@DmitryVoronkov
Python Developer
Если ты не знаешь что такое "свойство", то сначала тебе нужно разобраться, что такое классы и объекты, а потом уже заглядываться на магические методы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы