Исправление ошибок в PHP-приложениях при помощи Zend Debugger

Интеллектуальная интегрированная среда разработки находит и помогает исправлять ошибки в интерактивном режиме

Специализированное приложение, называемое отладчиком, тестирует выполняющийся код, позволяя остановить выполнение в произвольный момент времени, исследовать объекты, стек вызовов и даже изменить значение переменной "на лету". Узнайте, как использовать отладчик для исправления ошибок в вашем PHP-коде.

Мартин Стрейчер (Martin Streicher), независимый web-разработчик, WSO2 Inc

Мартин Стрейчер (Martin Streicher) (Jeff J. Li) - фотографияМартин Стрейчер (Martin Streicher) - независимый web-разработчик и бывший главный редактор Linux Magazine. Он имеет степень магистра компьютерных наук Университета Пардью (Purdue University) и занимается программированием в UNIX-подобных операционных системах с 1986 года. Он коллекционирует предметы искусства и игрушки.


developerWorks Contributing author
        level

25.05.2009

Согласно популярному поверью, первым компьютерным "жучком" действительно было насекомое - злополучная ночная бабочка, севшая на реле компьютера Mark II Aiken Relay Calculator, тестировавшегося в Гарвардском Университете. Оператор записал в журнале 9 сентября 1947 года "First actual case of [a] bug being found [in a computer]" (Первый реальный случай обнаружения насекомого [в компьютере]). Эта запись и печально известное насекомое изображены на рисунке 1.

Рисунок 1. Печально известное насекомое, попавшее в Mark II
Рисунок 1. Печально известное насекомое, попавшее в Mark II

На самом деле этимология (или энтомология?) термина "жучок" (bug) намного прозаичнее и, по-видимому, старше заблудившейся бабочки лет на 70. В 1848 году Томас Эдисон, описывая механические неисправности, писал: "Сначала работает интуиция и приходит озарение, но затем возникают трудности - вещь перестает работать, и тогда проявляют себя "жучки" - маленькие поломки и проблемы…" Очевидно, что этот термин уже был жаргонным во времена Эдисона.

Если вы являетесь разработчиком программного обеспечения, то, возможно, несколько успокоитесь и воодушевитесь, узнав, что даже Эдисону приходилось "отлаживать" свои изобретения (Эдисон никогда не использовал термин "отладка"; этот термин попал в язык сравнительно недавно из профессионального жаргона авиамехаников времен Второй мировой войны). Возможно, вам хотелось бы, чтобы многообразие жучков было ограничено их шестиногой разновидностью, и все, что вам нужно было бы для написания совершенного кода, - это USB-мухобойка или электронный эквивалент ловушки для тараканов (Roach Motel). "Компьютерные жучки входят, но не выходят " (может ли кто-либо добавить эту функциональность в следующую версию Subversion?). Напрасные мечтания.

Увы, как отмечал Эдисон, жучки являются неотъемлемой частью любого инженерного предприятия. Опять же по поводу изобретательства Эдисон писал: "Необходимы месяцы интенсивных наблюдений, изучения и труда, чтобы достичь результата - коммерческого успеха или провала".

К счастью, разработчики программного обеспечения имеют инструментальные средства, облегчающие "наблюдения" и сокращающие месяцы до минут или, в худшем случае, до часов или суток. В предшествующей статье ("Исправление ошибок в PHP-приложениях при помощи Xdebug" ) были рассмотрены разнообразные методики сбора улик для "вскрытия" причины сбоя. Однако такой "посмертный" анализ часто труден и продолжителен, поскольку требует выдвижения и проверки гипотез. При отсутствии необходимой информации нужно переделывать исходный код, повторять действия и начинать расследование заново - этот процесс потенциально требует многочисленных итераций.

В данной статье исследуется намного более эффективная и рациональная методика - интерактивная отладка. Специализированное приложение, называемое отладчиком, помогает тестировать выполняющийся код, позволяя останавливать его выполнение в произвольных точках прерывания, исследовать объекты, стек вызовов и рабочую среду и даже изменять значение переменных "на лету".

В демонстрационных целях мы будем использовать Zend Debugger - расширение системы Zend, тестирующее выполняющееся PHP-приложение. Загрузить и использовать Zend Debugger можно бесплатно. Однако для управления Zend Debugger и просмотра диагностической информации необходимо объединить его с клиентским приложением. Клиентское приложение может быть как элементарным, выполняющимся из командной строки, так и полнофункциональной интегрированной средой разработки (IDE), обладающей функциями редактора, завершения кода, визуальных браузеров классов и т.д.

С Zend Debugger могут взаимодействовать несколько клиентских приложений с открытыми исходными кодами, включая PHP-плагин для Eclipse. Однако я в качестве IDE для PHP предпочитаю использовать Zend Studio, предлагаемую компанией Zend Technologies, разрабатывающей как систему с открытыми исходными кодами, так и коммерческую PHP-систему времени исполнения. В отличие от самого PHP, Zend Studio является коммерческим продуктом. Продукт можно загрузить и использовать бесплатно на протяжении 30 суток (чего вполне достаточно для того, чтобы опробовать многочисленные возможности IDE), но затем необходимо купить лицензию, если вы захотите продолжать ее использование. По моему мнению, эта лицензия оправдывает каждый заплаченный пенни.

Попробуйте разные клиентские приложения и найдите то, которое вам подходит. Например, многие IDE объединяются с популярными редакторами, поэтому нет необходимости заново изучать массу клавиатурных сокращений. Независимо от вашего выбора после работы с отладчиком вы наверняка удивитесь, как раньше жили без него. Скажите "Прощай, print_r()!"

Установка Zend Studio и Zend Debugger

Для начала загрузите программное обеспечение Zend Studio и Zend Debugger. Приведенные здесь инструкции относятся к Mac OS X, но для операционных систем Linux® и Microsoft® Windows® они аналогичны (на Web-странице Zend Studio приведены конкретные инструкции для каждой из этих платформ). В действительности можно также установить и запустить Zend Studio на локальной системе, а отладчик развернуть на сервере для удаленной отладки.

Независимо от вашей платформы убедитесь в том, что на вашей системе установлена рабочая версия PHP V4 или PHP V5 - программное обеспечение Zend работает с любой версией PHP. Поскольку Mac OS X в настоящее время поставляется с PHP V4 (V4.4.7, если быть более точным), в данной статье используется эта более старая версия PHP.

Для установки инструментальных средств Zend:

  1. Перейдите на страницу Zend Downloads и нажмите Try for Zend Studio.
  2. Создайте учетную запись и загрузите Zend Studio Client V5.5.0a (последняя версия на момент написания данной статьи) и Zend Debugger V5.2.6.
  3. После завершения загрузки запустите программу установки Zend Studio. После завершения ее работы на вашей системе должен появиться каталог /Applications/Zend Studio 5.5.0/.
  4. Откройте этот каталог, затем подкаталог bin и дважды щелкните левой кнопкой мыши на приложении ZDE. Должна появиться пустая IDE, аналогичная изображенной на рисунке 2.
    Рисунок 2. IDE Zend Studio
    Рисунок 2. IDE Zend Studio

    Отвлекитесь на некоторое время от IDE и установите отладчик.

  5. Загрузите программное обеспечение Zend Debugger и разархивируйте файл при помощи команды tar xzvf ZendDebugger-5.2.6-darwin8.6-uni.tar.gz. Будет создан каталог ZendDebugger-5.2.6-darwin8.6-uni.
  6. Перейдите в новый каталог и скопируйте файл 4_4_x_comp/ZendDebugger.so в центральный каталог, в котором его можно легко найти, но нельзя случайно удалить. Если у вас уже установлены инструментальные средства разработки Xcode, хорошим местом для этого файла является /Developer/Extras/PHP:
    $ sudo mkdir -p /Developer/Extras/PHP
    $ sudo chgrp admin /Developer/Extras/PHP
    $ sudo chmod g+rwx /Developer/Extras/PHP
    $ sudo cp 4_4_x_comp/ZendDebugger.so /Developer/Extras/PHP

    Zend Debugger - это расширение Zend, и его необходимо разрешить в файле php.ini. В системе Mac OS X файл php.ini обычно расположен в /private/etc/php.ini.

  7. Откройте файл в редакторе и добавьте следующие строки:
    zend_extension=/Developer/Extras/PHP/ZendDebugger.so
    zend_debugger.expose_remotely=allowed_hosts 
    zend_debugger.allow_hosts=127.0.0.1

    Если у вас нет файла php.ini (что вполне нормально и означает, что PHP использует свои внутренние настройки по умолчанию), создайте его с указанными выше строками. Первая строка загружает расширение. Вторая ограничивает соединения с отладчиком списком IP-адресов, указываемым в третьей строке. В нашем случае PHP (включая Zend Debugger) выполняется локально. Следовательно, указывается петлевой (loopback) интерфейс 127.0.0.1, но с тем же успехом можно было указать удаленную систему. Если эта система общедоступна из сети Интернет, используйте вторую и третью строки для предотвращения нежелательного доступа к отладчику.

  8. Разрешите PHP-расширение на сервере Apache HTTP Server вашей системы Mac OS X. Откройте файл /private/etc/httpd/httpd.conf и удалите предваряющий строку символ # (решетка) в строке, начинающейся с LoadModule php4_module, и в строке, содержащей AddModule mod_php4.c.
  9. Если на вашей системе под Mac OS X еще не работает Apache HTTP Server, запустите его.
  10. Откройте System Preferences, выберите Sharing, а затем разрешите Personal Web Sharing, как показано на рисунке 3. Если вариант Personal Web Sharing уже разрешен, нажмите кнопку Stop, а затем Start для перезапуска Web-сервера.
    Рисунок 3. Разрешение работы Web-сервера в системе Mac OS X
    Рисунок 3. Разрешение работы Web-сервера в системе Mac OS X

Для проверки функционирования PHP и Web-сервера перейдите в каталог ~/Sites/ и создайте файл info.php со следующим содержимым:

<?php 
  phpinfo(); 
?>

Укажите в адресной строке вашего браузера http://localhost/~username/info.php, где username - это имя вашей учетной записи в Mac OS X. Если настройка выполнена правильно, вы должны увидеть раздел Zend Debugger в результатах работы функции phpinfo(). Этот раздел должен также соответствовать настройкам в файле php.ini.

Рисунок 4. Проверка функционирования отладчика
Рисунок 4. Проверка функционирования отладчика

Запомните настройку zend_debugger.connector_port. Мы будем подключаться к этому порту на Web-сервере для инициирования сеансов отладки.

Между прочим, если этот процесс установки представляется сложным или нужно сэкономить время, можно загрузить Zend Core или Zend Platform. Оба этих продукта являются коммерческими, но каждый из них предварительно настроен на использование Zend Debugger. Приведенные в оставшейся части данной статьи инструкции так же хорошо работают и с Zend Core или Zend Platform.


Подключение к Zend Debugger

Комбинация Zend Studio и Zend Debugger позволяет удаленно управлять системой Zend. Zend Studio выступает в роли панели управления, отображающей информацию о внутренних деталях системы. Среди прочих данных можно просматривать выполняющийся исходный код, состояние переменных и состояние рабочей Web-среды.

Zend Debugger является своего рода посредником - он передает информацию из системы Zend в Zend Studio и команды из Zend Studio в систему Zend. В число его команд входят функции отладки, например, continue (продолжение), которая продолжает выполнение, step (шаг), которая выполняет один оператор, и stop (останов), которая прерывает выполнение. При любых изменениях в системе Zend отладчик передает эти изменения в Zend Studio для отображения.

Таким образом, для отладки PHP-приложения мы настраиваем Zend Studio на подключение к отладчику и затем открываем приложение в браузере, как обычно. Когда приложение начинает выполняться, отладчик вмешивается в его работу и передает управление в Zend Studio. А там мы принимаем управление на себя.

Настройка Zend Studio

Ниже приведен простой способ установки соединения с Zend Debugger (позднее я приведу более сложный сценарий и рассмотрю дополнительные приемы отладки):

  1. Загрузите Zend Studio IDE.
  2. Выберите Zend Studio > Preferences, а затем перейдите на вкладку Debug:
    • Здесь Web-сервер (со встроенным Zend Debugger) отделен от приложения Zend Studio. Установите поле Debug Mode в значение Server.
    • Для целей данной демонстрации все PHP-приложения будут создаваться в вашем персональном каталоге Web-сайта в папке home. Укажите localhost/~username/ в поле Debug Server URL (здесь может быть указан любой путь на сервере, где содержится PHP-файл). Эти настройки вместе с настройкой Dummy File используются для разрешения отладки в системе Zend. Мое имя пользователя в Mac OS X - mstreicher, поэтому я указываю localhost/~mstreicher/ (см. рисунок 5).
    • Отладчик использует Client IP для обратного подключения к системе, выполняющей Zend Studio. Обычно эту настройку можно оставить в значении Default, но поскольку клиент и сервер выполняются локально, выберите Customized и укажите IP-адрес localhost.
    • В поле Dummy File можно указать имя любого PHP-файла, расположенного в Debug Server URL. Dummy File выступает в роли начального загрузчика (bootstrap): когда начинается сеанс отладки, URL Debug Server URL/Dummy File?start_debug=1&debug_host=Client IP&... конфигурирует и разрешает отладчик. Если Web-сервер не может найти Dummy File, отладчик не будет работать (если вы выполняете Zend Studio на ноутбуке, а отлаживаете код приложения на удаленном сервере, поместите именованный Dummy File в корневой каталог документов (document root) приложения на удаленном сервере). Для проверки существования Dummy File просто введите его URL в браузере. Если не будет сообщений об ошибках, все настроено правильно.
    • Укажите в поле Client Debug Port любой непривилегированный порт (например, 10000).
    • Для всех остальных настроек на вкладке Debug. После завершения работы ваше окно должно походить на рисунок 5.
      Рисунок 5. Пример настроек для подключения к Zend Debugger
      Рисунок 5. Пример настроек для подключения к Zend Debugger
    • Нажмите кнопку OK.

Теперь все готово для написания и отладки PHP-кода.

Отладка примера исходного кода

Zend Studio содержит все необходимое для написания PHP-кода: редактор для изменения отдельных файлов, менеджер файлов, чтобы собирать файлы в проект, браузер PHP-классов и модулей, используемый в качестве справки, окно вывода для просмотра промежуточных результатов работы и браузер рабочей среды, отображающий переменные, стек вызовов и выходной буфер. Но еще лучше то, что редактор является контекстно-чувствительным и может автоматически завершать управляющие PHP-структуры, ключевые слова и разделители строк.

Для начала щелкните кнопкой мыши в окне Editor, расположенном в верхней центральной части Zend Studio. Введите фрагмент исходного кода листинга 1 (чтобы опробовать функциональные возможности завершения кода), предназначенного для вывода чисел 1-10.

Листинг 1. Вывод чисел 1-10
<?php
    $counter = 1;
    
    while ( $counter < 10; ) {
        printf( "%d\n", $counter );
        
        increment( $counter );
    }
    
    function increment( $i ) {
        $i++;
        
        return;
    }
?>

После завершения ввода кода для его выполнения нажмите зеленую кнопку Play в инструментальной панели. Вместо вывода 1-10 код распечатывает бесконечный список цифр 1. Нажмите красную кнопку Stop для прекращения работы программы.

Очевидно, что здесь есть ошибка (жучок). Первый вопрос: что происходит с $counter? Для ответа на этот вопрос остановите выполнение кода на строках 7 и 11. Первая остановка позволяет увидеть значение $counter перед вызовом increment(); последняя остановка позволяет увидеть, что передается в качестве аргумента и что происходит с локальной переменной $i. Для установки точки прерывания на строке 7 поместите курсор в эту строку, а затем выберите Debug > Add/Remove Breakpoint. Строка 7 должна выделиться красным цветом, который указывает точку прерывания. Сделайте то же самое для строки 11. Если хотите увидеть список ваших точек прерывания, перейдите на вкладку Breakpoints окна Debug внизу. На рисунке 6 показано окно IDE после установки точек прерывания.

Рисунок 6. Установка точек прерывания в примере кода
Рисунок 6. Установка точек прерывания в примере кода

Затем нажмите кнопку Play для перезапуска приложения. Выполнение начинается и сразу останавливается на строке 7. В панели Debug Output (справа) содержится некоторая выходная информация, а на вкладке Variables окна Debug показан список переменных. Массивы отмечаются квадратными скобками ([]); простые скалярные величины отмечаются синими кружками. Вы должны увидеть, что $counter = (int) 1.

