Статьи

Скажи привет Борису: лучший ответ для PHP

Как веб-разработчики, мы знаем, насколько важна консоль JavaScript, предоставляемая браузером, для тестирования фрагментов кода. Нам не нужно писать целую HTML-страницу и код JavaScript только для проверки функционирования или логики небольшой подпрограммы, которую мы написали. Вместо этого мы просто запускаем выражения в консоли и сразу видим результаты.

Аналогично, REPL (цикл чтения-Eval-Print) — это консоль языка программирования, на которой мы можем построчно писать код и смотреть, что он делает. PHP имеет REPL; если вы еще не использовали его, запустите php –a Это приведет вас к интерактивной подсказке PHP, в которой вы сможете ввести свой код.

  $ php -a
 Интерактивная оболочка

 php> echo "Hello REPL";
 Привет REPL 

Все REPL на языке программирования работают практически одинаково. Существует бесконечный цикл, который по сути обрабатывает три задачи: задачу чтения, которая считывает выражение, введенное в приглашении, функцию eval, которая анализирует и выполняет выражение, и функцию печати для отображения результатов действия.

REPL PHP очень хорош в том, что он делает, хотя у него есть некоторые ограничения. Например, он не очень хорошо обрабатывает ошибки; REPL выходит обратно на консоль всякий раз, когда происходит фатальное событие. Другой недостаток PHP по умолчанию REPL по сравнению с другими языками — это то, что он не выводит результат выражения на консоль; мы должны явно сказать ему, чтобы повторить или напечатать результат. Большинство других REPL всегда выводят результат выражения на консоль.

Итак, Борис пытается решить и эти проблемы, и другие проблемы. Boris — это крошечная библиотека PHP REPL, написанная на PHP Крисом Корбином . Он обрабатывает фатальные ошибки более эффективно, так как не будет выходить из консоли при возникновении ошибки. Вместо этого он сообщает подробности ошибки и трассировки стека в консоли. Борис также выводит результаты оценки выражения.

Установка

Boris размещен на GitHub, поэтому его легко установить с помощью Git. Обратите внимание, что Борису требуется расширение PCNTL, поэтому, если оно еще не доступно на вашем компьютере, вы можете выполнить эти шаги, чтобы установить его. Затем клонируйте Бориса на свою машину.

  $ git clone git: //github.com/d11wtq/boris.git 

Это клонирует всю библиотеку Boris в новый каталог boris (Также можно установить Boris с помощью Composer, о чем я вам расскажу позже.)

Чтобы начать использовать Борис, войдите в каталог и запустите скрипт.

  $ cd boris
 $ ./bin/boris 

Это приведет вас к подсказке Бориса. Как и в стандартном приглашении PHP, мы можем ввести здесь код и запустить. Давайте попробуем несколько простых выражений.

  [1] boris> $ timezone = new DateTimeZone ("America / New_York");
 → объект (DateTimeZone) # 5 (0) {
 }

 [2] boris> $ date = new DateTime ("сейчас", $ часовой пояс);
 → объект (DateTime) # 6 (3) {
   [ "Дата"] =>
   string (19) "2013-03-29 23:56:25"
   [ "Timezone_type"] =>
   Int (3)
   [ "Часовой пояс"] =>
   Строка (16) "Америка / Нью-Йорк"
 } 

Результат выражения всегда возвращается обратно в консоль, что помогает нам проверять значения / объекты сразу после их создания.

Для более легкого доступа вы можете добавить путь к сценарию Boris в вашем .bashrc После этого вы сможете запускать boris

  экспорт PATH = "путь / к / boris / bin: $ PATH" 

Кастомизация Бориса

Важной особенностью Бориса является возможность настраивать его функции. Если вы посмотрите на содержимое файла ./bin/borisBoris Мы можем изменить приглашение по умолчанию, передав его в конструктор.

 $boris = new BorisBoris('app $ ');
$boris->start();

Но настройка не ограничивается только подсказкой. Мы также можем определить некоторые переменные по умолчанию, которые будут доступны внутри REPL, например:

 $boris->setLocal("myVar", "Value");

Затем мы можем обратиться к значению с помощью $myVar

По умолчанию Борис показывает результаты с помощью var_dump() Если вы предпочитаете какой-то другой формат, создайте класс, который реализует интерфейс Inspectorinspect()

 class MyInspector implements Inspector {
    public function inspect($variable) {
        ob_start();
        print_r($variable);
        return trim(ob_get_clean());
    }
}

$boris->setInspector(new MyInspector());

Ответ в вашей заявке

Boris легко может быть встроен в ваше автономное PHP-приложение или библиотеку. В качестве примера давайте создадим клиент веб-службы командной строки, используя Boris и Guzzle. Guzzle — мощная библиотека для создания клиентов веб-сервисов, предоставляющая простой интерфейс для программных запросов API.

Сначала создайте файл composer.json

 {
    "require": {
        "d11wtq/boris": "dev-master",
        "guzzle/guzzle": "~3.1"
    }
}

Затем установите эти зависимости с помощью Composer. Это позволит загрузить Boris, Guzzle и их зависимости в папку vendor

  $ composer.phar install 

Затем создайте исполняемый скрипт (я назвал его wsclient

 #!/usr/bin/env php
<?php
// composer autoloader
require "vendor/autoload.php";
use GuzzleHttpClient;

// Initialize Boris with our own prompt.
$boris = new BorisBoris("wsclient > ");

// Guzzle client with our API base URL
$client = new Client("http://myapplication/api");

// We don't want to create the Client object every time.
$boris->setLocal("client", $client);

// Default inspectors are bit noisy. Let's override that.
$boris->setInspector(new GuzzleInspector());

// Start the REPL
$boris->start();

Мы включили автозагрузчик, предоставленный Composer, который упрощает работу. Затем мы инициализировали Бориса и явно создали клиент Guzzle для нашего веб-сервиса, чтобы нам не приходилось делать это снова и снова. Клиентский объект делается доступным внутри REPL, устанавливая его как локальную переменную с помощью setLocal() Мы не заинтересованы в проверке переменных и объектов здесь, поэтому мы переопределили инспектор по умолчанию с помощью GuzzleInspctor Вы можете создать тот, который поможет вам отлаживать ответы с сервера, но тот, который я создал для примера, выглядит следующим образом:

 <?php
class GuzzleInspector implements BorisInspector
{
    public function inspect($var) {
        ob_start();
        echo (bool) $var;
        return trim(ob_get_clean());
    }
}

Сделайте скрипт исполняемым, а затем запустите REPL и попробуйте некоторые вещи.

  $ chmod + x wsclient
 $ ./wsclient

 [1] wsclient> $ request = $ client-> get ("/ user") -> setAuth ("user", "pass");
  → правда
 [2] wsclient> $ response = $ request-> send ();
  → правда
 [3] wsclient> echo $ response-> getBody ();
 // { "Войти": "пользователь", "идентификатор": 123000, "avatar_url":»... 

Вывод

Мне не нужно объяснять реальную силу REPL, если вы когда-либо использовали Python, Ruby, Scala, OCaml или любой другой язык, который предлагает такой. REPL является отличным инструментом при первом изучении языка, а также при тестировании и отладке различных фрагментов кода.

Как и многие другие основные языки, PHP имеет REPL, но у него есть некоторые недостатки, особенно в обработке ошибок. Борис — крошечная библиотека, которая пытается заполнить свой пробел. Что еще интереснее, вы можете легко создать CLI для своих приложений, используя Boris.

Хотя Борис действительно крутой и иногда очень полезный, у него тоже есть свои ограничения. Борис зависит от разветвленности операционной системы, поэтому ее нельзя использовать в Windows. Кроме того, на данный момент это не пуленепробиваемое приложение. Есть некоторые проблемы, которые необходимо исправить, и некоторые другие функции, такие как автозаполнение имен функций и методов классов, были бы полезны.

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

Изображение через Fotolia