Класс PhpToken

(PHP 8)

Введение

Этот класс предоставляет альтернативу функции token_get_all(). Тогда как функция возвращает токены либо в виде односимвольной строки, либо в виде массива с идентификатором токена, его текстом и номером строки, PhpToken::tokenize() нормализует все токены в объекты PhpToken, что позволяет гораздо более удобно работать с токенами.

Обзор классов

class PhpToken {
/* Свойства */
public int $id;
public string $text;
public int $line;
public int $pos;
/* Методы */
final public __construct(
    int $id,
    string $text,
    int $line = -1,
    int $pos = -1
)
public getTokenName(): ?string
public is(int|string|array $kind): bool
public isIgnorable(): bool
public __toString(): string
public static tokenize(string $code, int $flags = 0): array
}

Свойства

id

Одна из констант T_*, или символ ASCII, представляющий односимвольный токен.

text

Текстовое содержимое токена.

line

Номер строки (начиная с 1), с которой начинается токен.

pos

Начальная позиция (начиная с 0) токена в строке.

Содержание

  • PhpToken::__construct — Создаёт объект PhpToken
  • PhpToken::getTokenName — Возвращает имя токена
  • PhpToken::is — Проверяет, соответствует ли токен указанному типу
  • PhpToken::isIgnorable — Сообщает, будет ли токен игнорироваться парсером PHP
  • PhpToken::__toString — Возвращает текстовое содержимое токена
  • PhpToken::tokenize — Разбирает заданную строку, содержащую программу на PHP, на массив объектов PhpToken
add a note add a note

User Contributed Notes 1 note

up
0
info at ensostudio dot ru
5 days ago
<?php
/**
* PhpToken polyfill.
*/
class PhpToken
{
   
/**
     * @var int Identifier
     */
   
public $id;

   
/**
     * @var string The textual content of the token
     */
   
public $text;

   
/**
     * @var int The starting line number (1-based) of the token
     */
   
public $line;

   
/**
     * @var int The starting position (0-based) in the tokenized string
     */
   
public $pos;

   
/**
     * Creates a new instance.
     *
     * @param int|string $id `T_*` constant or an ASCII codepoint representing a single-char token
     * @param string $text The textual content of the token
     * @param int $line The starting line number (1-based) of the token
     * @param int $position The starting position (0-based) in the tokenized string
     * @return void
     */
   
public function __construct($id, $text, $line = -1, $position = -1)
    {
       
$this->id = is_int($id) ? $id : ord($id);
       
$this->text = $text;
       
$this->line = $line;
       
$this->pos = $position;
    }
   
   
/**
     * Returns the name of the token.
     *
     * @return string|null
     */
   
public function getTokenName()
    {
       
$name = token_name($this->id);
        return
$name === 'UNKNOWN' ? null : $name;
    }

   
/**
     * Tells whether the token is of given kind.
     *
     * @param int|string|array $kind Either a single value to match the token's id or textual content, or an array
     *     thereof
     * @return bool
     */
   
public function is($kind)
    {
       
$token = (is_int($kind) || (is_array($kind) && is_int(current($kind))))
            ?
$this->id
           
: $this->getTokenName();
        return
in_array($token, (array) $kind, true);
    }

   
/**
     * Tells whether the token would be ignored by the PHP parser.
     *
     * @return bool
     */
   
public function isIgnorable()
    {
        return
$this->is([T_WHITESPACE, T_COMMENT, T_DOC_COMMENT, T_INLINE_HTML]);
    }

   
/**
     * Returns the textual content of the token.
     *
     * @return string
     */
   
public function __toString()
    {
        return (string)
$this->text;
    }

   
/**
     * Splits given source into PHP tokens, represented by self objects.
     *
     * @param string $code The PHP source to parse
     * @param int $flags `TOKEN_PARSE` - recognises the ability to usereserved words in specific contexts
     * @return static[]
     */
   
public static function tokenize($code, $flags = 0): array
    {
       
$tokens = [];
       
$line = 1;
       
$position = 0;
        foreach (
token_get_all($code, $flags) as $token) {
            if (
is_string($token)) {
               
$id = $token;
               
$text = $token;
            } else {
                if (
$token[2] !== $line) {
                   
$position = 0;
                }
                list(
$id, $text, $line) = $token;
            }
           
$tokens[] = new static($id, $text, $line, $position);
           
$position += strlen($text);
        }
        return
$tokens;
    }
}
?>
To Top