Теперь нажмите синюю стрелку вниз на инструментальной панели для выполнения одного оператора в функции (сравните ее действие с синей правой стрелкой и черточкой, которая вызывает функцию и останавливает выполнение на следующем после вызова функции операторе). Теперь курсор должен находиться в строке 11, а на вкладке Variables должна отображаться только одна переменная: формальный аргумент $i = (int) 1. Пока все хорошо.

Снова нажмите стрелку вниз для прохода строки 11. $i теперь равна 2. Перейдите на вкладку Stack в окне Debug. На рисунке 7 изображена эта ситуация.

Рисунок 7. Стек обратной трассировки
Рисунок 7. Стек обратной трассировки

Снова нажмите стрелку вниз для возврата в строку 5. Удивительно, но значение $counter все еще равно 1 - в этом и состоит первая ошибка. Функция increment() должна вызываться по ссылке, а не по значению. Это легко исправить. Просто измените вызов функции на increment( &$counter ).

Нажмите кнопку Stop, а затем опять кнопку Play. Пошагово выполните программу и увидите 1, 2, 3, . . . 8, 9. Что произошло с 10? Ответ очевиден: это ошибка диапазона ("off-by-one error"). Просто измените < на <=. Возникновение этой ошибки можно увидеть, если удалить две предыдущие точки прерывания и установить новую точку в строке 4.

Хотя пример немного надуманный, тем не менее он демонстрирует несколько фундаментальных приемов интерактивной отладки:

  • Пошагово выполняйте программу для контроля значений переменных и обнаружения места, где они становятся неправильными.
  • Если функция вызывается из нескольких мест, используйте стек обратной трассировки для определения конкретной вызывающей последовательности. Часто можно проследить источник ошибки обратно до вызывающей стороны, передавшей аргумент неправильного типа, неправильное число аргументов или с несоответствием порядка реальных и формальных аргументов. Можно также развернуть элемент в стеке обратной трассировки (нажмите маленькую стрелку вправо, расположенную слева от имени) для просмотра значений формальных аргументов функции.
  • Используйте точки прерывания для остановки выполнения. Например, если код функции находится под подозрением, поместите точку прерывания в первом операторе функции, дождитесь остановки выполнения, просмотрите стек обратной трассировки и в пошаговом режиме выполните функцию для обнаружения ошибки.
  • Используйте закладку Variables в окне Debug для контроля переменных рабочей среды, глобальных и локальных переменных.

Для более полного изучения Zend Studio используйте IDE (по крайней мере, временно) при написании PHP-кода и пройдитесь по всем вкладкам. Вы обнаружите множество функциональных возможностей. Даже если вы будете редактировать код в другой программе, все равно можно использовать Zend Studio для отладки классов, методов и модульных тестов. Написание последних в IDE особенно полезно.


Отладка вашего PHP-приложения

Конечно, настоящая ценность PHP-отладчика проявляется при работе с Web-приложением в режиме реального времени. Вот пример такого сценария.

Приготовление приложения pizza

В листингах 2 и 3 приведено простое PHP-приложение с классом, методами и некоторым кодом-оболочкой (wrapper). Приложение index.php, показанное в листинге 2 , создает заказы на пиццу, используя класс Pizza (показанный в листинге 3) для вычисления стоимости каждой пиццы. Код несложен, но его здесь достаточно, поскольку он содержит несколько ошибок. Одна очевидна - все пиццы имеют одну цену, независимо от количества ингредиентов начинки. Вторая - один и тот же ингредиент не должен подсчитываться дважды.

Листинг 2. Приложение index.php для заказа пиццы
<?php
    include_once( 'pizza.class.php' );
    
    $large = new Pizza( 'L', null );
    echo $large->price() . '<br />';
    
    $toppings = array();
    $toppings[] = 'pepperoni';
    $toppings[] = 'sausage';
    $xl = new Pizza( 'XL', $toppings );
    echo $xl->price() . '<br />';
    
    $special = new Pizza( 'XL' );
    $special->add( null );
    $special->add( 'pepperoni' );   
    $special->add( 'pepperoni' );   
    $special->add( 'anchovies' );   
    $special->add( 'anchovies' );
    $special->add( 'olives' );
    echo $special->price() . '<br />';
