@sprashivatel

Что заполнила магия?

$unit = Unit::findOneById(118);
var_dump($unit);

Выхлоп 1
object(Unit)[3]
  public 'id' => int 118
  public 'name' => string 'Тополь-М' (length=15)
  public 'user_lvl' => int 200
  public 'type' => string 'ground' (length=6)
  public 'kind' => string 'baks' (length=4)
  public 'attack' => int 300
  public 'defense' => int 250
  public 'maintenance' => int 3000
  public 'price' => int 350000

Из чего делаем вывод, что свойства существуют, они публичные и доступны (в базовой модели метода __set() - НЕТ, свойства заполнены).

Теперь добавляем метод __set() в базовую модель
public function __set($name, $value)
{
    echo 'Сделано<br>';
    $this->{$name} = $value;
}

Выхлоп
Сделано
Сделано
Сделано
Сделано
Сделано
Сделано
Сделано
Сделано
Сделано
D:\test.osp\index.php:81:
object(Unit)[3]
  public 'id' => int 118
  public 'name' => string 'Тополь-М' (length=15)
  public 'user_lvl' => int 200
  public 'type' => string 'ground' (length=6)
  public 'kind' => string 'baks' (length=4)
  public 'attack' => int 300
  public 'defense' => int 250
  public 'maintenance' => int 3000
  public 'price' => int 350000


Читаем о методе __set():
Метод __set() будет выполнен при записи данных в недоступные (защищенные или приватные) или несуществующие свойства.


В какие недоступные (защищенные или приватные) или несуществующие свойства произвёл запись метод __set()!!!???
  • Вопрос задан
  • 506 просмотров
Решения вопроса 1
nokimaro
@nokimaro Куратор тега PHP
Дам человеку нормальный ответ.
__set вызывается так как идёт запись в несуществующие свойства.
Например в Unit явно нету публичного свойства $id, а в результатах оно есть?
То есть вызов DB сделал примерно следующее
$unit = new Unit();
$unit->id = 118;


То есть создалось несуществующее ранее свойство $id и поэтому был вызван метод __set.
Если в Unit{} будет public $id; то __set вызван не будет, так как свойство публичное и существующее.

p.s. и запомните, что магия вне Хогвартса запрещена

Ну для начала бы увидеть код класса Unit
Может быть там там есть какой-нибудь private $data;

А так для выяснения попробуйте
public function __set($name, $value)
{
echo "__set: '$name' = '$value'\n";
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@FanatPHP
В который раз уже вспоминаю на Тостере анекдот "у таракана уши в ногах".
Вот реально, логика на 100% та же самая.
Ответ написан
kruslan
@kruslan
Из чего делаем вывод, что свойства существуют, они публичные и доступны

Это с чего такой вывод?) Прогоните вот это, думаю результат тот-же будет ;)
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы