Я пытаюсь отследить, где происходит изменение объекта PHP, и отладчик не может войти в код, где это происходит.
Я отслеживаю конструктор с тремя назначениями.
public function __construct(DataDefinitionInterface $definition, $name = NULL, TypedDataInterface $parent = NULL) {
$this->definition = $definition;
$this->parent = $parent;
$this->name = $name;
}
После выполнения второго из этих трех назначений четвертое свойство (определенное другим классом в иерархии) изменилось с пустого массива на массив с одним элементом.У объекта есть магические геттеры и сеттеры, но они здесь не вызываются.Отладчик не будет входить в присваивание свойству parent
и не достигнет точки останова на __set()
.Этот последний бит подходит, потому что эти магические методы используются только для незадекларированных или недоступных свойств, а свойство parent
объявляется как protected
над конструктором, и объект всегда имеет доступ к своим собственным свойствам.В тех случаях (где-либо еще в программном обеспечении), когда магический метод («переопределение» на странном языке документации PHP) вызывается , отладчик с радостью вмешивается.
Как это возможно, что отладчик не может войти в оператор, который явно выполняет больше работы, чем простое назначение?
Я использую PHP 7.2.10 под Apache 2.4.29 на Ubuntu 18.04.1, отладкав VSCode 1.33.1 с Xdebug 2.6.0.Отлаживаемый код взят из Drupal 8.7.0-dev.