如何修复PHP中Syntax error, unexpected 'TokenType' (T_STRING)错误?
问题分析与解决方案
错误原因
你遇到的Parse error: syntax error, unexpected 'TokenType'错误,核心原因是PHP版本不支持原生枚举:
enum是PHP 8.1才正式引入的语法特性,若你的AMPPS环境中PHP版本低于8.1,解释器无法识别enum关键字,会把TokenType当作意外的字符串,触发语法错误。- 顺带提一个小问题:你的include语句末尾缺少分号,规范写法应为:
<?php include 'TokenType.php'; ?>
虽然这个小问题不会直接导致当前错误,但建议修正以符合PHP语法规范。
解决错误的步骤
- 升级PHP版本:将AMPPS中的PHP版本升级到8.1或更高版本,原生枚举语法即可正常工作。
- 修正include语句:添加缺失的分号,避免潜在的语法问题。
PHP中声明枚举的替代方案(针对PHP 8.1以下版本)
由于PHP 8.1之前没有原生枚举,可通过以下方式模拟枚举行为:
1. 类常量模拟(最简单的方案)
用类常量定义枚举值,通过类名访问:
class TokenType { const INT = 'INT'; const STRING = 'STRING'; const COMMA = 'COMMA'; // 禁止实例化类 private function __construct() {} }
使用示例:
$type = TokenType::INT;
2. 抽象类+单例实例模拟(接近原生枚举的行为)
通过单例模式确保每个枚举值是唯一实例,更贴近原生枚举的类型安全特性:
abstract class TokenType { private string $value; public const INT = self::class . ':INT'; public const STRING = self::class . ':STRING'; public const COMMA = self::class . ':COMMA'; private static array $instances = []; private function __construct(string $value) { $this->value = $value; } public static function get(string $type): self { if (!isset(self::$instances[$type])) { self::$instances[$type] = new static($type); } return self::$instances[$type]; } public function getValue(): string { return $this->value; } }
使用示例:
$intToken = TokenType::get(TokenType::INT); echo $intToken->getValue(); // 输出 "TokenType:INT"
3. SplEnum扩展实现(需安装扩展)
利用PHP标准库的SplEnum扩展(需在php.ini中启用extension=splenum):
class TokenType extends SplEnum { const __default = self::INT; const INT = 1; const STRING = 2; const COMMA = 3; }
使用示例:
$token = new TokenType(TokenType::STRING);
内容的提问来源于stack exchange,提问作者Luis Pichardo
相关产品推荐
相关产品推荐

