text: <?php
  /*
   * This file is part of sebastian/environment.
   *
   * (c) Sebastian Bergmann <sebastian@phpunit.de>
   *
   * For the full copyright and license information, please view the LICENSE
   * file that was distributed with this source code.
   */
  
  declare(strict_types=1);
  
  namespace SebastianBergmann\Environment;
  
  /**
   * Utility class for HHVM/PHP environment handling.
   */
  final class Runtime
  {
      /**
       * @var string
       */
      private static $binary;
  
      /**
       * Returns true when Xdebug is supported or
       * the runtime used is PHPDBG.
       */
      public function canCollectCodeCoverage(): bool
      {
          return $this->hasXdebug() || $this->hasPHPDBGCodeCoverage();
      }
  
      /**
       * Returns true when OPcache is loaded and opcache.save_comments=0 is set.
       *
       * Code taken from Doctrine\Common\Annotations\AnnotationReader::__construct().
       */
      public function discardsComments(): bool
      {
          if (\extension_loaded('Zend Optimizer+') && (\ini_get('zend_optimizerplus.save_comments') === '0' || \ini_get('opcache.save_comments') === '0')) {
              return true;
          }
  
          if (\extension_loaded('Zend OPcache') && \ini_get('opcache.save_comments') == 0) {
              return true;
          }
  
          return false;
      }
  
      /**
       * Returns the path to the binary of the current runtime.
       * Appends ' --php' to the path when the runtime is HHVM.
       */
      public function getBinary(): string
      {
          // HHVM
          if (self::$binary === null && $this->isHHVM()) {
              // @codeCoverageIgnoreStart
              if ((self::$binary = \getenv('PHP_BINARY')) === false) {
                  self::$binary = PHP_BINARY;
              }
  
              self::$binary = \escapeshellarg(self::$binary) . ' --php' .
                  ' -d hhvm.php7.all=1';
              // @codeCoverageIgnoreEnd
          }
  
          if (self::$binary === null && PHP_BINARY !== '') {
              self::$binary = \escapeshellarg(PHP_BINARY);
          }
  
          if (self::$binary === null) {
              // @codeCoverageIgnoreStart
              $possibleBinaryLocations = [
                  PHP_BINDIR . '/php',
                  PHP_BINDIR . '/php-cli.exe',
                  PHP_BINDIR . '/php.exe'
              ];
  
              foreach ($possibleBinaryLocations as $binary) {
                  if (\is_readable($binary)) {
                      self::$binary = \escapeshellarg($binary);
                      break;
                  }
              }
              // @codeCoverageIgnoreEnd
          }
  
          if (self::$binary === null) {
              // @codeCoverageIgnoreStart
              self::$binary = 'php';
              // @codeCoverageIgnoreEnd
          }
  
          return self::$binary;
      }
  
      public function getNameWithVersion(): string
      {
          return $this->getName() . ' ' . $this->getVersion();
      }
  
      public function getName(): string
      {
          if ($this->isHHVM()) {
              // @codeCoverageIgnoreStart
              return 'HHVM';
              // @codeCoverageIgnoreEnd
          }
  
          if ($this->isPHPDBG()) {
              // @codeCoverageIgnoreStart
              return 'PHPDBG';
              // @codeCoverageIgnoreEnd
          }
  
          return 'PHP';
      }
  
      public function getVendorUrl(): string
      {
          if ($this->isHHVM()) {
              // @codeCoverageIgnoreStart
              return 'http://hhvm.com/';
              // @codeCoverageIgnoreEnd
          }
  
          return 'https://secure.php.net/';
      }
  
      public function 