PhpStorm/Xdebug не может отображать дочерние дочерние массивы объектов

Я пытаюсь отладить этот код:

  public function removeBlankLines() {
    $this->qp->find('br');
  } // <-- break point is here

Когда я перехожу в объект $this (используя phpStorm), я не вижу дочерний массив, который мне интересен. Он просто отображает "невозможно получить свойство". Снимок экрана:

phpStorm debug pane screenshot

Я использую функцию "слушать отладочные подключения". Я запускаю script из командной строки. Версия PHP:

[[email protected] ~]$ php -v
PHP 5.4.24 (cli) (built: Jan 19 2014 21:32:15)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans

Возможно, связано: http://bugs.xdebug.org/view.php?id=996?

Ответ 1

http://bugs.xdebug.org/view.php?id=686

Все о том, как такие классы (SplObjectStorage, ArrayObject и аналогичные) реализованы внутри:

это связано с тем, что объекты класса SplObjectStorage не являются объектами наземных объектов PHP, а специальными супер-пуперными внутренними. Аналогичная ситуация будет происходить со многими другими внутренними классами PHP.

AFAIK ничего не может быть сделано на стороне PhpStorm до тех пор, пока xdebug не сможет "поддержать" их.


ОБНОВЛЕНИЕ: Вышеупомянутый билет xdebug был разрешен для xdebug 2.3.3 довольно давно (последняя версия стабильного xdebug - 2.4.1), и должно быть возможно просматривать такие классы в отладчике.

Ответ 2

  • Обновите свой xdebug до версии 2.3.3, он исправил проблему http://bugs.xdebug.org/view.php?id=686#c3116
  • Если вы используете бродягу, убедитесь, что вы обновили xdebug в
    vagrant virtual machine.
  • Инструкции по обновлению можно получить в форме http://xdebug.org/wizard.php

    Если обновление не является вариантом, вы можете сбросить содержимое в качестве последнего
    курорт.

    В оценке выражения вы можете попробовать что-то вроде

    file_put_contents ('dump.txt', var_export ($ requiredVariable, true));

Ответ 3

Вы также получите ошибку ! can not get property, если свойство, которое вы пытаетесь проверить, наследуется от родительского класса и не видно из текущей области.

Пример:

xDebug будет аннотировать соответствующее свойство, подобное такому:

$childClass = {path\to\child\Child}
    *path\to\class\Parent*property = {path\to\property\Property}

Где:

  • Parent - базовый класс
  • Child - расширяющийся класс
  • property - это унаследованное свойство, определенное на родительском

Обратите внимание на звездочку *, которая идентифицирует этот случай и обозначает "не видно из текущей области".

Решение:

Быстрое решение для включения отладки - установить видимость родительского свойства на public.

т

class Parent {
    public $property;  // instead of private or protected
}

class Child extends Parent{
    // You can now inspect parent::$property for instances of Child 
}

Не забудьте установить видимость свойств на правильное значение при завершении тестирования.

Ответ 4

Linux LDME2
PHP 5.6.30-0 + deb8u1
xdebug v 2.5.3

Я попробовал этот прием.

php -i | xclip -selection clipboard

Положите и следуйте инструкциям

https://xdebug.org/wizard.php

Я получил этот результат (не может получить свойство)

sha256sum ~/xdebug-from-src/xdebug-2.5.3/modules/xdebug.so     afbb70941387ff1e191433d2a09ff42a393caac773194c0e9004b844a0f3d73b

Я нашел исправление для этой проблемы. Вместо того, чтобы строить из источника, нужно установить из pecl

sudo pecl install xdebug

sha256sum/usr/lib/php5/20131226/xdebug.so b82f2a4ab101323d3600a79223143e2eefe941d404c88af2bd7434fd47caaf13

php -v

PHP 5.6.30-0 + deb8u1 (cli) (построено: 8 февраля 2017 08:50:21) Авторское право (c) 1997-2016 гг. Группа PHP Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies     с Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, Zend Technologies     с Xdebug v2.5.3, Copyright (c) 2002-2017, Derick Rethans

Ответ 5

У меня была похожая проблема в рамках Yii. Объекты ActiveRecord, не показывающие свойства в наблюдениях отладчика (не могут получить свойство).

Но есть простой обходной путь: в часах отладчика используйте $this->attributes вместо $this.

Я думаю, что этот подход может помочь во многих подобных ситуациях, если вы знаете внутреннюю структуру объекта и что искать. Если $this->something все еще не работает, попробуйте привести его к массиву с (array)$this-> something.