?>
Листинг 3. Очень вкусный класс Pizza
<?php
    class Pizza {
        var $size;
        var $toppings = array();
        var $price;
        
        function Pizza( $size = "R", $toppings = null ) {
            $this->size = $size;
            $this->toppings = $toppings; 
        }
        
        function size() {
            return( $this->size );
        }
        
        function price() {
            $this->price = 10;
            $multiplier = 1;
            
            switch ( $this->size ) {
                case 'L': 
                    $multiplier = 1.25;
                    break;
                case 'XL':
                    $multiplier = 2;
                    break;
            }
            
            $this->price = $this->price + 
                ( sizeof( $this->toppings() ) ) * $multipler;
                
            return( $this->price );
        }
        
        function toppings() {
            return( $this->toppings );
        }
        
        function add( $topping ) {
            $this->toppings[] = $topping;
        }
    }
?>

Для создания проекта:

  1. Откройте Zend Studio и создайте новый проект, выбрав Project > New Project.
  2. Назовите проект pizza (как показано на рисунке 8), а затем нажмите кнопку Next.
    Рисунок 8. Создание нового проекта pizza
    Рисунок 8. Создание нового проекта pizza

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

  3. Нажмите кнопку Add path, перейдите в ваш личный каталог Sites, а затем нажмите кнопку New Folder (третья кнопка вверху справа).
  4. Введите имя pizza, щелкните кнопкой мыши на этой записи (как показано на рисунке 9) и нажмите кнопку Add.
    Рисунок 9. Создание новой папки для исходного кода
    Рисунок 9. Создание новой папки для исходного кода
    Окно мастера теперь должно выглядеть примерно так, как показано на рисунке 10.
    Рисунок 10. В проекте теперь есть одна папка для исходного кода
    Рисунок 10. В проекте теперь есть одна папка для исходного кода
  5. Нажмите кнопку Next.

    Следующий набор настроек указывает, как подключаться к (отладочному) Web-серверу.

  6. Снимите отметку с флажка Use System Defaults и введите URL вашего приложения, который может быть равен localhost/~username/pizza/index.php, если вы работаете с данным руководством в системе Mac OS X (или просто localhost/pizza/index.php, например, если вы используете Linux® для вашего сервера и Mac OS X для Zend Studio). Эти настройки показаны на рисунке 11.
    Рисунок 11. Настройка URL для проекта
    Рисунок 11. Настройка URL для проекта
  7. Нажмите кнопку Finish.

    Теперь в окне Project должна появиться папка pizza.

  8. Для продолжения дважды выберите File > New File.
  9. Скопируйте (или лучше введите) листинг 2 и сохраните текст в новый файл index.php в каталоге pizza файловой системы.
  10. Введите текст листинга 3 и сохраните его под названием Pizza.class.php в папке pizza.
  11. Разверните папку в панели Project для просмотра двух PHP-файлов.
    Рисунок 12. Развернутая папка проекта
    Рисунок 12. Развернутая папка проекта

Что с моим исходным кодом?

Все готово для отладки приложения. Нажмите кнопку Play: приложение запускается и выводимая им информация отображается в панели Debug Output. Она выглядит примерно так:

Content-type: text/html
10<br />10<br />10<br />

Почему все три пиццы по $10? Если вы посмотрите на панель Debug Messages, ответ очевиден: переменная $multipler не определена, поскольку это опечатка. Она должна быть записана как $multiplier.

Эту ошибку можно обнаружить также другим способом, когда она не так очевидна (как это обычно и бывает). Выполните двойной щелчок левой кнопкой мыши на файле Pizza.class.php проекта, поместите курсор в строку 29 и выберите Debug > Add/Remove Breakpoint. Строка становится розовой. Выполните двойной щелчок левой кнопкой мыши на index.php и нажмите кнопку Play. Выполнение прерывается на строке 29. Если посмотреть на окно Debug, значение $this->price пока правильное, как и значение $multiplier. Так в чем же дело? Нажмите стрелку вниз для выполнения одного оператора и увидите, что цена не изменилась. Ага! Опечатка. Исправьте ее, повторно запустите приложение, и цена каждой пиццы должна измениться.

