@dev400

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

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

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

     }

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

     }
}


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

Документация:
a1b7866c484e4a9fac31402a37c7fea9.png
Каких данных? В какие свойства?
  • Вопрос задан
  • 2811 просмотров
Решения вопроса 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
Если ты не знаешь что такое "свойство", то сначала тебе нужно разобраться, что такое классы и объекты, а потом уже заглядываться на магические методы.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
26 апр. 2024, в 07:47
2000 руб./за проект
26 апр. 2024, в 06:46
1000 руб./в час
26 апр. 2024, в 05:31
1000 руб./за проект