В качестве упражнения выполните с помощью IDE пошаговый проход через другую ошибку - логическую ошибку, которая может вызвать завышение цены. Очистите все точки прерывания, затем в index.php установите точку прерывания в строке 14. Установите также точки прерывания на функциях toppings() и add(), чтобы увидеть, что происходит с объектом Pizza. На рисунке 13 показано, как выглядит объект во время подсчета цены.

Рисунок 13. Неправильная пицца
Рисунок 13. Неправильная пицца

Чтобы исправить ошибку, запретите значение null в качестве допустимой начинки (на самом деле ошибка заключается в index.php, но вы можете добавить "защиту от дурака" в функцию add()) и удалите дублирование в функции начинок. Следующий код решает эти проблемы.

        function toppings() {
            if ( is_array( $this->toppings ) ) {
                return( array_unique( $this->toppings ) );
            }
            
            return( 0 );
        }
        
        function add( $topping ) {
            if ( ! is_null( $topping ) ) {
                $this->toppings[] = $topping;
            }
        }

Подключение к браузеру

В качестве последнего упражнения загрузите приложение в браузер и выполните его отладку в IDE. Это типичный сценарий: просмотр вывода в браузере, взаимодействие с Web-страницами, пошаговое выполнение приложения для проверки его реакции:

  1. Выберите Debug > Debug URL.

    Возможно, что настроек по умолчанию достаточно. Если нет, установите поле Open Browser At в значение URL файла index.php. Для данного примера (поскольку все программное обеспечение выполняется на Mac) выберите Local files, if available.

  2. Нажмите кнопку OK.

    Браузер открывает URL, указанный в поле Open Browser At (с длинным списком параметров для настройки отладчика на данный сеанс отладки). Браузер поначалу пуст, потому что IDE остановила выполнение в самом начале приложения.

  3. Перейдите в IDE и поместите курсор в первую строку index.php прямо на оператор включения файла классов. Можно пошагово выполнить приложение, как вы это делали ранее.

Если бы приложение имело формы, можно было бы установить точку прерывания в обработчике формы и просмотреть входные параметры. В окне Debug доступны все глобальные переменные рабочей среды, глобальные переменные PHP и параметры каждого запроса Web-сервера.

По окну Debug URL определите момент, когда приложение остановится в отладчике. Обычно Web-приложение на PHP содержится в одном каталоге, а главная страница называется index.php. Ссылки на этой "домашней" странице указывают на другие PHP-страницы, которые инкапсулируют функциональность. Например, URL .../store/index.php может представлять домашнюю страницу интерактивного магазина, а URL .../store/cart/index.php может реализовывать корзину покупок.

Можно настроить Zend Studio на отладку одной, нескольких или всех PHP-страниц, расположенных в отдельном корневом каталоге приложения. Например, если в корзине покупок есть ошибки, можно загрузить сеанс отладки при открытии любой страницы в cart/. Можно также просто начать сеанс при загрузке основной страницы index.php и отладить приложение полностью.

А лучше всего скомбинировать Zend Studio, Internet Explorer® или Mozilla Firefox и Zend Debugger Browser Toolbar для загрузки сеанса отладки непосредственно из браузера. Можно отлаживать текущую страницу, все страницы сайта или работу одной формы.


Новый способ работы

Интерактивный отладчик похож на маленькую лампочку, включающуюся у вас над головой. Задачи, требующие трудоемкой диагностики на каждом шаге работы функции, неожиданно становятся простыми - установите точку прерывания, выполните столько кода, сколько понадобится, и наблюдайте, что происходит в это время в каждом операторе. Держите записную книжку наготове и отмечайте причины и следствия, данные наблюдений и гипотезы.

Zend Studio - это не единственный возможный отладчик. Попробуйте другие и найдите тот, который наилучшим образом соответствует вашему стилю работы. Вы будете удивляться, как раньше обходились без отладчика.

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source
ArticleID=391638
ArticleTitle=Исправление ошибок в PHP-приложениях при помощи Zend Debugger
publish-date=05252009